void Logger::log(const Level& level, std::string message, bool addRC) const { if (isLoggable(level)) { LogRecord* lr = new LogRecord(level, message, _name); # if defined(__linux) || defined(__unix) || defined(__APPLE__) pthread_mutex_lock(&Logger::lock); #endif if (onRecord != NULL) { onRecord(lr); delete lr; } else { Logger::logWrite(lr->toString(), addRC); delete lr; } # if defined(__linux) || defined(__unix) || defined(__APPLE__) pthread_mutex_unlock(&Logger::lock); #endif } }
void Recorder::messagePump() { XnStatus nRetVal = XN_STATUS_OK; Message msg = { Message::MESSAGE_NO_OPERATION, 0, NULL, {NULL}, 0, 0 }; { xnl::LockGuard<MessageQueue> guard(m_queue); nRetVal = m_queue.Pop(msg); } if (XN_STATUS_OK == nRetVal) { switch (msg.type) { case Message::MESSAGE_INITIALIZE: { onInitialize(); } break; case Message::MESSAGE_TERMINATE: { onTerminate(); m_running = FALSE; } break; case Message::MESSAGE_ATTACH: { xnl::LockGuard<AttachedStreams> streamsGuard(m_streams); AttachedStreams::Iterator i = m_streams.Find(msg.pStream); if (i != m_streams.End()) { onAttach(i->Value().nodeId, msg.pStream); } } break; case Message::MESSAGE_DETACH: { xnl::LockGuard<AttachedStreams> streamsGuard(m_streams); AttachedStreams::Iterator i = m_streams.Find(msg.pStream); if (i != m_streams.End()) { onDetach(i->Value().nodeId); XN_DELETE(m_streams[msg.pStream].pCodec); m_streams.Remove(msg.pStream); } } break; case Message::MESSAGE_START: { xnl::LockGuard<AttachedStreams> streamsGuard(m_streams); for (AttachedStreams::Iterator i = m_streams.Begin(), e = m_streams.End(); i != e; ++i) { onStart(i->Value().nodeId); } m_started = true; } break; case Message::MESSAGE_RECORD: { xnl::LockGuard<AttachedStreams> streamsGuard(m_streams); AttachedStreams::Iterator i = m_streams.Find(msg.pStream); if (i != m_streams.End()) { XnCodecBase* pCodec = m_streams[msg.pStream].pCodec; XnUInt32 frameId = ++m_streams[msg.pStream].frameId; XnUInt64 timestamp = 0; if (frameId > 1) { timestamp = m_streams[msg.pStream].lastOutputTimestamp + (msg.pFrame->timestamp - m_streams[msg.pStream].lastInputTimestamp); } m_streams[msg.pStream].lastInputTimestamp = msg.pFrame->timestamp; m_streams[msg.pStream].lastOutputTimestamp = timestamp; onRecord(i->Value().nodeId, pCodec, msg.pFrame, frameId, timestamp); msg.pStream->frameRelease(msg.pFrame); } } break; case Message::MESSAGE_RECORDPROPERTY: { xnl::LockGuard<AttachedStreams> streamsGuard(m_streams); AttachedStreams::Iterator i = m_streams.Find(msg.pStream); if (i != m_streams.End()) { onRecordProperty( i->Value().nodeId, msg.propertyId, msg.pData, msg.dataSize); } // free the temporary buffer allocated earlier xnOSFree((void*)msg.pData); } break; default: ; } } }