/** * Configures verbosegc according to the parameters passed. * @param filename The name of the file or output stream to log to. * @param fileCount The number of files to log to. * @param iterations The number of gc cycles to log to each file. * @return true on success, false on failure */ bool MM_VerboseManager::configureVerboseGC(OMR_VM *omrVM, char *filename, uintptr_t fileCount, uintptr_t iterations) { MM_EnvironmentBase env(omrVM); MM_VerboseWriter *writer = NULL; disableWriters(); WriterType type = parseWriterType(&env, filename, fileCount, iterations); writer = findWriterInChain(type); if (NULL != writer) { writer->reconfigure(&env, filename, fileCount, iterations); } else { writer = createWriter(&env, type, filename, fileCount, iterations); if(NULL == writer) { return false; } _writerChain->addWriter(writer); } writer->isActive(true); return true; }
bool MM_VerboseManagerImpl::reconfigureVerboseGC(OMR_VM *omrVM) { OMRPORT_ACCESS_FROM_OMRVM(omrVM); /* If the pid is specified in the filename, then the pid of the * new process will be used during verbose reinitialization, * otherwise we append the pid of the child before the extension. */ WriterType type = parseWriterType(NULL, filename, 0, 0); /* All parameters other than filename aren't used */ if ( ((type == VERBOSE_WRITER_FILE_LOGGING_SYNCHRONOUS) || (type == VERBOSE_WRITER_FILE_LOGGING_BUFFERED)) && (NULL == strstr(filename, "%p")) && (NULL == strstr(filename, "%pid")) ) { #define MAX_PID_LENGTH 16 char pidStr[MAX_PID_LENGTH]; uintptr_t pid = omrsysinfo_get_pid(); int pidLen = snprintf(pidStr,MAX_PID_LENGTH, "_%lu",(long unsigned int)pid); /* Allocate new buffer */ char *newLog = (char *)omrmem_allocate_memory(pidLen+strlen(filename)+1, OMRMEM_CATEGORY_MM); /* Locate extension, if any */ char *extension = strchr(filename, '.'); if (NULL != extension) { size_t nameLen = extension - filename; size_t extLen = strlen(filename) - nameLen; strncpy(newLog, filename, nameLen); strncpy(newLog + nameLen, pidStr, pidLen); strncpy(newLog + nameLen + pidLen, extension, extLen); newLog[nameLen + pidLen + extLen] = '\0'; /* strncpy does NOT NULL terminate */ } else { size_t len = strlen(filename); strncpy(newLog,filename,len); newLog[len] = '\0'; /* strncpy does NOT NULL terminate */ strncat(newLog,pidStr,pidLen); /* strncat does NULL terminate */ } omrmem_free_memory(this->filename); filename = newLog; } return MM_VerboseManager::configureVerboseGC(omrVM, filename, 1, 0); }