void SystemSingletonInternal::RegisterDestroyCallback() { GetSSILock().DoLock(); if (ShuttingDown) { GetSSILock().Unlock(); OnThreadDestroy(); } else { GetSSILock().Unlock(); // Insert the listener at the front of the list (top of the stack). This is an analogue of a C++ forward_list::push_front or stack::push. NextShutdownSingleton = SystemShutdownListenerList; SystemShutdownListenerList = this; } }
// // ThreadProc // // When this returns the thread exits // Return codes > 0 indicate an error occured DWORD CSourceStream::ThreadProc(void) { HRESULT hr; // the return code from calls Command com; do { com = GetRequest(); if (com != CMD_INIT) { DbgLog((LOG_ERROR, 1, TEXT("Thread expected init command"))); Reply((DWORD) E_UNEXPECTED); } } while (com != CMD_INIT); DbgLog((LOG_TRACE, 1, TEXT("CSourceStream worker thread initializing"))); hr = OnThreadCreate(); // perform set up tasks if (FAILED(hr)) { DbgLog((LOG_ERROR, 1, TEXT("CSourceStream::OnThreadCreate failed. Aborting thread."))); OnThreadDestroy(); Reply(hr); // send failed return code from OnThreadCreate return 1; } // Initialisation suceeded Reply(NOERROR); Command cmd; do { cmd = GetRequest(); switch (cmd) { case CMD_EXIT: Reply(NOERROR); break; case CMD_RUN: DbgLog((LOG_ERROR, 1, TEXT("CMD_RUN received before a CMD_PAUSE???"))); // !!! fall through??? case CMD_PAUSE: Reply(NOERROR); DoBufferProcessingLoop(); break; case CMD_STOP: Reply(NOERROR); break; default: DbgLog((LOG_ERROR, 1, TEXT("Unknown command %d received!"), cmd)); Reply((DWORD) E_NOTIMPL); break; } } while (cmd != CMD_EXIT); hr = OnThreadDestroy(); // tidy up. if (FAILED(hr)) { DbgLog((LOG_ERROR, 1, TEXT("CSourceStream::OnThreadDestroy failed. Exiting thread."))); return 1; } DbgLog((LOG_TRACE, 1, TEXT("CSourceStream worker thread exiting"))); return 0; }