Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/log-utils.h

Issue 7535004: Merge bleeding edge up to 8774 into the GC branch. (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/gc/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/log-inl.h ('k') | src/log-utils.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 15 matching lines...) Expand all
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 #ifndef V8_LOG_UTILS_H_ 28 #ifndef V8_LOG_UTILS_H_
29 #define V8_LOG_UTILS_H_ 29 #define V8_LOG_UTILS_H_
30 30
31 #include "allocation.h" 31 #include "allocation.h"
32 32
33 namespace v8 { 33 namespace v8 {
34 namespace internal { 34 namespace internal {
35 35
36 #ifdef ENABLE_LOGGING_AND_PROFILING
37
38 class Logger; 36 class Logger;
39 37
40 // A memory buffer that increments its size as you write in it. Size
41 // is incremented with 'block_size' steps, never exceeding 'max_size'.
42 // During growth, memory contents are never copied. At the end of the
43 // buffer an amount of memory specified in 'seal_size' is reserved.
44 // When writing position reaches max_size - seal_size, buffer auto-seals
45 // itself with 'seal' and allows no further writes. Data pointed by
46 // 'seal' must be available during entire LogDynamicBuffer lifetime.
47 //
48 // An instance of this class is created dynamically by Log.
49 class LogDynamicBuffer {
50 public:
51 LogDynamicBuffer(
52 int block_size, int max_size, const char* seal, int seal_size);
53
54 ~LogDynamicBuffer();
55
56 // Reads contents of the buffer starting from 'from_pos'. Upon
57 // return, 'dest_buf' is filled with the data. Actual amount of data
58 // filled is returned, it is <= 'buf_size'.
59 int Read(int from_pos, char* dest_buf, int buf_size);
60
61 // Writes 'data' to the buffer, making it larger if necessary. If
62 // data is too big to fit in the buffer, it doesn't get written at
63 // all. In that case, buffer auto-seals itself and stops to accept
64 // any incoming writes. Returns amount of data written (it is either
65 // 'data_size', or 0, if 'data' is too big).
66 int Write(const char* data, int data_size);
67
68 private:
69 void AllocateBlock(int index) {
70 blocks_[index] = NewArray<char>(block_size_);
71 }
72
73 int BlockIndex(int pos) const { return pos / block_size_; }
74
75 int BlocksCount() const { return BlockIndex(max_size_) + 1; }
76
77 int PosInBlock(int pos) const { return pos % block_size_; }
78
79 int Seal();
80
81 int WriteInternal(const char* data, int data_size);
82
83 const int block_size_;
84 const int max_size_;
85 const char* seal_;
86 const int seal_size_;
87 ScopedVector<char*> blocks_;
88 int write_pos_;
89 int block_index_;
90 int block_write_pos_;
91 bool is_sealed_;
92 };
93
94
95 // Functions and data for performing output of log messages. 38 // Functions and data for performing output of log messages.
96 class Log { 39 class Log {
97 public: 40 public:
98
99 // Performs process-wide initialization. 41 // Performs process-wide initialization.
100 void Initialize(); 42 void Initialize();
101 43
102 // Disables logging, but preserves acquired resources. 44 // Disables logging, but preserves acquired resources.
103 void stop() { is_stopped_ = true; } 45 void stop() { is_stopped_ = true; }
104 46
105 // Frees all resources acquired in Initialize and Open... functions. 47 // Frees all resources acquired in Initialize and Open... functions.
106 void Close(); 48 // When a temporary file is used for the log, returns its stream descriptor,
107 49 // leaving the file open.
108 // See description in include/v8.h. 50 FILE* Close();
109 int GetLogLines(int from_pos, char* dest_buf, int max_size);
110 51
111 // Returns whether logging is enabled. 52 // Returns whether logging is enabled.
112 bool IsEnabled() { 53 bool IsEnabled() {
113 return !is_stopped_ && (output_handle_ != NULL || output_buffer_ != NULL); 54 return !is_stopped_ && output_handle_ != NULL;
114 } 55 }
115 56
116 // Size of buffer used for formatting log messages. 57 // Size of buffer used for formatting log messages.
117 static const int kMessageBufferSize = v8::V8::kMinimumSizeForLogLinesBuffer; 58 static const int kMessageBufferSize = 2048;
59
60 // This mode is only used in tests, as temporary files are automatically
61 // deleted on close and thus can't be accessed afterwards.
62 static const char* kLogToTemporaryFile;
118 63
119 private: 64 private:
120 explicit Log(Logger* logger); 65 explicit Log(Logger* logger);
121 66
122 // Opens stdout for logging. 67 // Opens stdout for logging.
123 void OpenStdout(); 68 void OpenStdout();
124 69
125 // Opens file for logging. 70 // Opens file for logging.
126 void OpenFile(const char* name); 71 void OpenFile(const char* name);
127 72
128 // Opens memory buffer for logging. 73 // Opens a temporary file for logging.
129 void OpenMemoryBuffer(); 74 void OpenTemporaryFile();
130 75
131 // Implementation of writing to a log file. 76 // Implementation of writing to a log file.
132 int WriteToFile(const char* msg, int length) { 77 int WriteToFile(const char* msg, int length) {
133 ASSERT(output_handle_ != NULL); 78 ASSERT(output_handle_ != NULL);
134 size_t rv = fwrite(msg, 1, length, output_handle_); 79 size_t rv = fwrite(msg, 1, length, output_handle_);
135 ASSERT(static_cast<size_t>(length) == rv); 80 ASSERT(static_cast<size_t>(length) == rv);
136 USE(rv); 81 USE(rv);
137 fflush(output_handle_); 82 fflush(output_handle_);
138 return length; 83 return length;
139 } 84 }
140 85
141 // Implementation of writing to a memory buffer.
142 int WriteToMemory(const char* msg, int length) {
143 ASSERT(output_buffer_ != NULL);
144 return output_buffer_->Write(msg, length);
145 }
146
147 bool write_to_file_;
148
149 // Whether logging is stopped (e.g. due to insufficient resources). 86 // Whether logging is stopped (e.g. due to insufficient resources).
150 bool is_stopped_; 87 bool is_stopped_;
151 88
152 // When logging is active, either output_handle_ or output_buffer_ is used 89 // When logging is active output_handle_ is used to store a pointer to log
153 // to store a pointer to log destination. If logging was opened via OpenStdout 90 // destination. mutex_ should be acquired before using output_handle_.
154 // or OpenFile, then output_handle_ is used. If logging was opened
155 // via OpenMemoryBuffer, then output_buffer_ is used.
156 // mutex_ should be acquired before using output_handle_ or output_buffer_.
157 FILE* output_handle_; 91 FILE* output_handle_;
158 92
159 // Used when low-level profiling is active. 93 // Used when low-level profiling is active.
160 FILE* ll_output_handle_; 94 FILE* ll_output_handle_;
161 95
162 LogDynamicBuffer* output_buffer_;
163
164 // Size of dynamic buffer block (and dynamic buffer initial size).
165 static const int kDynamicBufferBlockSize = 65536;
166
167 // Maximum size of dynamic buffer.
168 static const int kMaxDynamicBufferSize = 50 * 1024 * 1024;
169
170 // Message to "seal" dynamic buffer with.
171 static const char* const kDynamicBufferSeal;
172
173 // mutex_ is a Mutex used for enforcing exclusive 96 // mutex_ is a Mutex used for enforcing exclusive
174 // access to the formatting buffer and the log file or log memory buffer. 97 // access to the formatting buffer and the log file or log memory buffer.
175 Mutex* mutex_; 98 Mutex* mutex_;
176 99
177 // Buffer used for formatting log messages. This is a singleton buffer and 100 // Buffer used for formatting log messages. This is a singleton buffer and
178 // mutex_ should be acquired before using it. 101 // mutex_ should be acquired before using it.
179 char* message_buffer_; 102 char* message_buffer_;
180 103
181 Logger* logger_; 104 Logger* logger_;
182 105
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 // Write the log message to the log file currently opened. 140 // Write the log message to the log file currently opened.
218 void WriteToLogFile(); 141 void WriteToLogFile();
219 142
220 private: 143 private:
221 144
222 Log* log_; 145 Log* log_;
223 ScopedLock sl; 146 ScopedLock sl;
224 int pos_; 147 int pos_;
225 }; 148 };
226 149
227 #endif // ENABLE_LOGGING_AND_PROFILING
228
229 } } // namespace v8::internal 150 } } // namespace v8::internal
230 151
231 #endif // V8_LOG_UTILS_H_ 152 #endif // V8_LOG_UTILS_H_
OLDNEW
« no previous file with comments | « src/log-inl.h ('k') | src/log-utils.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698