#include <SimpleProfiler.h>
Public Types | |
typedef VoidVec::size_type | size_type |
typedef std::vector< void * > | VoidVec |
Public Member Functions | |
void | commitFrame (void **first, void **last) |
void * | stackTop () |
void | start () |
void | stop () |
void ** | tempStack () |
size_type | tempStackSize () |
Static Public Member Functions | |
static SimpleProfiler * | instance () |
Private Member Functions | |
void | complete () |
void | doWrite () |
SimpleProfiler () | |
~SimpleProfiler () | |
Private Attributes | |
void ** | curr_ |
int | fd_ |
std::string | filename_ |
VoidVec | frame_data_ |
void ** | high_water_ |
bool | installed_ |
pthread_t | owner_ |
bool | running_ |
void * | stacktop_ |
VoidVec | tmp_stack_ |
Static Private Attributes | |
static SimpleProfiler * | inst_ = 0 |
static boost::mutex | lock_ |
Definition at line 12 of file SimpleProfiler.h.
typedef VoidVec::size_type SimpleProfiler::size_type |
Definition at line 16 of file SimpleProfiler.h.
typedef std::vector<void*> SimpleProfiler::VoidVec |
Definition at line 15 of file SimpleProfiler.h.
SimpleProfiler::SimpleProfiler | ( | ) | [private] |
Definition at line 597 of file SimpleProfiler.cc.
References fd_, and filename_.
: frame_data_(10*1000*1000), tmp_stack_(1000), high_water_(&frame_data_[10*1000*1000-10*1000]), curr_(&frame_data_[0]), filename_(makeFileName()), fd_(open(filename_.c_str(), O_RDWR|O_CREAT, S_IRWXU|S_IRGRP|S_IROTH|S_IWGRP|S_IWOTH)), installed_(false), running_(false), owner_(), stacktop_(setStacktop()) { if (fd_ < 0) { std::ostringstream ost; ost << "failed to open profiler output file " << filename_; throw std::runtime_error(ost.str().c_str()); } openCondFile(); }
SimpleProfiler::~SimpleProfiler | ( | ) | [private] |
Definition at line 620 of file SimpleProfiler.cc.
References ExpressReco_HICollisions_FallBack::cerr, filename_, and running_.
void SimpleProfiler::commitFrame | ( | void ** | first, |
void ** | last | ||
) |
Definition at line 630 of file SimpleProfiler.cc.
References filterCSVwithJSON::copy, curr_, doWrite(), and high_water_.
Referenced by sigFunc().
void SimpleProfiler::complete | ( | ) | [private] |
Definition at line 719 of file SimpleProfiler.cc.
References ExpressReco_HICollisions_FallBack::cerr, doWrite(), fd_, filename_, edmtest::makeFileName(), and writeProfileData().
Referenced by stop().
{ doWrite(); if(lseek(fd_,0,SEEK_SET)<0) { std::cerr << "SimpleProfiler: could not seek to the start of the profile\n" << " data file during completion. Data will be lost.\n"; return; } writeProfileData(fd_,filename_); write_maps(); std::string totsname = makeFileName(); totsname += "_sample_info"; std::ofstream ost(totsname.c_str()); ost << "samples_total " << samples_total << "\n" << "samples_missing_framepointer " << samples_missing_framepointer << "\n" ; }
void SimpleProfiler::doWrite | ( | ) | [private] |
Definition at line 639 of file SimpleProfiler.cc.
References curr_, fd_, frame_data_, and start().
Referenced by commitFrame(), and complete().
{ void** start = &frame_data_[0]; if(curr_ == start) return; unsigned int cnt = std::distance(start,curr_) * sizeof(void*); unsigned int totwr=0; while (cnt>0 && (totwr=write(fd_,start,cnt)) != cnt) { if(totwr==0) throw std::runtime_error("SimpleProfiler::doWrite wrote zero bytes"); start+=(totwr/sizeof(void*)); cnt-=totwr; } curr_ = &frame_data_[0]; }
SimpleProfiler * SimpleProfiler::instance | ( | void | ) | [static] |
Definition at line 583 of file SimpleProfiler.cc.
References inst_, lock_, and L1TEmulatorMonitor_cff::p.
Referenced by edm::service::SimpleProfiling::postBeginJob(), edm::service::SimpleProfiling::postEndJob(), and sigFunc().
{ if(SimpleProfiler::inst_ == 0) { boost::mutex::scoped_lock sl(lock_); if(SimpleProfiler::inst_ == 0) { static SimpleProfiler p; SimpleProfiler::inst_ = &p; } } return SimpleProfiler::inst_; }
void* SimpleProfiler::stackTop | ( | ) | [inline] |
void SimpleProfiler::start | ( | void | ) |
Definition at line 656 of file SimpleProfiler.cc.
References ExpressReco_HICollisions_FallBack::cerr, installed_, lock_, owner_, and running_.
Referenced by doWrite(), and edm::service::SimpleProfiling::postBeginJob().
{ #if defined(__x86_64__) || defined(__LP64__) || defined(_LP64) throw std::logic_error("SimpleProfiler not available on 64 bit platform"); #endif { boost::mutex::scoped_lock sl(lock_); if (installed_) { std::cerr << "Warning: second thread " << pthread_self() << " requested the profiler timer and another thread\n" << owner_ << "has already started it.\n" << "Only one thread can do profiling at a time.\n" << "This second thread will not be profiled.\n"; return; } installed_ = true; } owner_ = pthread_self(); setupTimer(); running_ = true; }
void SimpleProfiler::stop | ( | ) |
Definition at line 681 of file SimpleProfiler.cc.
References ExpressReco_HICollisions_FallBack::cerr, complete(), installed_, owner_, and running_.
Referenced by edm::service::SimpleProfiling::postEndJob().
{ if(!installed_) { std::cerr << "SimpleProfiler::stop - no timer installed to stop\n"; return; } if(owner_ != pthread_self()) { std::cerr << "SimpleProfiler::stop - only owning thread can stop the timer\n"; return; } if(!running_) { std::cerr << "SimpleProfiler::stop - no timer is running\n"; return; } struct itimerval newval; newval.it_interval.tv_sec = 0; newval.it_interval.tv_usec = 0; newval.it_value.tv_sec = 0; newval.it_value.tv_usec = 0; if(setitimer(ITIMER_PROF,&newval,0)!=0) { perror("setitimer call failed - could not stop the timer"); } running_=false; complete(); }
void** SimpleProfiler::tempStack | ( | ) | [inline] |
Definition at line 24 of file SimpleProfiler.h.
References tmp_stack_.
Referenced by sigFunc().
{ return &tmp_stack_[0]; }
size_type SimpleProfiler::tempStackSize | ( | ) | [inline] |
Definition at line 25 of file SimpleProfiler.h.
References tmp_stack_.
Referenced by sigFunc().
{ return tmp_stack_.size(); }
void** SimpleProfiler::curr_ [private] |
Definition at line 41 of file SimpleProfiler.h.
Referenced by commitFrame(), and doWrite().
int SimpleProfiler::fd_ [private] |
Definition at line 43 of file SimpleProfiler.h.
Referenced by complete(), doWrite(), and SimpleProfiler().
std::string SimpleProfiler::filename_ [private] |
Definition at line 42 of file SimpleProfiler.h.
Referenced by complete(), SimpleProfiler(), and ~SimpleProfiler().
VoidVec SimpleProfiler::frame_data_ [private] |
Definition at line 38 of file SimpleProfiler.h.
Referenced by doWrite().
void** SimpleProfiler::high_water_ [private] |
Definition at line 40 of file SimpleProfiler.h.
Referenced by commitFrame().
SimpleProfiler * SimpleProfiler::inst_ = 0 [static, private] |
Definition at line 36 of file SimpleProfiler.h.
Referenced by instance().
bool SimpleProfiler::installed_ [private] |
Definition at line 44 of file SimpleProfiler.h.
boost::mutex SimpleProfiler::lock_ [static, private] |
Definition at line 37 of file SimpleProfiler.h.
Referenced by instance(), and start().
pthread_t SimpleProfiler::owner_ [private] |
Definition at line 46 of file SimpleProfiler.h.
bool SimpleProfiler::running_ [private] |
Definition at line 45 of file SimpleProfiler.h.
Referenced by start(), stop(), and ~SimpleProfiler().
void* SimpleProfiler::stacktop_ [private] |
Definition at line 47 of file SimpleProfiler.h.
Referenced by stackTop().
VoidVec SimpleProfiler::tmp_stack_ [private] |
Definition at line 39 of file SimpleProfiler.h.
Referenced by tempStack(), and tempStackSize().