int GuestObject::callbackAdd(GuestCtrlCallback *pCallback, uint32_t *puContextID) { const ComObjPtr<GuestSession> pSession(mObject.mSession); Assert(!pSession.isNull()); ULONG uSessionID = 0; pSession->COMGETTER(Id)(&uSessionID); /* Create a new context ID and assign it. */ int vrc = VERR_NOT_FOUND; ULONG uCount = mObject.mNextContextID++; ULONG uNewContextID = 0; ULONG uTries = 0; for (;;) { if (uCount == VBOX_GUESTCTRL_MAX_CONTEXTS) uCount = 0; /* Create a new context ID ... */ uNewContextID = VBOX_GUESTCTRL_CONTEXTID_MAKE(uSessionID, mObject.mObjectID, uCount); /* Is the context ID already used? Try next ID ... */ if (!callbackExists(uCount)) { /* Callback with context ID was not found. This means * we can use this context ID for our new callback we want * to add below. */ vrc = VINF_SUCCESS; break; } uCount++; if (++uTries == UINT32_MAX) break; /* Don't try too hard. */ } if (RT_SUCCESS(vrc)) { /* Add callback with new context ID to our callback map. * Note: This is *not* uNewContextID (which also includes * the session + process ID), just the context count * will be used here. */ mObject.mCallbacks[uCount] = pCallback; Assert(mObject.mCallbacks.size()); /* Report back new context ID. */ if (puContextID) *puContextID = uNewContextID; LogFlowThisFunc(("Added new callback (Session: %RU32, Object: %RU32, Count: %RU32) CID=%RU32\n", uSessionID, mObject.mObjectID, uCount, uNewContextID)); } return vrc; }
int GuestBase::generateContextID(uint32_t uSessionID, uint32_t uObjectID, uint32_t *puContextID) { AssertPtrReturn(puContextID, VERR_INVALID_POINTER); uint32_t uCount = mNextContextID++; if (uCount == VBOX_GUESTCTRL_MAX_CONTEXTS) uCount = 0; uint32_t uNewContextID = VBOX_GUESTCTRL_CONTEXTID_MAKE(uSessionID, uObjectID, uCount); *puContextID = uNewContextID; return VINF_SUCCESS; }
int GuestBase::generateContextID(uint32_t uSessionID, uint32_t uObjectID, uint32_t *puContextID) { AssertPtrReturn(puContextID, VERR_INVALID_POINTER); if ( uSessionID >= VBOX_GUESTCTRL_MAX_SESSIONS || uObjectID >= VBOX_GUESTCTRL_MAX_OBJECTS) return VERR_INVALID_PARAMETER; uint32_t uCount = ASMAtomicIncU32(&mNextContextID); if (uCount == VBOX_GUESTCTRL_MAX_CONTEXTS) uCount = 0; uint32_t uNewContextID = VBOX_GUESTCTRL_CONTEXTID_MAKE(uSessionID, uObjectID, uCount); *puContextID = uNewContextID; #if 0 LogFlowThisFunc(("mNextContextID=%RU32, uSessionID=%RU32, uObjectID=%RU32, uCount=%RU32, uNewContextID=%RU32\n", mNextContextID, uSessionID, uObjectID, uCount, uNewContextID)); #endif return VINF_SUCCESS; }