/** * Send a message to the async window thread and wait for a reply * * @returns VBox status code. * @param pWindowThread Thread handle * @param WndRequestSem Semaphore handle for waiting * @param msg Message id * @param wParam First parameter * @param lParam Second parameter */ int vmsvga3dSendThreadMessage(RTTHREAD pWindowThread, RTSEMEVENT WndRequestSem, UINT msg, WPARAM wParam, LPARAM lParam) { int rc; BOOL ret; ret = PostThreadMessage(RTThreadGetNative(pWindowThread), msg, wParam, lParam); AssertMsgReturn(ret, ("PostThreadMessage %x failed with %d\n", RTThreadGetNative(pWindowThread), GetLastError()), VERR_INTERNAL_ERROR); rc = RTSemEventWait(WndRequestSem, RT_INDEFINITE_WAIT); Assert(RT_SUCCESS(rc)); return rc; }
Display* stubGetWindowDisplay(WindowInfo *pWindow) { #if defined(CR_NEWWINTRACK) if ((NIL_RTTHREAD!=stub.hSyncThread) && (RTThreadNativeSelf()==RTThreadGetNative(stub.hSyncThread))) { if (pWindow && pWindow->dpy && !pWindow->syncDpy) { crDebug("going to XOpenDisplay(%s)", pWindow->dpyName); pWindow->syncDpy = XOpenDisplay(pWindow->dpyName); if (!pWindow->syncDpy) { crWarning("Failed to open display %s", pWindow->dpyName); } return pWindow->syncDpy; } else { return pWindow ? pWindow->syncDpy:NULL; } } else #endif { return pWindow ? pWindow->dpy:NULL; } }
/** * Entry point. */ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv) { /* * Instantiate the DHCP server and hand it the options. */ VBoxNetDhcp *pDhcp = new VBoxNetDhcp(); if (!pDhcp) { RTStrmPrintf(g_pStdErr, "VBoxNetDHCP: new VBoxNetDhcp failed!\n"); return 1; } RTEXITCODE rcExit = (RTEXITCODE)pDhcp->parseArgs(argc - 1, argv + 1); if (rcExit != RTEXITCODE_SUCCESS) return rcExit; #ifdef RT_OS_WINDOWS /* DIFx hack. */ RTTHREAD hMakeUseKillableThread = NIL_RTTHREAD; int rc2 = RTThreadCreate(&hMakeUseKillableThread, DIFxKillableProcessThreadProc, NULL, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "DIFxKill"); if (RT_FAILURE(rc2)) hMakeUseKillableThread = NIL_RTTHREAD; #endif pDhcp->init(); /* * Try connect the server to the network. */ int rc = pDhcp->tryGoOnline(); if (RT_SUCCESS(rc)) { /* * Process requests. */ g_pDhcp = pDhcp; rc = pDhcp->run(); pDhcp->done(); g_pDhcp = NULL; } delete pDhcp; #ifdef RT_OS_WINDOWS /* Kill DIFx hack. */ if (hMakeUseKillableThread != NIL_RTTHREAD) { g_fExitProcessOnQuit = false; PostThreadMessage((DWORD)RTThreadGetNative(hMakeUseKillableThread), WM_QUIT, 0, 0); RTThreadWait(hMakeUseKillableThread, RT_MS_1SEC * 5U, NULL); } #endif return RT_SUCCESS(rc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE; }
static void stubSPUSafeTearDown(void) { #ifdef CHROMIUM_THREADSAFE CRmutex *mutex; #endif if (!stub_initialized) return; stub_initialized = 0; #ifdef CHROMIUM_THREADSAFE mutex = &stub.mutex; crLockMutex(mutex); #endif crDebug("stubSPUSafeTearDown"); #ifdef WINDOWS # ifndef CR_NEWWINTRACK stubUninstallWindowMessageHook(); # endif #endif #if defined(CR_NEWWINTRACK) crUnlockMutex(mutex); # if defined(WINDOWS) if (RTThreadGetState(stub.hSyncThread)!=RTTHREADSTATE_TERMINATED) { HANDLE hNative; DWORD ec=0; hNative = OpenThread(SYNCHRONIZE|THREAD_QUERY_INFORMATION|THREAD_TERMINATE, false, RTThreadGetNative(stub.hSyncThread)); if (!hNative) { crWarning("Failed to get handle for sync thread(%#x)", GetLastError()); } else { crDebug("Got handle %p for thread %#x", hNative, RTThreadGetNative(stub.hSyncThread)); } ASMAtomicWriteBool(&stub.bShutdownSyncThread, true); if (PostThreadMessage(RTThreadGetNative(stub.hSyncThread), WM_QUIT, 0, 0)) { RTThreadWait(stub.hSyncThread, 1000, NULL); /*Same issue as on linux, RTThreadWait exits before system thread is terminated, which leads * to issues as our dll goes to be unloaded. *@todo *We usually call this function from DllMain which seems to be holding some lock and thus we have to * kill thread via TerminateThread. */ if (WaitForSingleObject(hNative, 100)==WAIT_TIMEOUT) { crDebug("Wait failed, terminating"); if (!TerminateThread(hNative, 1)) { crDebug("TerminateThread failed"); } } if (GetExitCodeThread(hNative, &ec)) { crDebug("Thread %p exited with ec=%i", hNative, ec); } else { crDebug("GetExitCodeThread failed(%#x)", GetLastError()); } } else { crDebug("Sync thread killed before DLL_PROCESS_DETACH"); } if (hNative) { CloseHandle(hNative); } } #else if (stub.hSyncThread!=NIL_RTTHREAD) { ASMAtomicWriteBool(&stub.bShutdownSyncThread, true); { /*RTThreadWait might return too early, which cause our code being unloaded while RT thread wrapper is still running*/ int rc = pthread_join(RTThreadGetNative(stub.hSyncThread), NULL); if (!rc) { crDebug("pthread_join failed %i", rc); } } } #endif crLockMutex(mutex); #endif #ifndef WINDOWS crNetTearDown(); #endif #ifdef CHROMIUM_THREADSAFE crUnlockMutex(mutex); crFreeMutex(mutex); #endif crMemset(&stub, 0, sizeof(stub)); }
RTR3DECL(int) RTTimerDestroy(PRTTIMER pTimer) { /* NULL is ok. */ if (!pTimer) return VINF_SUCCESS; /* * Validate handle first. */ int rc; if ( VALID_PTR(pTimer) && pTimer->u32Magic == RTTIMER_MAGIC) { #ifdef USE_WINMM /* * Kill the timer and exit. */ rc = timeKillEvent(pTimer->TimerId); AssertMsg(rc == TIMERR_NOERROR, ("timeKillEvent -> %d\n", rc)); ASMAtomicXchgU32(&pTimer->u32Magic, RTTIMER_MAGIC + 1); RTThreadSleep(1); #else /* !USE_WINMM */ /* * Signal that we want the thread to exit. */ ASMAtomicXchgU32(&pTimer->u32Magic, RTTIMER_MAGIC + 1); #ifdef USE_APC SetEvent(pTimer->hevWait); CloseHandle(pTimer->hevWait); rc = CancelWaitableTimer(pTimer->hTimer); AssertMsg(rc, ("CancelWaitableTimer lasterr=%d\n", GetLastError())); #else LARGE_INTEGER ll = {0}; ll.LowPart = 100; rc = SetWaitableTimer(pTimer->hTimer, &ll, 0, NULL, NULL, FALSE); AssertMsg(rc, ("CancelWaitableTimer lasterr=%d\n", GetLastError())); #endif /* * Wait for the thread to exit. * And if it don't wanna exit, we'll get kill it. */ rc = RTThreadWait(pTimer->Thread, 1000, NULL); if (RT_FAILURE(rc)) TerminateThread((HANDLE)RTThreadGetNative(pTimer->Thread), UINT32_MAX); /* * Free resource. */ rc = CloseHandle(pTimer->hTimer); AssertMsg(rc, ("CloseHandle lasterr=%d\n", GetLastError())); #endif /* !USE_WINMM */ RTMemFree(pTimer); return rc; } rc = VERR_INVALID_HANDLE; AssertMsgFailed(("Failed to destroy timer %p. rc=%d\n", pTimer, rc)); return rc; }