00001 /*!@file Component/EventLog.C */ 00002 00003 // //////////////////////////////////////////////////////////////////// // 00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2000-2005 // 00005 // by the University of Southern California (USC) and the iLab at USC. // 00006 // See http://iLab.usc.edu for information about this project. // 00007 // //////////////////////////////////////////////////////////////////// // 00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00010 // in Visual Environments, and Applications'' by Christof Koch and // 00011 // Laurent Itti, California Institute of Technology, 2001 (patent // 00012 // pending; application number 09/912,225 filed July 23, 2001; see // 00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00014 // //////////////////////////////////////////////////////////////////// // 00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00016 // // 00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00018 // redistribute it and/or modify it under the terms of the GNU General // 00019 // Public License as published by the Free Software Foundation; either // 00020 // version 2 of the License, or (at your option) any later version. // 00021 // // 00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00025 // PURPOSE. See the GNU General Public License for more details. // 00026 // // 00027 // You should have received a copy of the GNU General Public License // 00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00030 // Boston, MA 02111-1307 USA. // 00031 // //////////////////////////////////////////////////////////////////// // 00032 // 00033 // Primary maintainer for this file: 00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Component/EventLog.C $ 00035 // $Id: EventLog.C 6526 2006-04-25 17:26:17Z rjpeters $ 00036 // 00037 00038 #ifndef COMPONENT_EVENTLOG_C_DEFINED 00039 #define COMPONENT_EVENTLOG_C_DEFINED 00040 00041 #include "Component/EventLog.H" 00042 #include "Component/OptionManager.H" 00043 #include "Component/ComponentOpts.H" 00044 #include "Util/sformat.H" 00045 #include <fstream> 00046 00047 // ###################################################################### 00048 EventLog::EventLog(OptionManager& mgr, const std::string& descrName, 00049 const std::string& tagName) : 00050 ModelComponent(mgr, descrName, tagName), 00051 itsFileName(&OPT_EventLogFileName, this), 00052 itsEvents(), itsTimer(1000000) 00053 { 00054 pthread_mutex_init(&itsMutex, NULL); 00055 } 00056 00057 // ###################################################################### 00058 EventLog::~EventLog() 00059 { 00060 pthread_mutex_destroy(&itsMutex); 00061 } 00062 00063 // ###################################################################### 00064 void EventLog::start1() 00065 { 00066 pthread_mutex_lock(&itsMutex); 00067 00068 // clear events: 00069 itsEvents.clear(); 00070 00071 // reset timer: 00072 itsTimer.reset(); 00073 00074 pthread_mutex_unlock(&itsMutex); 00075 } 00076 00077 // ###################################################################### 00078 void EventLog::stop2() 00079 { 00080 pthread_mutex_lock(&itsMutex); 00081 00082 // let's save the events: 00083 if (itsEvents.empty() == false && itsFileName.getVal().length() > 1) 00084 { 00085 const char *fname = itsFileName.getVal().c_str(); 00086 std::ofstream ofs(fname); 00087 if (!ofs.is_open()) 00088 LERROR("Couldn't open file '%s' for writing.", fname); 00089 else 00090 { 00091 std::list<LogEvent>::const_iterator itr = itsEvents.begin(); 00092 while (itr != itsEvents.end()) 00093 { 00094 const uint64 t = itr->tim; 00095 const int usec = int(t % 1000ULL); 00096 const int msec = int((t / 1000ULL) % 1000ULL); 00097 const int sec = int((t / 1000000ULL) % 60ULL); 00098 const int minu = int((t / 60000000ULL) % 60ULL); 00099 const int hour = int(t / 3600000000ULL); 00100 00101 ofs << sformat("%03d:%02d:%02d.%03d.%03d", 00102 hour, minu, sec, msec, usec) 00103 << " " << itr->descrip << std::endl; 00104 ++ itr; 00105 } 00106 ofs.close(); 00107 LINFO("Saved log to '%s'", fname); 00108 } 00109 } 00110 00111 pthread_mutex_unlock(&itsMutex); 00112 } 00113 00114 // ###################################################################### 00115 void EventLog::pushEvent(const std::string& msg) 00116 { 00117 LogEvent evt; evt.tim = itsTimer.get(); evt.descrip = msg; 00118 00119 pthread_mutex_lock(&itsMutex); 00120 itsEvents.push_back(evt); 00121 pthread_mutex_unlock(&itsMutex); 00122 } 00123 00124 // ###################################################################### 00125 void EventLog::pushEventBegin(const std::string& msg) 00126 { pushEvent(std::string("Begin: ") + msg); } 00127 00128 // ###################################################################### 00129 void EventLog::pushEventEnd(const std::string& msg) 00130 { pushEvent(std::string("End : ") + msg); } 00131 00132 00133 00134 // ###################################################################### 00135 /* So things look consistent in everyone's emacs... */ 00136 /* Local Variables: */ 00137 /* mode: c++ */ 00138 /* indent-tabs-mode: nil */ 00139 /* End: */ 00140 00141 #endif // COMPONENT_EVENTLOG_C_DEFINED