void snvTrace(LPCTSTR lpszFormat, va_list argList) { TCHAR szBuffer[DTRACE_BUF_LEN]; if (_vsntprintf( szBuffer, DTRACE_BUF_LEN, lpszFormat, argList ) < 0) { szBuffer[DTRACE_BUF_LEN-1] = 0; } TCHAR szTime[32]; CreateTimeStamp(szTime, sizeof(szTime)); _tcscat(szTime, _T(" ")); TCHAR szBuffer1[DTRACE_BUF_LEN]; size_t iFormatLen = _tcslen(lpszFormat); BOOL bErrorReport = iFormatLen>6 && _tcscmp(lpszFormat + iFormatLen - 6, _T("[%08x]"))==0; size_t iTimeLen = _tcslen(szTime); if (_sntprintf( szBuffer1 + iTimeLen, DTRACE_BUF_LEN - iTimeLen - 1, //reserver for \n _T("P:%04d T:%04d ") TRACE_SUFFIX _T("%s%s"), ::GetCurrentProcessId(), ::GetCurrentThreadId(), bErrorReport?_T("Error:"):_T(""), szBuffer) < 0) { _tcscpy(szBuffer1 + DTRACE_BUF_LEN - 5, _T("...")); //reserver for \n } memcpy(szBuffer1, szTime, iTimeLen*sizeof(TCHAR)); _tcscat(szBuffer1, _T("\n")); DbgOut( szBuffer1 ); }
int64 CLinkerPipe::PushMsgToSend(CMsg& Msg,bool bUrgence){ assert(Msg.IsValid()); CLock lk(m_Mutex,this); ePipeline& Sender = Msg.GetSender(); ePipeline& Receiver = Msg.GetReceiver(); ePipeline& Letter = Msg.GetLetter(); int64 MsgID = Letter.GetID(); assert(MsgID != 0); if (MsgID==0) { return 0; } int64 EventID = Msg.GetEventID(); //把本地发送者地址用一个INT64代替 int64 SenderID = LocalAddress2SenderID(Sender); Sender.Clear(); Sender.PushInt(SenderID); //用时间戳代替源ID,对方返回此时间戳表示正常接受 int64 TimeStamp = CreateTimeStamp(); Msg.SetSourceID(TimeStamp); ePipeline* MsgPtr = (ePipeline*)Msg.Release(); Encrypt(MsgPtr); ePipeline Info; Info.PushInt(MsgID); Info.PushInt(EventID); Info.PushInt(TimeStamp); Info.PushInt(m_PendingMsgID); Info.PushInt(Size()); Info.PushInt(m_UrgenceMsg.Size()); m_Parent->NotifyLinkerState(this,LINKER_PUSH_MSG,Info); if (bUrgence) { m_UrgenceMsg.Push_Directly(MsgPtr); }else{ Push_Directly(MsgPtr); } return MsgID; };
int64 CLinkerPipe::LocalAddress2SenderID(ePipeline& LocalAddress) { assert(LocalAddress.Size()!=0); //CLock lk(m_Mutex); map<int64,ePipeline>::iterator It = m_LocalAddressList.begin(); while (It != m_LocalAddressList.end()) { ePipeline& Address = It->second; if(IsEqualAddress(Address,LocalAddress)){ return It->first; } It++; } int64 SenderID = CreateTimeStamp(); tstring s = GetTimer()->GetFullTime(SenderID); ePipeline& Address = m_LocalAddressList[SenderID]; Address<<LocalAddress; return SenderID; }
int main(int argc, char* argv[]) { char *srcFileName = 0; char *dtbFileName = 0; char *hstFileName = 0; // --- read command line parameter -------------------------------------- if (argc < 2 || argc > 4) { Help("Wong number of arguments"); return 1; } srcFileName = argv[1]; if (srcFileName == 0) { Help(); return 1; } for (int i=2; i<argc; i++) { if (argv[i][0] != '-') Help("Wrong argument"); switch (argv[i][1]) { case 'd': dtbFileName = &(argv[i][2]); break; case 'h': hstFileName = &(argv[i][2]); break; default: Help("Wong argument opti"); return 1; } } CreateTimeStamp(); // --- analyze C++ file ------------------------------------------ FILE *f; functList cmdList; CppParser parser; try { parser.Open(srcFileName); while(true) { parser.GetRpcExport(); parser.GetFunctionDecl(); cmdList.push_back(parser.GetFname() + '$' + parser.GetFparam()); printf("%s$%s\n", parser.GetFname().c_str(), parser.GetFparam().c_str()); } } catch (CPError e) { if (e.error != CPError::END_OF_FILE) { e.What(); return 1; } } parser.Close(); // --- create server functions if (dtbFileName) { f = fopen(dtbFileName, "wt"); if (!f) { printf("ERROR: could not create DTB code file\n"); return 1; } GenerateServerCodeHeader(f); GenerateServerCode(cmdList, f); GenerateServerCodeTrailer(cmdList, f); fclose(f); } // generate host functions if (hstFileName) { f = fopen(hstFileName, "wt"); if (!f) { printf("ERROR: could not create host code file\n"); return 2; } GenerateClientCodeHeader(cmdList, f); GenerateClientCode(cmdList, f); fclose(f); } // system("pause"); return 0; }