13d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/* 23d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Copyright (C) 2014 The Android Open Source Project 33d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * 43d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License"); 53d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * you may not use this file except in compliance with the License. 63d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * You may obtain a copy of the License at 73d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * 83d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * http://www.apache.org/licenses/LICENSE-2.0 93d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * 103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Unless required by applicable law or agreed to in writing, software 113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS, 123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * See the License for the specific language governing permissions and 143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * limitations under the License. 153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby */ 163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <stdarg.h> 183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <time.h> 193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "dmStringUtil.h" 203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "dmprofile.h" 213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "dmThreadHelper.h" 223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "dmstring.h" 233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef DM_FILE_OUTPUT 253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid DMFileOutput( const char* szFormat, ... ) 273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby static int s_nFirstCall = 1; // mark first access to write some additional info 293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby static char filename[255]; 303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby FILE * fp=NULL; 323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( s_nFirstCall ){ 343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby s_nFirstCall = 0; 353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby const char* dm_settings_env = getenv("dm_setting_root"); 373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( !dm_settings_env ) 393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby dm_settings_env = ""; 403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby DmStrcpy (filename, dm_settings_env); 423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby DmStrcat( filename, "/a/motorola/settings/DMOUTPUT.txt" ); 433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby fp=fopen(filename, "a+"); 453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if (!fp) 463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return; 473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby time_t elapstime; 493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby time(&elapstime); 503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby fprintf(fp, "\nLog started at %s \n", 523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby ctime(&elapstime)); 533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby fclose(fp); 543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby fp=NULL; 553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby fp=fopen(filename, "a+"); 583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if (!fp) 593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return; 603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby va_list ap; 623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby va_start(ap, szFormat); 633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby vfprintf( fp, szFormat, ap ); 643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby va_end(ap); 653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby fclose(fp); 673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby fp=NULL; 683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif 713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef DM_PROFILER_ENABLED 733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <sys/types.h> 753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <sys/stat.h> 763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <fcntl.h> 773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambyCDMProfCell g_aProfStorage[PROF_CELL_NUM]; 793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyint g_nProfCurCell = 0; 803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyclass CProfileCmdListener : public DMThread{ 823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambypublic: 833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby CProfileCmdListener() { 843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby StartThread(); 853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby ~CProfileCmdListener() { 873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby StopThread(); 883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby enum { eNone, eError, eReset, ePrint, ePrintPipe}; 913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby virtual void* Run(); 923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int GetCommand( int nPipe ); 933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby void PrintResult( int nFile ); 943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby DMString _sOutPipe; 963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}; 973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#define PROF_CMD_PIPE_NAME "/tmp/dmprof" 993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid* CProfileCmdListener::Run() 1013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 1023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyprintf("DM profile command listener is started\n" 1033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby "use file " PROF_CMD_PIPE_NAME " to manipulate it\n"); 1043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 1063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby // check for cvm 1073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby char szFile[1024]; 1083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby sprintf( szFile, "/proc/%d/cmdline", (int)getpid() ); 1103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nF = open( szFile, O_RDONLY ); 1113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nF >= 0 ){ 1123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby read( nF, szFile, sizeof(szFile ) ); 1133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby close (nF); 1143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( strstr( szFile, "cvm") == NULL ) 1163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return NULL; 1173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 1193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if (mkfifo(PROF_CMD_PIPE_NAME, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)) 1213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf("Failed to create pipe\n"); 1223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nPipe = open(PROF_CMD_PIPE_NAME, O_NONBLOCK ); 1243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nPipe < 0 ){ 1263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "Failed to open pipe - cmd listener terminated\n"); 1273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return 0; 1283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby while (m_bRunning) 1313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 1323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nCmd = GetCommand( nPipe ); 1333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nCmd != eNone ) 1353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "Cmd received %d\n\n\n", nCmd ); 1363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby //printf("Stat %d:\n", g_nProfCurCell); 1383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby switch ( nCmd ){ 1403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby case eReset: 1413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf("Reset\n"); 1423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_nProfCurCell = 0; 1433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby break; 1443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby case ePrint: 1463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby PrintResult(-1); 1473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby break; 1483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby case ePrintPipe: 1503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 1513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nFile = open( _sOutPipe, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP ); 1523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby PrintResult(nFile); 1533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nFile > -1 ) 1543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby close( nFile ); 1553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby break; 1573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby }; 1583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby close( nPipe ); 1613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return 0; 1633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 1643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyint CProfileCmdListener::GetCommand( int nPipe ) 1663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 1673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nPipe < 0 | nPipe > 1023 ) 1683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return -1; 1693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int rc; 1713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby fd_set fds; 1723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby struct timeval tv; 1733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby FD_ZERO(&fds); 1753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby FD_SET(nPipe,&fds); 1763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby tv.tv_sec = 1; 1773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby tv.tv_usec = 0; 1783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby rc = select(nPipe+1, &fds, NULL, NULL, &tv); 1803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if (rc < 0) 1813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return eError; 1823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if (!FD_ISSET(nPipe,&fds) ) 1843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return eNone; 1853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby char szCmd[50] = ""; 1873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nBytes = read( nPipe, szCmd, sizeof(szCmd)); 1893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nBytes == 0 ){ 1913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby sleep(1); 1923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return eNone; 1933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( strncmp( szCmd, "reset", 5) == 0 ) 1963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return eReset; 1973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( strncmp( szCmd, "print", 5) == 0 ) 1993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return ePrint; 2003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( strncmp( szCmd, "out", 3) == 0 ){ 2023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby _sOutPipe.assign(szCmd + 4, nBytes - 4); 2033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "out to [%s]\n", _sOutPipe.c_str() ); 2043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return ePrintPipe; 2053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 2063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return eError; 2083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 2103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid CProfileCmdListener::PrintResult( int nFile ) 2123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 2133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int n = 0; 2143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby long long nTot = 0; 2153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby char szBuf[10096]; 2163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby while ( n < g_nProfCurCell ){ 2183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( g_aProfStorage[n % PROF_CELL_NUM]._s ) { 2203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nLen = sprintf( szBuf, "%d: DMProfile: %s, time is %lld usec, from %lld to %lld\n", 2213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby n+1, 2223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_aProfStorage[n % PROF_CELL_NUM]._s, 2233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_aProfStorage[n % PROF_CELL_NUM]._elapsed, 2243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_aProfStorage[n % PROF_CELL_NUM]._from, 2253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_aProfStorage[n % PROF_CELL_NUM]._elapsed + g_aProfStorage[n % PROF_CELL_NUM]._from ); 2263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nFile >= 0 ) 2283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby write( nFile, szBuf, nLen ); 2293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby else 2303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "%s", szBuf ); 2313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby nTot += g_aProfStorage[n % PROF_CELL_NUM]._elapsed; 2333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 2343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby free( (void*)g_aProfStorage[n % PROF_CELL_NUM]._s ); 2363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_aProfStorage[n % PROF_CELL_NUM]._s = NULL; 2373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby n++; 2383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 2393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nLen = sprintf( szBuf, "Total time is %lld\n", nTot ); 2413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nFile >= 0 ) 2423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby write( nFile, szBuf, nLen ); 2433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby else 2443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "%s", szBuf ); 2453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_nProfCurCell = 0; 2473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 2483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambyCProfileCmdListener g_oProfileCmdListener; 2503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif 2523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef DM_PROFILER_STACK 2543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <sys/types.h> 2563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <sys/stat.h> 2573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <fcntl.h> 2583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambyDMProfileData __aProfStackStorage[PROF_STACK_NUM]; 2613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyint g_nProfCurCell = 0; 2633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyclass CProfileStackCmdListener : public DMThread{ 2663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambypublic: 2673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby CProfileStackCmdListener() { 2683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby StartThread(); 2693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 2703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby ~CProfileStackCmdListener() { 2713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby StopThread(); 2723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 2733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby enum { eNone, eError, eReset, ePrint, ePrintPipe}; 2753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby virtual void* Run(); 2763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int GetCommand( int nPipe ); 2773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby void PrintResult( int nFile ); 2783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby DMString _sOutPipe; 2803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}; 2813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#define PROF_CMD_PIPE_NAME "/tmp/dmprofstack" 2833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid* CProfileStackCmdListener::Run() 2853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 2863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf("DM profile STACK command listener is started\n" 2873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby "use file " PROF_CMD_PIPE_NAME " to manipulate it\n"); 2883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 2903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby // check for cvm 2913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby char szFile[1024]; 2923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby sprintf( szFile, "/proc/%d/cmdline", (int)getpid() ); 2943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nF = open( szFile, O_RDONLY ); 2953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nF >= 0 ){ 2963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby read( nF, szFile, sizeof(szFile ) ); 2973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby close (nF); 2983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( strstr( szFile, "cvm") == NULL ) 3003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return NULL; 3013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 3023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 3033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if (mkfifo(PROF_CMD_PIPE_NAME, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)) 3053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf("Failed to create pipe\n"); 3063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nPipe = open(PROF_CMD_PIPE_NAME, O_NONBLOCK ); 3083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nPipe < 0 ){ 3103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "Failed to open pipe - cmd listener terminated\n"); 3113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return 0; 3123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 3133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby while (m_bRunning) 3153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 3163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nCmd = GetCommand( nPipe ); 3173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nCmd != eNone ) 3193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "Cmd received %d\n\n\n", nCmd ); 3203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby switch ( nCmd ){ 3223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby case eReset: 3233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf("Reset\n"); 3243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_nProfCurCell = 0; 3253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby break; 3263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby case ePrint: 3283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby PrintResult(-1); 3293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby break; 3303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby case ePrintPipe: 3323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 3333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nFile = open( _sOutPipe, O_WRONLY | O_CREAT | O_APPEND ); 3343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby PrintResult(nFile); 3353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nFile > -1 ) 3363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby close( nFile ); 3373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 3383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby break; 3393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby }; 3403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 3413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby close( nPipe ); 3433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return 0; 3453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 3463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyint CProfileStackCmdListener::GetCommand( int nPipe ) 3483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 3493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nPipe < 0 | nPipe > 1023 ) 3503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return -1; 3513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int rc; 3533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby fd_set fds; 3543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby struct timeval tv; 3553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby FD_ZERO(&fds); 3573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby FD_SET(nPipe,&fds); 3583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby tv.tv_sec = 1; 3593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby tv.tv_usec = 0; 3603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby rc = select(nPipe+1, &fds, NULL, NULL, &tv); 3623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if (rc < 0) 3633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return eError; 3643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if (!FD_ISSET(nPipe,&fds) ) 3663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return eNone; 3673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby char szCmd[50] = ""; 3693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nBytes = read( nPipe, szCmd, sizeof(szCmd)); 3713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nBytes == 0 ){ 3733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby sleep(1); 3743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return eNone; 3753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 3763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( strncmp( szCmd, "reset", 5) == 0 ) 3783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return eReset; 3793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( strncmp( szCmd, "print", 5) == 0 ) 3813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return ePrint; 3823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( strncmp( szCmd, "out", 3) == 0 ){ 3843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby _sOutPipe.assign(szCmd + 4, nBytes - 4); 3853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "out to [%s]\n", _sOutPipe.c_str() ); 3863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return ePrintPipe; 3873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 3883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return eError; 3903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 3913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid CProfileStackCmdListener::PrintResult( int nFile ) 3933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 3943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int n = 0; 3953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby long long nTot = 0; 3963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby char szBuf[10096]; 3973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 3983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nLen = sprintf( szBuf, "<DMProfiles>\n"); 3993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nFile >= 0 ) 4003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby write( nFile, szBuf, nLen ); 4013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby else 4023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "%s", szBuf ); 4033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby while ( n < g_nProfCurCell ){ 4053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( __aProfStackStorage[n % PROF_STACK_NUM]._elapsed ) { 4073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby nLen = sprintf( szBuf, " <DMProfile>\n"); 4093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nFile >= 0 ) 4103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby write( nFile, szBuf, nLen ); 4113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby else 4123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "%s", szBuf ); 4133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby nLen = sprintf( szBuf, " <ID>%d</ID>\n <ElapseTime>%lld</ElapseTime>\n <BeginTime>%lld</BeginTime>\n <EndTime>%lld</EndTime>\n%s", 4153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby n+1, 4163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby __aProfStackStorage[n % PROF_STACK_NUM]._elapsed, 4173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby __aProfStackStorage[n % PROF_STACK_NUM]._from, 4183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby __aProfStackStorage[n % PROF_STACK_NUM]._elapsed + __aProfStackStorage[n % PROF_STACK_NUM]._from, 4193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby __aProfStackStorage[n % PROF_STACK_NUM]._s); 4203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nFile >= 0 ) 4223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby write( nFile, szBuf, nLen ); 4233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby else 4243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "%s", szBuf ); 4253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby nLen = sprintf( szBuf, " </DMProfile>\n"); 4283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nFile >= 0 ) 4293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby write( nFile, szBuf, nLen ); 4303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby else 4313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "%s", szBuf ); 4323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby nTot += __aProfStackStorage[n % PROF_STACK_NUM]._elapsed; 4343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 4353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby free( (void*)__aProfStackStorage[n % PROF_STACK_NUM]._s ); 4373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby __aProfStackStorage[n % PROF_STACK_NUM]._s = NULL; 4383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby n++; 4393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 4403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby nLen = sprintf( szBuf, "</DMProfiles>\n"); 4423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nFile >= 0 ) 4433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby write( nFile, szBuf, nLen ); 4443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby else 4453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby printf( "%s", szBuf ); 4463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_nProfCurCell = 0; 4483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 4493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambyCProfileStackCmdListener g_oProfileStackCmdListener; 4513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 4523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif 453