12 #include <boost/function.hpp>
13 #include <boost/ptr_container/ptr_circular_buffer.hpp>
14 #include <boost/weak_ptr.hpp>
15 #include <boost/shared_ptr.hpp>
18 template<
typename TraceEntryT>
21 TraceBuffer(
const std::string& buf_name,
size_t size,
bool trace_enable)
68 tbb::mutex::scoped_lock lock(
mutex_);
95 ReadContextMap::iterator next = it;
106 uint32_t nseqno(
seqno_.fetch_and_increment());
114 void TraceRead(
const std::string& context,
const int count,
115 boost::function<
void (TraceEntryT *,
bool)> cb) {
116 tbb::mutex::scoped_lock lock(
mutex_);
123 size_t cnt = count ? count :
trace_buf_.size();
125 size_t *read_index_ptr;
126 typename ContainerType::iterator it;
127 ReadContextMap::iterator context_it =
132 read_index_ptr = context_it->second.get();
138 boost::shared_ptr<size_t> read_context(
new size_t(
read_index_));
139 read_index_ptr = read_context.get();
145 typename ContainerType::iterator next = it;
146 for (i = 0; (it !=
trace_buf_.end()) && (i < cnt); i++, it = next) {
152 size_t offset = *read_index_ptr + i;
158 tbb::mutex::scoped_lock lock(
mutex_);
159 ReadContextMap::iterator context_it =
168 typedef std::map<const std::string, boost::shared_ptr<size_t> >
191 template<
typename TraceEntryT>
194 typedef std::map<const std::string, boost::weak_ptr<TraceBuffer<TraceEntryT> > >
TraceBufMap;
202 tbb::mutex::scoped_lock lock(
mutex_);
206 if (it->second.lock() == NULL) {
219 template<
typename TraceEntryT>
222 typedef std::map<const std::string, boost::weak_ptr<TraceBuffer<TraceEntryT> > >
TraceBufMap;
243 boost::shared_ptr<TraceBuffer<TraceEntryT> >
TraceBufGet(
const std::string& buf_name) {
244 tbb::mutex::scoped_lock lock(
mutex_);
245 typename TraceBufMap::iterator it =
trace_buf_map_.find(buf_name);
247 return it->second.lock();
249 return boost::shared_ptr<TraceBuffer<TraceEntryT> >();
253 boost::shared_ptr<TraceBuffer<TraceEntryT> >
TraceBufAdd(
const std::string& buf_name,
size_t size,
257 return boost::shared_ptr<TraceBuffer<TraceEntryT> >();
259 tbb::mutex::scoped_lock lock(
mutex_);
260 typename TraceBufMap::iterator it =
trace_buf_map_.find(buf_name);
262 boost::shared_ptr<TraceBuffer<TraceEntryT> > trace_buf(
268 return it->second.lock();
272 tbb::mutex::scoped_lock lock(
mutex_);
273 typename TraceBufMap::iterator it;
275 trace_buf_list.push_back(it->first);
280 tbb::mutex::scoped_lock lock(
mutex_);
281 typename TraceBufMap::iterator it =
trace_buf_map_.find(buf_name);
283 boost::shared_ptr<TraceBuffer<TraceEntryT> > trace_buf =
285 return trace_buf->TraceBufCapacityGet();
292 const std::string& buf_name,
size_t size) {
293 tbb::mutex::scoped_lock lock(
mutex_);
294 typename TraceBufMap::iterator it =
trace_buf_map_.find(buf_name);
296 boost::shared_ptr<TraceBuffer<TraceEntryT> > trace_buf =
298 trace_buf->TraceBufCapacityReset(size);
301 boost::shared_ptr<TraceBuffer<TraceEntryT> > trace_buf(
326 #endif // __TRACE_H__
tbb::atomic< bool > trace_enable_
std::string trace_buf_name_
ReadContextMap read_context_map_
DISALLOW_COPY_AND_ASSIGN(Trace)
void TraceBufListGet(std::vector< std::string > &trace_buf_list)
std::map< const std::string, boost::shared_ptr< size_t > > ReadContextMap
TraceBufferDeleter(TraceBufMap &trace_buf_map, tbb::mutex &mutex)
boost::shared_ptr< TraceBuffer< TraceEntryT > > TraceBufGet(const std::string &buf_name)
TraceBuffer(const std::string &buf_name, size_t size, bool trace_enable)
void TraceReadDone(const std::string &context)
boost::shared_ptr< TraceBuffer< TraceEntryT > > TraceBufCapacityReset(const std::string &buf_name, size_t size)
std::map< const std::string, boost::weak_ptr< TraceBuffer< TraceEntryT > > > TraceBufMap
boost::ptr_circular_buffer< TraceEntryT > ContainerType
size_t TraceBufCapacityGet()
std::map< const std::string, boost::weak_ptr< TraceBuffer< TraceEntryT > > > TraceBufMap
void TraceRead(const std::string &context, const int count, boost::function< void(TraceEntryT *, bool)> cb)
static Trace * GetInstance()
DISALLOW_COPY_AND_ASSIGN(TraceBuffer)
TraceBufMap trace_buf_map_
tbb::atomic< uint32_t > seqno_
void operator()(TraceBuffer< TraceEntryT > *trace_buffer) const
static const uint32_t kMaxSeqno
TraceBufMap & trace_buf_map_
static const uint32_t kMinSeqno
boost::shared_ptr< TraceBuffer< TraceEntryT > > TraceBufAdd(const std::string &buf_name, size_t size, bool trace_enable)
void TraceBufCapacityReset(size_t size)
tbb::atomic< bool > trace_enable_
void TraceWrite(TraceEntryT *trace_entry)
size_t TraceBufCapacityGet(const std::string &buf_name)