/** * Initialize CPU hot plugging. * * This will enable the CPU hot plugging events. * * @returns VBox status code. */ VBGLR3DECL(int) VbglR3CpuHotPlugInit(void) { int rc = VbglR3CtlFilterMask(VMMDEV_EVENT_CPU_HOTPLUG, 0); if (RT_FAILURE(rc)) return rc; VMMDevCpuHotPlugStatusRequest Req; vmmdevInitRequest(&Req.header, VMMDevReq_SetCpuHotPlugStatus); Req.enmStatusType = VMMDevCpuStatusType_Enable; rc = vbglR3GRPerform(&Req.header); if (RT_FAILURE(rc)) VbglR3CtlFilterMask(0, VMMDEV_EVENT_CPU_HOTPLUG); return rc; }
/** * initialise the service. */ int SeamlessMain::init(void) { int rc; const char *pcszStage; LogRelFlowFunc(("\n")); do { pcszStage = "Connecting to the X server"; rc = mX11Monitor.init(sendRegionUpdate); if (RT_FAILURE(rc)) break; pcszStage = "Setting guest IRQ filter mask"; rc = VbglR3CtlFilterMask(VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST, 0); if (RT_FAILURE(rc)) break; pcszStage = "Reporting support for seamless capability"; rc = VbglR3SeamlessSetCap(true); if (RT_FAILURE(rc)) break; rc = startX11MonitorThread(); if (RT_FAILURE(rc)) break; } while(0); if (RT_FAILURE(rc)) VBClFatalError(("VBoxClient (seamless): failed to start. Stage: \"%s\" Error: %Rrc\n", pcszStage, rc)); return rc; }
/** Stops the service. */ void SeamlessMain::stop() { LogRelFlowFunc(("\n")); VbglR3SeamlessSetCap(false); VbglR3CtlFilterMask(0, VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST); stopX11MonitorThread(); mX11Monitor.uninit(); LogRelFlowFunc(("returning\n")); }
/** * Terminate CPU hot plugging. * * This will disable the CPU hot plugging events. * * @returns VBox status. */ VBGLR3DECL(int) VbglR3CpuHotPlugTerm(void) { /* Clear the events. */ VbglR3CtlFilterMask(0, VMMDEV_EVENT_CPU_HOTPLUG); VMMDevCpuHotPlugStatusRequest Req; vmmdevInitRequest(&Req.header, VMMDevReq_SetCpuHotPlugStatus); Req.enmStatusType = VMMDevCpuStatusType_Disable; return vbglR3GRPerform(&Req.header); }
void cleanupDisplay(void) { uint32_t fMouseFeatures = 0; LogRelFlowFunc(("\n")); VbglR3CtlFilterMask(0, VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED); int rc = VbglR3GetMouseStatus(&fMouseFeatures, NULL, NULL); if (RT_SUCCESS(rc)) VbglR3SetMouseStatus( fMouseFeatures | VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR); LogRelFlowFunc(("returning\n")); }
status_t VBoxDisplayService::_ServiceThread() { LogFlow(("VBoxDisplayService::_ServiceThread")); VbglR3CtlFilterMask(VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST, 0); VbglR3SetGuestCaps(VMMDEV_GUEST_SUPPORTS_GRAPHICS, 0); for (;;) { uint32_t events; int rc = VbglR3WaitEvent(VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST, 5000, &events); if (rc == -6) // timed out? continue; if (RT_SUCCESS(rc)) { uint32_t cx, cy, cBits, iDisplay; int rc2 = VbglR3GetDisplayChangeRequest(&cx, &cy, &cBits, &iDisplay, true); LogFlow(("rc2=%d screen %d size changed (%d, %d, %d)\n", rc2, iDisplay, cx, cy, cBits)); if (RT_SUCCESS(rc2)) { display_mode mode; fScreen.GetMode(&mode); if (cBits == 0) cBits = get_depth_for_color_space(mode.space); mode.timing.h_display = cx; mode.timing.v_display = cy; mode.space = get_color_space_for_depth(cBits); mode.virtual_width = cx; mode.virtual_height = cy; /*= { {0, cx, 0, 0, cBits * cx / 8, cy, 0, 0, cBits * cy / 8, 0}, get_color_space_for_depth(cBits), cx, cy, 0, 0, 0 };*/ fScreen.SetMode(&mode, false); } } else fExiting = true; LogFlow(("processed host event rc = %d\n", rc)); if (fExiting) break; } return 0; }
static int initDisplay(Display *pDisplay) { int rc = VINF_SUCCESS; uint32_t fMouseFeatures = 0; LogRelFlowFunc(("testing dynamic resizing\n")); int iDummy; if (!XRRQueryExtension(pDisplay, &iDummy, &iDummy)) rc = VERR_NOT_SUPPORTED; if (RT_SUCCESS(rc)) rc = VbglR3CtlFilterMask(VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST, 0); else VbglR3CtlFilterMask(0, VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST); /* Log and ignore the return value, as there is not much we can do with * it. */ LogRelFlowFunc(("dynamic resizing: result %Rrc\n", rc)); /* Enable support for switching between hardware and software cursors */ LogRelFlowFunc(("enabling relative mouse re-capturing support\n")); rc = VbglR3GetMouseStatus(&fMouseFeatures, NULL, NULL); if (RT_SUCCESS(rc)) { rc = VbglR3CtlFilterMask(VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED, 0); if (RT_SUCCESS(rc)) rc = VbglR3SetMouseStatus ( fMouseFeatures & ~VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR); } if (RT_FAILURE(rc)) { VbglR3CtlFilterMask(0, VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED); VbglR3SetMouseStatus( fMouseFeatures | VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR); } LogRelFlowFunc(("mouse re-capturing support: result %Rrc\n", rc)); return VINF_SUCCESS; }
/** @copydoc VBOXSERVICE::pfnWorker */ DECLCALLBACK(int) VBoxServiceVMStatsWorker(bool volatile *pfShutdown) { int rc = VINF_SUCCESS; /* Start monitoring of the stat event change event. */ rc = VbglR3CtlFilterMask(VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST, 0); if (RT_FAILURE(rc)) { VBoxServiceVerbose(3, "VBoxServiceVMStatsWorker: VbglR3CtlFilterMask failed with %d\n", rc); return rc; } /* * Tell the control thread that it can continue * spawning services. */ RTThreadUserSignal(RTThreadSelf()); /* * Now enter the loop retrieving runtime data continuously. */ for (;;) { uint32_t fEvents = 0; RTMSINTERVAL cWaitMillies; /* Check if an update interval change is pending. */ rc = VbglR3WaitEvent(VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST, 0 /* no wait */, &fEvents); if ( RT_SUCCESS(rc) && (fEvents & VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST)) { VbglR3StatQueryInterval(&gCtx.cMsStatInterval); } if (gCtx.cMsStatInterval) { VBoxServiceVMStatsReport(); cWaitMillies = gCtx.cMsStatInterval; } else cWaitMillies = 3000; /* * Block for a while. * * The event semaphore takes care of ignoring interruptions and it * allows us to implement service wakeup later. */ if (*pfShutdown) break; int rc2 = RTSemEventMultiWait(g_VMStatEvent, cWaitMillies); if (*pfShutdown) break; if (rc2 != VERR_TIMEOUT && RT_FAILURE(rc2)) { VBoxServiceError("VBoxServiceVMStatsWorker: RTSemEventMultiWait failed; rc2=%Rrc\n", rc2); rc = rc2; break; } } /* Cancel monitoring of the stat event change event. */ rc = VbglR3CtlFilterMask(0, VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST); if (RT_FAILURE(rc)) VBoxServiceVerbose(3, "VBoxServiceVMStatsWorker: VbglR3CtlFilterMask failed with %d\n", rc); RTSemEventMultiDestroy(g_VMStatEvent); g_VMStatEvent = NIL_RTSEMEVENTMULTI; VBoxServiceVerbose(3, "VBoxStatsThread: finished statistics change request thread\n"); return 0; }