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;