// // Should only stop if we are through with the module. // CancelWait has the side effect of losing all the keys and // current operations on the module!. (See the comment in // SECMOD_CancelWait for why this is so..). // void SmartCardMonitoringThread::Stop() { SECStatus rv; rv = SECMOD_CancelWait(mModule); if (rv != SECSuccess) { // we didn't wake up the Wait, so don't try to join the thread // otherwise we will hang forever... return; } // confused about the memory model here? NSPR owns the memory for // threads. non-joinable threads are freed when the thread dies. // joinable threads are freed after the call to PR_JoinThread. // That means if SECMOD_CancelWait fails, we'll leak the mThread // structure. this is considered preferable to hanging (which is // what will happen if we try to join a thread that blocked). if (mThread) { PR_JoinThread(mThread); mThread = 0; } }
static void on_watch_cancelled (GCancellable *cancellable, WatchSmartcardsOperation *operation) { SECMOD_CancelWait (operation->driver); }