Mercurial > hg > graal-compiler
comparison src/share/vm/utilities/ostream.cpp @ 1353:a2ea687fdc7c
6938627: Make temporary directory use property java.io.tmpdir when specified
Summary: Get java.io.tmpdir property in os::get_temp_directory() and call this instead of harcoding "/tmp". Don't assume trailing file_separator either.
Reviewed-by: dholmes, kamg
author | coleenp |
---|---|
date | Wed, 31 Mar 2010 16:51:18 -0700 |
parents | 0fbdb4381b99 |
children | c18cbe5936b8 |
comparison
equal
deleted
inserted
replaced
1330:4a9cc99938e3 | 1353:a2ea687fdc7c |
---|---|
361 // if a VM error has been reported. | 361 // if a VM error has been reported. |
362 if (!_inited && !is_error_reported()) init(); | 362 if (!_inited && !is_error_reported()) init(); |
363 return _log_file != NULL; | 363 return _log_file != NULL; |
364 } | 364 } |
365 | 365 |
366 static const char* make_log_name(const char* log_name, const char* force_directory, char* buf) { | 366 static const char* make_log_name(const char* log_name, const char* force_directory) { |
367 const char* basename = log_name; | 367 const char* basename = log_name; |
368 char file_sep = os::file_separator()[0]; | 368 char file_sep = os::file_separator()[0]; |
369 const char* cp; | 369 const char* cp; |
370 for (cp = log_name; *cp != '\0'; cp++) { | 370 for (cp = log_name; *cp != '\0'; cp++) { |
371 if (*cp == '/' || *cp == file_sep) { | 371 if (*cp == '/' || *cp == file_sep) { |
372 basename = cp+1; | 372 basename = cp+1; |
373 } | 373 } |
374 } | 374 } |
375 const char* nametail = log_name; | 375 const char* nametail = log_name; |
376 | 376 |
377 // Compute buffer length | |
378 size_t buffer_length; | |
379 if (force_directory != NULL) { | |
380 buffer_length = strlen(force_directory) + strlen(os::file_separator()) + | |
381 strlen(basename) + 1; | |
382 } else { | |
383 buffer_length = strlen(log_name) + 1; | |
384 } | |
385 | |
386 const char* star = strchr(basename, '*'); | |
387 int star_pos = (star == NULL) ? -1 : (star - nametail); | |
388 | |
389 char pid[32]; | |
390 if (star_pos >= 0) { | |
391 jio_snprintf(pid, sizeof(pid), "%u", os::current_process_id()); | |
392 buffer_length += strlen(pid); | |
393 } | |
394 | |
395 // Create big enough buffer. | |
396 char *buf = NEW_C_HEAP_ARRAY(char, buffer_length); | |
397 | |
377 strcpy(buf, ""); | 398 strcpy(buf, ""); |
378 if (force_directory != NULL) { | 399 if (force_directory != NULL) { |
379 strcat(buf, force_directory); | 400 strcat(buf, force_directory); |
380 strcat(buf, os::file_separator()); | 401 strcat(buf, os::file_separator()); |
381 nametail = basename; // completely skip directory prefix | 402 nametail = basename; // completely skip directory prefix |
382 } | 403 } |
383 | 404 |
384 const char* star = strchr(basename, '*'); | |
385 int star_pos = (star == NULL) ? -1 : (star - nametail); | |
386 | |
387 if (star_pos >= 0) { | 405 if (star_pos >= 0) { |
388 // convert foo*bar.log to foo123bar.log | 406 // convert foo*bar.log to foo123bar.log |
389 int buf_pos = (int) strlen(buf); | 407 int buf_pos = (int) strlen(buf); |
390 strncpy(&buf[buf_pos], nametail, star_pos); | 408 strncpy(&buf[buf_pos], nametail, star_pos); |
391 sprintf(&buf[buf_pos + star_pos], "%u", os::current_process_id()); | 409 strcpy(&buf[buf_pos + star_pos], pid); |
392 nametail += star_pos + 1; // skip prefix and star | 410 nametail += star_pos + 1; // skip prefix and star |
393 } | 411 } |
394 | 412 |
395 strcat(buf, nametail); // append rest of name, or all of name | 413 strcat(buf, nametail); // append rest of name, or all of name |
396 return buf; | 414 return buf; |
397 } | 415 } |
398 | 416 |
399 void defaultStream::init_log() { | 417 void defaultStream::init_log() { |
400 // %%% Need a MutexLocker? | 418 // %%% Need a MutexLocker? |
401 const char* log_name = LogFile != NULL ? LogFile : "hotspot.log"; | 419 const char* log_name = LogFile != NULL ? LogFile : "hotspot.log"; |
402 char buf[O_BUFLEN*2]; | 420 const char* try_name = make_log_name(log_name, NULL); |
403 const char* try_name = make_log_name(log_name, NULL, buf); | |
404 fileStream* file = new(ResourceObj::C_HEAP) fileStream(try_name); | 421 fileStream* file = new(ResourceObj::C_HEAP) fileStream(try_name); |
405 if (!file->is_open()) { | 422 if (!file->is_open()) { |
406 // Try again to open the file. | 423 // Try again to open the file. |
407 char warnbuf[O_BUFLEN*2]; | 424 char warnbuf[O_BUFLEN*2]; |
408 sprintf(warnbuf, "Warning: Cannot open log file: %s\n", try_name); | 425 jio_snprintf(warnbuf, sizeof(warnbuf), |
426 "Warning: Cannot open log file: %s\n", try_name); | |
409 // Note: This feature is for maintainer use only. No need for L10N. | 427 // Note: This feature is for maintainer use only. No need for L10N. |
410 jio_print(warnbuf); | 428 jio_print(warnbuf); |
411 try_name = make_log_name("hs_pid*.log", os::get_temp_directory(), buf); | 429 FREE_C_HEAP_ARRAY(char, try_name); |
412 sprintf(warnbuf, "Warning: Forcing option -XX:LogFile=%s\n", try_name); | 430 try_name = make_log_name("hs_pid*.log", os::get_temp_directory()); |
431 jio_snprintf(warnbuf, sizeof(warnbuf), | |
432 "Warning: Forcing option -XX:LogFile=%s\n", try_name); | |
413 jio_print(warnbuf); | 433 jio_print(warnbuf); |
414 delete file; | 434 delete file; |
415 file = new(ResourceObj::C_HEAP) fileStream(try_name); | 435 file = new(ResourceObj::C_HEAP) fileStream(try_name); |
436 FREE_C_HEAP_ARRAY(char, try_name); | |
416 } | 437 } |
417 if (file->is_open()) { | 438 if (file->is_open()) { |
418 _log_file = file; | 439 _log_file = file; |
419 xmlStream* xs = new(ResourceObj::C_HEAP) xmlStream(file); | 440 xmlStream* xs = new(ResourceObj::C_HEAP) xmlStream(file); |
420 _outer_xmlStream = xs; | 441 _outer_xmlStream = xs; |