VirtualBox::ClientWatcher::ClientWatcher(const ComObjPtr<VirtualBox> &pVirtualBox) : mVirtualBox(pVirtualBox), mThread(NIL_RTTHREAD), mUpdateReq(CWUPDATEREQARG), mLock(LOCKCLASS_OBJECTSTATE) { #if defined(RT_OS_WINDOWS) mUpdateReq = ::CreateEvent(NULL, FALSE, FALSE, NULL); #elif defined(RT_OS_OS2) RTSemEventCreate(&mUpdateReq); #elif defined(VBOX_WITH_SYS_V_IPC_SESSION_WATCHER) || defined(VBOX_WITH_GENERIC_SESSION_WATCHER) RTSemEventCreate(&mUpdateReq); /* start with high timeouts, nothing to do */ ASMAtomicUoWriteU8(&mUpdateAdaptCtr, 0); #else # error "Port me!" #endif int vrc = RTThreadCreate(&mThread, worker, (void *)this, 0, RTTHREADTYPE_MAIN_WORKER, RTTHREADFLAGS_WAITABLE, "Watcher"); AssertRC(vrc); }
/** * Sends a signal to the thread to rescan the clients/VMs having open sessions. */ void VirtualBox::ClientWatcher::update() { AssertReturnVoid(mThread != NIL_RTTHREAD); LogFlowFunc(("ping!\n")); /* sent an update request */ #if defined(RT_OS_WINDOWS) ASMAtomicWriteBool(&mfUpdateReq, true); ::SetEvent(mUpdateReq); #elif defined(RT_OS_OS2) RTSemEventSignal(mUpdateReq); #elif defined(VBOX_WITH_SYS_V_IPC_SESSION_WATCHER) /* use short timeouts, as we expect changes */ ASMAtomicUoWriteU8(&mUpdateAdaptCtr, RT_ELEMENTS(s_aUpdateTimeoutSteps) - 1); RTSemEventSignal(mUpdateReq); #elif defined(VBOX_WITH_GENERIC_SESSION_WATCHER) RTSemEventSignal(mUpdateReq); #else # error "Port me!" #endif }
VirtualBox::ClientWatcher::ClientWatcher(const ComObjPtr<VirtualBox> &pVirtualBox) : mVirtualBox(pVirtualBox), mThread(NIL_RTTHREAD), mUpdateReq(CWUPDATEREQARG), mLock(LOCKCLASS_OBJECTSTATE) { #if defined(RT_OS_WINDOWS) /* Misc state. */ mfTerminate = false; mcMsWait = INFINITE; mcActiveSubworkers = 0; /* Update request. The UpdateReq event is also used to wake up subthreads. */ mfUpdateReq = false; mUpdateReq = ::CreateEvent(NULL /*pSecAttr*/, TRUE /*fManualReset*/, FALSE /*fInitialState*/, NULL /*pszName*/); AssertRelease(mUpdateReq != NULL); /* Initialize the handle array. */ for (uint32_t i = 0; i < RT_ELEMENTS(mahWaitHandles); i++) mahWaitHandles[i] = NULL; for (uint32_t i = 0; i < RT_ELEMENTS(mahWaitHandles); i += CW_MAX_HANDLES_PER_THREAD) mahWaitHandles[i] = mUpdateReq; mcWaitHandles = 1; #elif defined(RT_OS_OS2) RTSemEventCreate(&mUpdateReq); #elif defined(VBOX_WITH_SYS_V_IPC_SESSION_WATCHER) || defined(VBOX_WITH_GENERIC_SESSION_WATCHER) RTSemEventCreate(&mUpdateReq); /* start with high timeouts, nothing to do */ ASMAtomicUoWriteU8(&mUpdateAdaptCtr, 0); #else # error "Port me!" #endif int vrc = RTThreadCreate(&mThread, worker, (void *)this, 0, RTTHREADTYPE_MAIN_WORKER, RTTHREADFLAGS_WAITABLE, "Watcher"); AssertRC(vrc); }