nsresult AsyncNoShutdownTest(int testNumber) { // This test gets a service, and also gets an async request for shutdown, // but the service doesn't get shut down because some other client (who's // not participating in the async shutdown game as he should) is // continuing to hang onto the service. This causes myServ variable to // get set to NULL, but the service doesn't get unloaded right away as // it should. nsresult err; err = BeginTest(testNumber); if (err != NS_OK) return err; // Create some other user of kIMyServiceCID, preventing it from // really going away: IMyService* otherClient; err = CallGetService(kIMyServiceCID, &otherClient); if (err != NS_OK) return err; err = AsyncShutdown(testNumber); if (err != NS_OK) return err; err = EndTest(testNumber); // Finally, release the other client. NS_RELEASE(otherClient); return err; }
// bShutdown = if true, then try proper shutdown by having // OnSipInitStateMachine do shutdown, unsubscribe, etc. void OnSipTapi::Disconnect(bool bShutdown) { Logger::log_debug(_T("OnSipTapi::Disconnect bShutdown=%d"),bShutdown); if ( bShutdown ) { AsyncShutdown(); TimeOut tmout(5000); while ( Poll() && !tmout.IsExpired() ) { Sleep(50); if ( IsShutdownComplete() ) { Logger::log_debug(_T("OnSipTapi::Disconnect shutdown complete") ); break; } } } Cleanup(); }
int main(void) { nsresult err, rv = 0; int testNumber = 0; err = NS_InitXPCOM2(nsnull, nsnull, nsnull); if (NS_FAILED(err)) { printf("NS_InitXPCOM2 failed\n"); return -1; } err = SimpleTest(++testNumber); if (err != NS_OK) { printf("test %d failed\n", testNumber); rv = -1; } if (rv == 0) { err = AsyncNoShutdownTest(++testNumber); if (err != NS_OK) { printf("test %d failed\n", testNumber); rv = -1; } } if (rv == 0) { err = AsyncShutdown(++testNumber); if (err != NS_OK) { printf("test %d failed\n", testNumber); rv = -1; } } if (rv == 0) printf("there was great success\n"); err = NS_ShutdownXPCOM(nsnull); NS_ASSERTION(NS_SUCCEEDED(err), "NS_ShutdownXPCOM failed"); return rv; }