33
33
namespace v8 {
34
34
namespace internal {
35
35
36
- LogDynamicBuffer::LogDynamicBuffer (
37
- int block_size, int max_size, const char * seal, int seal_size)
38
- : block_size_(block_size),
39
- max_size_ (max_size - (max_size % block_size_)),
40
- seal_(seal),
41
- seal_size_(seal_size),
42
- blocks_(max_size_ / block_size_ + 1 ),
43
- write_pos_(0 ), block_index_(0 ), block_write_pos_(0 ), is_sealed_(false ) {
44
- ASSERT (BlocksCount () > 0 );
45
- AllocateBlock (0 );
46
- for (int i = 1 ; i < BlocksCount (); ++i) {
47
- blocks_[i] = NULL ;
48
- }
49
- }
50
-
51
-
52
- LogDynamicBuffer::~LogDynamicBuffer () {
53
- for (int i = 0 ; i < BlocksCount (); ++i) {
54
- DeleteArray (blocks_[i]);
55
- }
56
- }
57
-
58
-
59
- int LogDynamicBuffer::Read (int from_pos, char * dest_buf, int buf_size) {
60
- if (buf_size == 0 ) return 0 ;
61
- int read_pos = from_pos;
62
- int block_read_index = BlockIndex (from_pos);
63
- int block_read_pos = PosInBlock (from_pos);
64
- int dest_buf_pos = 0 ;
65
- // Read until dest_buf is filled, or write_pos_ encountered.
66
- while (read_pos < write_pos_ && dest_buf_pos < buf_size) {
67
- const int read_size = Min (write_pos_ - read_pos,
68
- Min (buf_size - dest_buf_pos, block_size_ - block_read_pos));
69
- memcpy (dest_buf + dest_buf_pos,
70
- blocks_[block_read_index] + block_read_pos, read_size);
71
- block_read_pos += read_size;
72
- dest_buf_pos += read_size;
73
- read_pos += read_size;
74
- if (block_read_pos == block_size_) {
75
- block_read_pos = 0 ;
76
- ++block_read_index;
77
- }
78
- }
79
- return dest_buf_pos;
80
- }
81
-
82
-
83
- int LogDynamicBuffer::Seal () {
84
- WriteInternal (seal_, seal_size_);
85
- is_sealed_ = true ;
86
- return 0 ;
87
- }
88
-
89
-
90
- int LogDynamicBuffer::Write (const char * data, int data_size) {
91
- if (is_sealed_) {
92
- return 0 ;
93
- }
94
- if ((write_pos_ + data_size) <= (max_size_ - seal_size_)) {
95
- return WriteInternal (data, data_size);
96
- } else {
97
- return Seal ();
98
- }
99
- }
100
36
37
+ const char * Log::kLogToTemporaryFile = " &" ;
101
38
102
- int LogDynamicBuffer::WriteInternal (const char * data, int data_size) {
103
- int data_pos = 0 ;
104
- while (data_pos < data_size) {
105
- const int write_size =
106
- Min (data_size - data_pos, block_size_ - block_write_pos_);
107
- memcpy (blocks_[block_index_] + block_write_pos_, data + data_pos,
108
- write_size);
109
- block_write_pos_ += write_size;
110
- data_pos += write_size;
111
- if (block_write_pos_ == block_size_) {
112
- block_write_pos_ = 0 ;
113
- AllocateBlock (++block_index_);
114
- }
115
- }
116
- write_pos_ += data_size;
117
- return data_size;
118
- }
119
-
120
- // Must be the same message as in Logger::PauseProfiler.
121
- const char * const Log::kDynamicBufferSeal = " profiler,\" pause\"\n " ;
122
39
123
40
Log::Log (Logger* logger)
124
- : write_to_file_(false ),
125
- is_stopped_ (false ),
41
+ : is_stopped_(false ),
126
42
output_handle_ (NULL ),
127
43
ll_output_handle_(NULL ),
128
- output_buffer_(NULL ),
129
44
mutex_(NULL ),
130
45
message_buffer_(NULL ),
131
46
logger_(logger) {
@@ -163,19 +78,19 @@ void Log::Initialize() {
163
78
FLAG_prof_auto = false ;
164
79
}
165
80
166
- bool start_logging = FLAG_log || FLAG_log_runtime || FLAG_log_api
81
+ bool open_log_file = FLAG_log || FLAG_log_runtime || FLAG_log_api
167
82
|| FLAG_log_code || FLAG_log_gc || FLAG_log_handles || FLAG_log_suspect
168
83
|| FLAG_log_regexp || FLAG_log_state_changes || FLAG_ll_prof;
169
84
170
- bool open_log_file = start_logging || FLAG_prof_lazy;
171
-
172
85
// If we're logging anything, we need to open the log file.
173
86
if (open_log_file) {
174
87
if (strcmp (FLAG_logfile, " -" ) == 0 ) {
175
88
OpenStdout ();
176
89
} else if (strcmp (FLAG_logfile, " *" ) == 0 ) {
177
- OpenMemoryBuffer ();
178
- } else {
90
+ // Does nothing for now. Will be removed.
91
+ } else if (strcmp (FLAG_logfile, kLogToTemporaryFile ) == 0 ) {
92
+ OpenTemporaryFile ();
93
+ } else {
179
94
if (strchr (FLAG_logfile, ' %' ) != NULL ||
180
95
!Isolate::Current ()->IsDefaultIsolate ()) {
181
96
// If there's a '%' in the log file name we have to expand
@@ -225,7 +140,12 @@ void Log::Initialize() {
225
140
void Log::OpenStdout () {
226
141
ASSERT (!IsEnabled ());
227
142
output_handle_ = stdout;
228
- write_to_file_ = true ;
143
+ }
144
+
145
+
146
+ void Log::OpenTemporaryFile () {
147
+ ASSERT (!IsEnabled ());
148
+ output_handle_ = i::OS::OpenTemporaryFile ();
229
149
}
230
150
231
151
@@ -240,7 +160,6 @@ static const int kLowLevelLogBufferSize = 2 * MB;
240
160
void Log::OpenFile (const char * name) {
241
161
ASSERT (!IsEnabled ());
242
162
output_handle_ = OS::FOpen (name, OS::LogFileOpenMode);
243
- write_to_file_ = true ;
244
163
if (FLAG_ll_prof) {
245
164
// Open the low-level log file.
246
165
size_t len = strlen (name);
@@ -253,25 +172,18 @@ void Log::OpenFile(const char* name) {
253
172
}
254
173
255
174
256
- void Log::OpenMemoryBuffer () {
257
- ASSERT (!IsEnabled ());
258
- output_buffer_ = new LogDynamicBuffer (
259
- kDynamicBufferBlockSize , kMaxDynamicBufferSize ,
260
- kDynamicBufferSeal , StrLength (kDynamicBufferSeal ));
261
- write_to_file_ = false ;
262
- }
263
-
264
-
265
- void Log::Close () {
266
- if (write_to_file_) {
267
- if (output_handle_ != NULL ) fclose (output_handle_);
268
- output_handle_ = NULL ;
269
- if (ll_output_handle_ != NULL ) fclose (ll_output_handle_);
270
- ll_output_handle_ = NULL ;
271
- } else {
272
- delete output_buffer_;
273
- output_buffer_ = NULL ;
175
+ FILE* Log::Close () {
176
+ FILE* result = NULL ;
177
+ if (output_handle_ != NULL ) {
178
+ if (strcmp (FLAG_logfile, kLogToTemporaryFile ) != 0 ) {
179
+ fclose (output_handle_);
180
+ } else {
181
+ result = output_handle_;
182
+ }
274
183
}
184
+ output_handle_ = NULL ;
185
+ if (ll_output_handle_ != NULL ) fclose (ll_output_handle_);
186
+ ll_output_handle_ = NULL ;
275
187
276
188
DeleteArray (message_buffer_);
277
189
message_buffer_ = NULL ;
@@ -280,27 +192,7 @@ void Log::Close() {
280
192
mutex_ = NULL ;
281
193
282
194
is_stopped_ = false ;
283
- }
284
-
285
-
286
- int Log::GetLogLines (int from_pos, char * dest_buf, int max_size) {
287
- if (write_to_file_) return 0 ;
288
- ASSERT (output_buffer_ != NULL );
289
- ASSERT (from_pos >= 0 );
290
- ASSERT (max_size >= 0 );
291
- int actual_size = output_buffer_->Read (from_pos, dest_buf, max_size);
292
- ASSERT (actual_size <= max_size);
293
- if (actual_size == 0 ) return 0 ;
294
-
295
- // Find previous log line boundary.
296
- char * end_pos = dest_buf + actual_size - 1 ;
297
- while (end_pos >= dest_buf && *end_pos != ' \n ' ) --end_pos;
298
- actual_size = static_cast <int >(end_pos - dest_buf + 1 );
299
- // If the assertion below is hit, it means that there was no line end
300
- // found --- something wrong has happened.
301
- ASSERT (actual_size > 0 );
302
- ASSERT (actual_size <= max_size);
303
- return actual_size;
195
+ return result;
304
196
}
305
197
306
198
@@ -409,9 +301,7 @@ void LogMessageBuilder::AppendStringPart(const char* str, int len) {
409
301
410
302
void LogMessageBuilder::WriteToLogFile () {
411
303
ASSERT (pos_ <= Log::kMessageBufferSize );
412
- const int written = log_->write_to_file_ ?
413
- log_->WriteToFile (log_->message_buffer_ , pos_) :
414
- log_->WriteToMemory (log_->message_buffer_ , pos_);
304
+ const int written = log_->WriteToFile (log_->message_buffer_ , pos_);
415
305
if (written != pos_) {
416
306
log_->stop ();
417
307
log_->logger_ ->LogFailure ();
0 commit comments