Changeset 75874 in vbox
- Timestamp:
- Dec 2, 2018 4:51:02 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/GuestControl/service.cpp
r75873 r75874 859 859 /** Map containing all connected clients, key is HGCM client ID. */ 860 860 ClientStateMap mClientStateMap; /**< @todo Use VBOXHGCMSVCFNTABLE::cbClient for this! */ 861 /** The current master client, NULL if none. */ 862 ClientState *m_pMasterClient; 861 863 /** The master HGCM client ID, UINT32_MAX if none. */ 862 864 uint32_t m_idMasterClient; … … 873 875 , mpfnHostCallback(NULL) 874 876 , mpvHostData(NULL) 877 , m_pMasterClient(NULL) 875 878 , m_idMasterClient(UINT32_MAX) 876 879 , m_fLegacyMode(true) … … 953 956 */ 954 957 ClientState *pClient; 955 try958 //try - can't currently throw anything. 956 959 { 957 960 pClient = new (pvClient) ClientState(pThis->mpHelpers, idClient); 958 961 } 959 catch (std::bad_alloc &)960 {961 return VERR_NO_MEMORY;962 }962 //catch (std::bad_alloc &) 963 //{ 964 // return VERR_NO_MEMORY; 965 //} 963 966 try 964 967 { … … 976 979 * one through the door. 977 980 */ 978 /** @todo make picking the master more dynamic/flexible .*/981 /** @todo make picking the master more dynamic/flexible? */ 979 982 if ( pThis->m_fLegacyMode 980 983 && pThis->m_idMasterClient == UINT32_MAX) … … 984 987 { 985 988 LogFunc(("Picking %u as master for now.\n", idClient)); 989 pThis->m_pMasterClient = pClient; 986 990 pThis->m_idMasterClient = idClient; 987 991 pClient->m_fIsMaster = true; … … 1039 1043 if (idClient == pThis->m_idMasterClient) 1040 1044 { 1045 pThis->m_pMasterClient = NULL; 1041 1046 pThis->m_idMasterClient = UINT32_MAX; 1047 1042 1048 GstCtrlPreparedSession *pCur, *pNext; 1043 1049 RTListForEachSafe(&pThis->m_PreparedSessions, pCur, pNext, GstCtrlPreparedSession, ListEntry) … … 1048 1054 pThis->m_cPreparedSessions = 0; 1049 1055 } 1056 else 1057 Assert(pClient != pThis->m_pMasterClient); 1050 1058 1051 1059 if (pThis->mClientStateMap.empty()) … … 1119 1127 if (RT_SUCCESS(rc)) 1120 1128 { 1129 m_pMasterClient = pClient; 1121 1130 m_idMasterClient = pClient->m_idClient; 1122 1131 m_fLegacyMode = false; … … 1551 1560 ASSERT_GUEST_RETURN(!m_fLegacyMode, VERR_ACCESS_DENIED); 1552 1561 Assert(m_idMasterClient == pClient->m_idClient); 1562 Assert(m_pMasterClient == pClient); 1553 1563 1554 1564 /* Now that we know it's the master, we can check for session ID duplicates. */ … … 1614 1624 ASSERT_GUEST_RETURN(!m_fLegacyMode, VERR_ACCESS_DENIED); 1615 1625 Assert(m_idMasterClient == pClient->m_idClient); 1626 Assert(m_pMasterClient == pClient); 1616 1627 1617 1628 /* … … 1685 1696 ASSERT_GUEST_RETURN(!m_fLegacyMode, VERR_ACCESS_DENIED); 1686 1697 Assert(m_idMasterClient != pClient->m_idClient); 1698 Assert(m_pMasterClient != pClient); 1687 1699 ASSERT_GUEST_RETURN(pClient->m_idSession == UINT32_MAX, VERR_RESOURCE_BUSY); 1688 1700 … … 2149 2161 { 2150 2162 Assert(pHostCmd); 2151 ClientStateMapIter It = mClientStateMap.find(m_idMasterClient); 2152 if (It != mClientStateMap.end()) 2163 if (m_pMasterClient) 2153 2164 { 2154 ClientState *pClient = It->second; 2155 RTListAppend(&pClient->m_HostCmdList, &pHostCmd->m_ListEntry); 2165 RTListAppend(&m_pMasterClient->m_HostCmdList, &pHostCmd->m_ListEntry); 2156 2166 pHostCmd = NULL; 2157 2167 2158 int rc2 = pClient->Wakeup(); 2159 LogFlowFunc(("Woke up client ID=%RU32 (master) -> rc=%Rrc\n", pClient->m_idClient, rc2)); 2168 int rc2 = m_pMasterClient->Wakeup(); 2169 LogFlowFunc(("Woke up client ID=%RU32 (master) -> rc=%Rrc\n", m_pMasterClient->m_idClient, rc2)); 2170 NOREF(rc2); 2160 2171 } 2161 2172 else … … 2206 2217 AssertPtrReturn(pThis, VERR_INVALID_POINTER); 2207 2218 2219 /* Note! We don't need to save the idSession here because it's only used 2220 for sessions and the sessions are not persistent across a state 2221 save/restore. The Main objects aren't there. Clients shuts down. 2222 Only the root service survives, so remember who that is and its mode. */ 2223 2208 2224 SSMR3PutU32(pSSM, 1); 2209 2225 SSMR3PutBool(pSSM, pThis->m_fLegacyMode); … … 2218 2234 GstCtrlService::svcLoadState(void *pvService, uint32_t idClient, void *pvClient, PSSMHANDLE pSSM, uint32_t uVersion) 2219 2235 { 2220 RT_NOREF(pvClient);2221 2236 SELF *pThis = reinterpret_cast<SELF *>(pvService); 2222 2237 AssertPtrReturn(pThis, VERR_INVALID_POINTER); 2238 ClientState *pClient = reinterpret_cast<ClientState *>(pvClient); 2239 AssertReturn(pClient, VERR_INVALID_CLIENT_ID); 2240 Assert(pClient->m_idClient == idClient); 2223 2241 2224 2242 if (uVersion >= HGCM_SAVED_STATE_VERSION) … … 2238 2256 rc = SSMR3GetBool(pSSM, &fIsMaster); 2239 2257 AssertRCReturn(rc, rc); 2258 2259 pClient->m_fIsMaster = fIsMaster; 2240 2260 if (fIsMaster) 2261 { 2262 pThis->m_pMasterClient = pClient; 2241 2263 pThis->m_idMasterClient = idClient; 2242 ClientStateMapIter It = pThis->mClientStateMap.find(idClient); 2243 if (It != pThis->mClientStateMap.end()) 2244 It->second->m_fIsMaster = fIsMaster; 2245 else 2246 AssertFailed(); 2264 } 2247 2265 } 2248 2266 else
Note:
See TracChangeset
for help on using the changeset viewer.

