void ErrorAssert(int line, const char* file, const char* fmt, ...) { #if defined(HS_DEBUGGING) || !defined(PLASMA_EXTERNAL_RELEASE) char msg[1024]; va_list args; va_start(args, fmt); vsnprintf(msg, arrsize(msg), fmt, args); #if defined(HS_DEBUGGING) #if defined(_MSC_VER) if (s_GuiAsserts) { if (_CrtDbgReport(_CRT_ASSERT, file, line, NULL, msg)) DebugBreakAlways(); } else #endif // _MSC_VER { DebugMsg("-------\nASSERTION FAILED:\nFile: %s Line: %i\nMessage: %s\n-------", file, line, msg); fflush(stderr); DebugBreakAlways(); } #endif // HS_DEBUGGING #else DebugBreakIfDebuggerPresent(); #endif // defined(HS_DEBUGGING) || !defined(PLASMA_EXTERNAL_RELEASE) }
void ErrorAssert(int line, const char file[], const char fmt[], ...) { #if defined(HS_DEBUGGING) || !defined(PLASMA_EXTERNAL_RELEASE) char msg[1024]; va_list args; va_start(args, fmt); vsnprintf(msg, sizeof(msg), fmt, args); #ifdef HS_DEBUGGING if (s_GuiAsserts) { if(_CrtDbgReport(_CRT_ASSERT, file, line, NULL, msg)) DebugBreak(); } else #endif // HS_DEBUGGING if (DebugIsDebuggerPresent()) { char str[] = "-------\nASSERTION FAILED:\nFile: %s Line: %i\nMessage: %s\n-------"; DebugMsg(str, file, line, msg); } #else DebugBreakIfDebuggerPresent(); #endif // defined(HS_DEBUGGING) || !defined(PLASMA_EXTERNAL_RELEASE) }
void plDispatch::IMsgDispatch() { if( !fMsgDispatchLock.TryLock() ) return; if( fMsgActive ) { fMsgDispatchLock.Unlock(); return; } fMsgActive = true; int responseLevel=0; fMsgCurrentMutex.Lock(); plMsgWrap* origTail = fMsgTail; while((fMsgCurrent = fMsgHead)) { IDequeue(&fMsgHead, &fMsgTail); fMsgCurrentMutex.Unlock(); plMessage* msg = fMsgCurrent->fMsg; bool nonLocalMsg = msg && msg->HasBCastFlag(plMessage::kNetNonLocal); #ifdef HS_DEBUGGING int watchIdx = fMsgWatch.Find(msg); if( fMsgWatch.kMissingIndex != watchIdx ) { fMsgWatch.Remove(watchIdx); #if HS_BUILD_FOR_WIN32 __asm { int 3 } #endif // HS_BUILD_FOR_WIN32 } #endif // HS_DEBUGGING static uint64_t startTicks = 0; if (plDispatchLogBase::IsLogging()) startTicks = hsTimer::GetFullTickCount(); int i, numReceivers=0; for( i = 0; fMsgCurrent && i < fMsgCurrent->GetNumReceivers(); i++ ) { const plKey& rcvKey = fMsgCurrent->GetReceiver(i); plReceiver* rcv = rcvKey ? plReceiver::ConvertNoRef(rcvKey->ObjectIsLoaded()) : nil; if( rcv ) { if (nonLocalMsg) { // localOnly objects should not get remote messages plSynchedObject* synchedObj = plSynchedObject::ConvertNoRef(rcv); if (synchedObj && !synchedObj->IsNetSynched() ) { continue; } if (plNetObjectDebuggerBase::GetInstance()) { // log net msg if this is a debug object hsKeyedObject* ko = hsKeyedObject::ConvertNoRef(rcv); if (plNetObjectDebuggerBase::GetInstance()->IsDebugObject(ko)) { hsLogEntry(plNetObjectDebuggerBase::GetInstance()->LogMsg( plString::Format("<RCV> object:%s, GameMessage %s st=%.3f rt=%.3f", ko->GetKeyName().c_str(), msg->ClassName(), hsTimer::GetSysSeconds(), hsTimer::GetSeconds()).c_str())); } } } #ifndef PLASMA_EXTERNAL_RELEASE uint32_t rcvTicks = hsTimer::GetPrecTickCount(); // Object could be deleted by this message, so we need to log this stuff now plString keyname = "(unknown)"; const char* className = "(unknown)"; uint32_t clonePlayerID = 0; if (plDispatchLogBase::IsLoggingLong()) { hsKeyedObject* ko = hsKeyedObject::ConvertNoRef(rcv); if (ko) { keyname = ko->GetKeyName(); clonePlayerID = ko->GetKey()->GetUoid().GetClonePlayerID(); className = ko->ClassName(); } } #endif // PLASMA_EXTERNAL_RELEASE #ifdef HS_DEBUGGING if (msg->GetBreakBeforeDispatch()) DebugBreakIfDebuggerPresent(); #endif plProfile_BeginTiming(MsgReceive); rcv->MsgReceive(msg); plProfile_EndTiming(MsgReceive); #ifndef PLASMA_EXTERNAL_RELEASE if (plDispatchLogBase::IsLoggingLong()) { rcvTicks = hsTimer::GetPrecTickCount() - rcvTicks; float rcvTime = (float)(hsTimer::PrecTicksToSecs(rcvTicks) * 1000.f); // If the receiver takes more than 5 ms to process its message, log it if (rcvTime > 5.f) plDispatchLogBase::GetInstance()->LogLongReceive(keyname.c_str(), className, clonePlayerID, msg, rcvTime); } #endif // PLASMA_EXTERNAL_RELEASE numReceivers++; if (fMsgRecieveCallback != nil) fMsgRecieveCallback(); } } // for message logging // if (plDispatchLogBase::IsLogging()) // { // float sendTime = hsTimer::FullTicksToMs(hsTimer::GetFullTickCount() - startTicks); // // plDispatchLogBase::GetInstance()->DumpMsg(msg, numReceivers, (int)sendTime, responseLevel*2 /* indent */); // if (origTail==fMsgCurrent) // { // if we deliver more msgs after this, they must be response msgs // responseLevel++; // origTail = fMsgTail; // } // } fMsgCurrentMutex.Lock(); delete fMsgCurrent; // TEMP fMsgCurrent = (class plMsgWrap *)0xdeadc0de; }