ScopedTryLock(IOLock* lock) : lock_(lock) {
   if (lock_) {
     if (! IOLockTryLock(lock_)) {
       // lock failed.
       lock_ = NULL;
     }
   }
 }
void BrcmPatchRAM::uploadFirmwareThread(void *arg, wait_result_t wait)
{
    DebugLog("sendFirmwareThread enter\n");

    // don't start firmware load when lock is held (instance is shutting down)
    if (IOLockTryLock(mLoadFirmwareLock))
    {
        BrcmPatchRAM* me = static_cast<BrcmPatchRAM*>(arg);
        me->resetDevice();
        IOSleep(20);
        me->uploadFirmware();
#ifndef TARGET_ELCAPITAN
        me->publishPersonality();
#endif
        me->scheduleWork(kWorkFinished);
        IOLockUnlock(mLoadFirmwareLock);
    }

    DebugLog("sendFirmwareThread termination\n");
    thread_terminate(current_thread());
    DebugLog("!!! sendFirmwareThread post-terminate !!! should not be here\n");
}