TInt ThreadFunc(void* aData) { __UHEAP_MARK; CTrapCleanup* tc = CTrapCleanup::New(); TTEST(tc != NULL); TThreadData* data = static_cast<TThreadData*> (aData); TTEST(data != NULL); RSqlDatabase db; TInt err = db.Open(KTestDbName1); TTEST2(err, KErrNone); err = db.SetIsolationLevel(data->iIsolationLevel); TTEST2(err, KErrNone); if(data->iTransType == 1) { _LIT8(KBeginTrans, "BEGIN"); err = db.Exec(KBeginTrans); TTEST(err >= 0); } _LIT8(KInsertSql, "INSERT INTO A(Id) VALUES("); for(TInt id=data->iLowRecNo;id<=data->iHighRecNo;++id) { TBuf8<128> sql(KInsertSql); sql.AppendNum((TInt64)id); sql.Append(_L(")")); err = KSqlErrBusy; const TInt KAttempts = 20; for(TInt i=0;i<KAttempts&&err==KSqlErrBusy;++i) { err = db.Exec(sql); if(err == KSqlErrBusy) { RThread th; TName name = th.Name(); RDebug::Print(_L("!!!Database locked, Thread: %S, Attempt %d, column value %d\r\n"), &name, i + 1, id); User::After(1000000); } } TTEST2(err, 1); } if(data->iTransType == 1) { _LIT8(KCommitTrans, "COMMIT"); err = db.Exec(KCommitTrans); TTEST(err >= 0); } db.Close(); delete tc; __UHEAP_MARKEND; return KErrNone; }
// ========================================================================== // METHOD: Initialize // // DESIGN: // ========================================================================== TBool CDebugLogTlsData::Initialize() { TInt returnValue = ( iFs.Connect() == KErrNone ); if( returnValue ) { // Request notification of directory adds/deletes in the logs directory. iFs.NotifyChange( ENotifyDir, iStatus, KDebugLogsBaseDirectory ); SetActive(); // Dynamically create the name of the log files based on the application name // and thread ID. This will eliminate multiple processes/thread usage of // this debug logging infrastructure from scribbling each others traces. RProcess thisProcess; RThread thisThread; // The file name is the process name followed by the thread ID. TParsePtrC fileNameParser( thisProcess.FileName() ); iFileName.Copy( fileNameParser.Name() ); iFileName.Append( KUnderscore ); iFileName.Append( thisThread.Name() ); iFileName.Append( KDebugLogFileExt ); } // end if return returnValue; } // END Initialize
TInt ThreadFunc(TAny* anArgument) { CSharedData* mySharedData = reinterpret_cast<CSharedData*> (anArgument); RUndertaker u; u.Create(); TRequestStatus status; TInt deadThread; TBool clientWaiting = ETrue; FOREVER { status = KRequestPending; u.Logon(status,deadThread); // wait for the next thread to die. if (clientWaiting) { // rendezvous with the client so that they know we're ready. // This guarantees that we will catch at least the first panic to // occur (as long as we aren't closed before kernel tells us. RThread::Rendezvous(KErrNone); clientWaiting = EFalse; } User::WaitForRequest(status); // until we get back around to the top we are missing notifications now. // being high priority helps us, but still... // deal with this QUICKLY // get handle to the dead thread (this has already been marked for us in // the kernel) RThread t; t.SetHandle(deadThread); if (t.ExitType() == EExitPanic) { // the other ways threads can die are uninteresting TTime now; now.UniversalTime(); TThreadPanicDetails* tpd = new TThreadPanicDetails (t.Name(), t.ExitReason(),t.ExitCategory(),now); mySharedData->iPanicDetails.AppendL(tpd); } t.Close(); } }
void Check2(TInt aValue, TInt aExpected, TInt aLine, TBool aPrintThreadName = EFalse) { if(aValue != aExpected) { //DeleteTestFiles(); if(aPrintThreadName) { RThread th; TName name = th.Name(); RDebug::Print(_L("*** Thread %S, Line %d Expected error: %d, got: %d\r\n"), &name, aLine, aExpected, aValue); } else { RDebug::Print(_L("*** Line %d, Expected error: %d, got: %d\r\n"), aLine, aExpected, aValue); } TheTest(EFalse, aLine); } }
/////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////// //Test macros and functions void Check1(TInt aValue, TInt aLine, TBool aPrintThreadName = EFalse) { if(!aValue) { //DeleteTestFiles(); if(aPrintThreadName) { RThread th; TName name = th.Name(); RDebug::Print(_L("*** Thread %S, Line %d\r\n"), &name, aLine); } else { RDebug::Print(_L("*** Line %d\r\n"), aLine); } TheTest(EFalse, aLine); } }
void CSenServiceDispatcher::OpenDispatcherLogL() { #ifdef _SENDEBUG RThread thread; RProcess process; TFileName logFile; logFile.Append( KSenDispactherThreadLog().Left(KSenDispactherThreadLog().Length()-4) ); // exclude ".log" file extension logFile.AppendNum( iConnectionID ); logFile.Append( KSenUnderline ); logFile.Append( process.Name().Left(32)); logFile.Append( KSenUnderline ); logFile.Append( thread.Name().Left(20)); logFile.Append( KSenDispactherThreadLog().Right(4) ); // postfix with ".log" file extension // Open connection to the file logger server TLSLOG_OPEN( KSenDispatcherLogChannel, KSenDispatcherLogLevel, KSenDispactherThread, logFile ); TLSLOG_L(KSenDispatcherLogChannel, KSenDispatcherLogLevel, "CSenServiceDispatcher::ExecuteL - About to create new dispatcher thread.."); TLSLOG_FORMAT((KSenDispatcherLogChannel, KSenDispatcherLogLevel, _L("- Connection ID: (%d)"), iConnectionID)); #endif }