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