Changeset 77587 in vbox for trunk/src/VBox/Main/src-client
- Timestamp:
- Mar 6, 2019 4:40:18 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 129207
- Location:
- trunk/src/VBox/Main/src-client
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/src-client/GuestDirectoryImpl.cpp
r76958 r77587 231 231 232 232 /** 233 * Called by IGuestSession right before this directory gets 234 * removed from the public directory list. 235 */ 236 int GuestDirectory::i_onRemove(void) 237 { 233 * @copydoc GuestObject::i_onUnregister 234 */ 235 int GuestDirectory::i_onUnregister(void) 236 { 237 LogFlowThisFuncEnter(); 238 239 int vrc = VINF_SUCCESS; 240 241 LogFlowFuncLeaveRC(vrc); 242 return vrc; 243 } 244 245 /** 246 * @copydoc GuestObject::i_onSessionStatusChange 247 */ 248 int GuestDirectory::i_onSessionStatusChange(GuestSessionStatus_T enmSessionStatus) 249 { 250 RT_NOREF(enmSessionStatus); 251 238 252 LogFlowThisFuncEnter(); 239 253 -
trunk/src/VBox/Main/src-client/GuestFileImpl.cpp
r77387 r77587 617 617 618 618 /** 619 * Called by IGuestSession right before this file gets removed 620 * from the public file list. 619 * @copydoc GuestObject::i_onUnregister 621 620 */ 622 int GuestFile::i_on Remove(void)621 int GuestFile::i_onUnregister(void) 623 622 { 624 623 LogFlowThisFuncEnter(); … … 639 638 unconst(mEventSource).setNull(); 640 639 } 640 641 LogFlowFuncLeaveRC(vrc); 642 return vrc; 643 } 644 645 /** 646 * @copydoc GuestObject::i_onSessionStatusChange 647 */ 648 int GuestFile::i_onSessionStatusChange(GuestSessionStatus_T enmSessionStatus) 649 { 650 LogFlowThisFuncEnter(); 651 652 int vrc = VINF_SUCCESS; 653 654 /* If the session now is in a terminated state, set the file status 655 * to "down", as there is not much else we can do now. */ 656 if (GuestSession::i_isTerminated(enmSessionStatus)) 657 vrc = i_setFileStatus(FileStatus_Down, 0 /* fileRc, ignored */); 641 658 642 659 LogFlowFuncLeaveRC(vrc); -
trunk/src/VBox/Main/src-client/GuestProcessImpl.cpp
r77496 r77587 281 281 LogFlowThisFunc(("mExe=%s, PID=%RU32\n", mData.mProcess.mExecutable.c_str(), mData.mPID)); 282 282 283 /* Terminate process if not already done yet. */284 int rcGuest = VINF_SUCCESS;285 int vrc = i_terminateProcess(30 * 1000, &rcGuest); /** @todo Make timeouts configurable. */286 /* Note: Don't return here yet; first uninit all other stuff in287 * case of failure. */288 289 283 if (mData.mpSessionBaseEnv) 290 284 { … … 295 289 baseUninit(); 296 290 297 LogFlowThisFunc(("Returning rc=%Rrc, rcGuest=%Rrc\n", vrc, rcGuest)); 298 RT_NOREF_PV(vrc); 291 LogFlowFuncLeave(); 299 292 } 300 293 … … 818 811 819 812 /** 820 * Called by IGuestSession right before this process gets 821 * removed from the public process list. 813 * @copydoc GuestObject::i_onUnregister 822 814 */ 823 int GuestProcess::i_on Remove(void)815 int GuestProcess::i_onUnregister(void) 824 816 { 825 817 LogFlowThisFuncEnter(); … … 839 831 mLocalListener.setNull(); 840 832 unconst(mEventSource).setNull(); 833 } 834 835 LogFlowFuncLeaveRC(vrc); 836 return vrc; 837 } 838 839 /** 840 * @copydoc GuestObject::i_onSessionStatusChange 841 */ 842 int GuestProcess::i_onSessionStatusChange(GuestSessionStatus_T enmSessionStatus) 843 { 844 LogFlowThisFuncEnter(); 845 846 int vrc = VINF_SUCCESS; 847 848 /* If the session now is in a terminated state, set the process status 849 * to "down", as there is not much else we can do now. */ 850 if (GuestSession::i_isTerminated(enmSessionStatus)) 851 { 852 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 853 854 vrc = i_setProcessStatus(ProcessStatus_Down, 0 /* rc, ignored */); 841 855 } 842 856 -
trunk/src/VBox/Main/src-client/GuestSessionImpl.cpp
r77583 r77587 227 227 * objects (like files, directories, ...) which are bound to this session. 228 228 */ 229 int rc = i_objectRegister( SESSIONOBJECTTYPE_SESSION, &mData.mObjectID);229 int rc = i_objectRegister(NULL /* pObject */, SESSIONOBJECTTYPE_SESSION, &mData.mObjectID); 230 230 if (RT_SUCCESS(rc)) 231 231 { … … 306 306 LogFlowThisFuncEnter(); 307 307 308 /* Call i_onRemove to take care of the object cleanups. */ 309 i_onRemove(); 310 308 311 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 309 310 LogFlowThisFunc(("Closing directories (%zu total)\n",311 mData.mDirectories.size()));312 for (SessionDirectories::iterator itDirs = mData.mDirectories.begin();313 itDirs != mData.mDirectories.end(); ++itDirs)314 {315 itDirs->second->i_onRemove();316 itDirs->second->uninit();317 }318 mData.mDirectories.clear();319 320 LogFlowThisFunc(("Closing files (%zu total)\n",321 mData.mFiles.size()));322 for (SessionFiles::iterator itFiles = mData.mFiles.begin();323 itFiles != mData.mFiles.end(); ++itFiles)324 {325 itFiles->second->i_onRemove();326 itFiles->second->uninit();327 }328 mData.mFiles.clear();329 330 LogFlowThisFunc(("Closing processes (%zu total)\n",331 mData.mProcesses.size()));332 for (SessionProcesses::iterator itProcs = mData.mProcesses.begin();333 itProcs != mData.mProcesses.end(); ++itProcs)334 {335 itProcs->second->i_onRemove();336 itProcs->second->uninit();337 }338 mData.mProcesses.clear();339 312 340 313 /* Unregister the session's object ID. */ 341 314 i_objectUnregister(mData.mObjectID); 342 315 316 Assert(mData.mObjects.size () == 0); 343 317 mData.mObjects.clear(); 344 318 … … 1034 1008 idObject, mData.mSession.mID, mData.mDirectories.size())); 1035 1009 1036 rc = pDirConsumed->i_on Remove();1010 rc = pDirConsumed->i_onUnregister(); 1037 1011 AssertRCReturn(rc, rc); 1038 1012 … … 1161 1135 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 1162 1136 1163 /* Register a new object ID. */1164 uint32_t idObject;1165 int rc = i_objectRegister(SESSIONOBJECTTYPE_DIRECTORY, &idObject);1166 if (RT_FAILURE(rc))1167 return rc;1168 1169 1137 /* Create the directory object. */ 1170 1138 HRESULT hr = pDirectory.createObject(); 1171 1139 if (FAILED(hr)) 1172 1140 return VERR_COM_UNEXPECTED; 1141 1142 /* Register a new object ID. */ 1143 uint32_t idObject; 1144 int rc = i_objectRegister(pDirectory, SESSIONOBJECTTYPE_DIRECTORY, &idObject); 1145 if (RT_FAILURE(rc)) 1146 { 1147 pDirectory.setNull(); 1148 return rc; 1149 } 1173 1150 1174 1151 Console *pConsole = mParent->i_getConsole(); … … 1433 1410 pFileConsumed->getObjectID(), mData.mSession.mID, mData.mFiles.size())); 1434 1411 1435 rc = pFileConsumed->i_on Remove();1412 rc = pFileConsumed->i_onUnregister(); 1436 1413 AssertRCReturn(rc, rc); 1437 1414 … … 1519 1496 } 1520 1497 1521 /* Register a new object ID. */1522 uint32_t idObject;1523 int rc = i_objectRegister(SESSIONOBJECTTYPE_FILE, &idObject);1524 if (RT_FAILURE(rc))1525 return rc;1526 1527 1498 /* Create the directory object. */ 1528 1499 HRESULT hr = pFile.createObject(); 1529 1500 if (FAILED(hr)) 1530 1501 return VERR_COM_UNEXPECTED; 1502 1503 /* Register a new object ID. */ 1504 uint32_t idObject; 1505 int rc = i_objectRegister(pFile, SESSIONOBJECTTYPE_FILE, &idObject); 1506 if (RT_FAILURE(rc)) 1507 { 1508 pFile.setNull(); 1509 return rc; 1510 } 1531 1511 1532 1512 Console *pConsole = mParent->i_getConsole(); … … 1760 1740 1761 1741 /** 1762 * Returns whether the session is ina terminated state or not.1742 * Returns whether a session status implies a terminated state or not. 1763 1743 * 1764 * @returns \c true if i na terminated state, or \c false if not.1744 * @returns \c true if it's a terminated state, or \c false if not. 1765 1745 */ 1766 bool GuestSession::i_isTerminated(void) const 1767 { 1768 switch (mData.mStatus) 1746 /* static */ 1747 bool GuestSession::i_isTerminated(GuestSessionStatus_T enmStatus) 1748 { 1749 switch (enmStatus) 1769 1750 { 1770 1751 case GuestSessionStatus_Terminated: … … 1787 1768 1788 1769 /** 1770 * Returns whether the session is in a terminated state or not. 1771 * 1772 * @returns \c true if in a terminated state, or \c false if not. 1773 */ 1774 bool GuestSession::i_isTerminated(void) const 1775 { 1776 return GuestSession::i_isTerminated(mData.mStatus); 1777 } 1778 1779 /** 1789 1780 * Called by IGuest right before this session gets removed from 1790 1781 * the public session list. … … 1796 1787 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 1797 1788 1798 int vrc = VINF_SUCCESS;1789 int vrc = i_objectsUnregister(); 1799 1790 1800 1791 /* … … 2087 2078 * @retval VERR_GSTCTL_MAX_OBJECTS_REACHED if the maximum of concurrent objects 2088 2079 * is reached. 2080 * @param pObject Guest object to register (weak pointer). Optional. 2089 2081 * @param enmType Session object type to register. 2090 * @param pidObject Where to return the object ID on success. 2082 * @param pidObject Where to return the object ID on success. Optional. 2091 2083 */ 2092 int GuestSession::i_objectRegister(SESSIONOBJECTTYPE enmType, uint32_t *pidObject) 2093 { 2084 int GuestSession::i_objectRegister(GuestObject *pObject, SESSIONOBJECTTYPE enmType, uint32_t *pidObject) 2085 { 2086 /* pObject can be NULL. */ 2087 /* pidObject is optional. */ 2088 2094 2089 /* 2095 2090 * Pick a random bit as starting point. If it's in use, search forward … … 2121 2116 try 2122 2117 { 2118 mData.mObjects[idObject].pObject = pObject; /* Can be NULL. */ 2123 2119 mData.mObjects[idObject].enmType = enmType; 2124 2120 mData.mObjects[idObject].msBirth = RTTimeMilliTS(); … … 2130 2126 } 2131 2127 2132 alock.release();2133 2134 *pidObject = idObject; 2128 if (pidObject) 2129 *pidObject = idObject; 2130 2135 2131 return VINF_SUCCESS; 2136 2132 } 2137 2133 2138 2134 /** 2139 * Unregisters an object from a session.2135 * Unregisters an object from the session objects list. 2140 2136 * 2141 2137 * @retval VINF_SUCCESS on success. … … 2155 2151 2156 2152 return rc; 2153 } 2154 2155 /** 2156 * Unregisters all objects from the session list. 2157 * 2158 * @returns VBox status code. 2159 */ 2160 int GuestSession::i_objectsUnregister(void) 2161 { 2162 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 2163 2164 LogFlowThisFunc(("Unregistering directories (%zu total)\n", mData.mDirectories.size())); 2165 2166 SessionDirectories::iterator itDirs; 2167 while ((itDirs = mData.mDirectories.begin()) != mData.mDirectories.end()) 2168 { 2169 alock.release(); 2170 i_directoryUnregister(itDirs->second); 2171 alock.acquire(); 2172 } 2173 2174 Assert(mData.mDirectories.size() == 0); 2175 mData.mDirectories.clear(); 2176 2177 LogFlowThisFunc(("Unregistering files (%zu total)\n", mData.mFiles.size())); 2178 2179 SessionFiles::iterator itFiles; 2180 while ((itFiles = mData.mFiles.begin()) != mData.mFiles.end()) 2181 { 2182 alock.release(); 2183 i_fileUnregister(itFiles->second); 2184 alock.acquire(); 2185 } 2186 2187 Assert(mData.mFiles.size() == 0); 2188 mData.mFiles.clear(); 2189 2190 LogFlowThisFunc(("Unregistering processes (%zu total)\n", mData.mProcesses.size())); 2191 2192 SessionProcesses::iterator itProcs; 2193 while ((itProcs = mData.mProcesses.begin()) != mData.mProcesses.end()) 2194 { 2195 alock.release(); 2196 i_processUnregister(itProcs->second); 2197 alock.acquire(); 2198 } 2199 2200 Assert(mData.mProcesses.size() == 0); 2201 mData.mProcesses.clear(); 2202 2203 return VINF_SUCCESS; 2204 } 2205 2206 /** 2207 * Notifies all registered objects about a session status change. 2208 * 2209 * @returns VBox status code. 2210 * @param enmSessionStatus Session status to notify objects about. 2211 */ 2212 int GuestSession::i_objectsNotifyAboutStatusChange(GuestSessionStatus_T enmSessionStatus) 2213 { 2214 LogFlowThisFunc(("enmSessionStatus=%RU32\n", enmSessionStatus)); 2215 2216 int vrc = VINF_SUCCESS; 2217 2218 SessionObjects::iterator itObjs = mData.mObjects.begin(); 2219 while (itObjs != mData.mObjects.end()) 2220 { 2221 GuestObject *pObj = itObjs->second.pObject; 2222 if (pObj) /* pObject can be NULL (weak pointer). */ 2223 { 2224 int vrc2 = pObj->i_onSessionStatusChange(enmSessionStatus); 2225 if (RT_SUCCESS(vrc)) 2226 vrc = vrc2; 2227 2228 /* If the session got terminated, make sure to cancel all wait events for 2229 * the current object. */ 2230 if (i_isTerminated()) 2231 pObj->cancelWaitEvents(); 2232 } 2233 2234 ++itObjs; 2235 } 2236 2237 LogFlowFuncLeaveRC(vrc); 2238 return vrc; 2157 2239 } 2158 2240 … … 2333 2415 idObject, mData.mSession.mID, uPID, mData.mProcesses.size())); 2334 2416 2335 rc = pProcess->i_on Remove();2417 rc = pProcess->i_onUnregister(); 2336 2418 AssertRCReturn(rc, rc); 2337 2419 … … 2414 2496 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 2415 2497 2416 /* Register a new object ID. */2417 uint32_t idObject;2418 int rc = i_objectRegister(SESSIONOBJECTTYPE_PROCESS, &idObject);2419 if (RT_FAILURE(rc))2420 return rc;2421 2422 2498 /* Create the process object. */ 2423 2499 HRESULT hr = pProcess.createObject(); 2424 2500 if (FAILED(hr)) 2425 2501 return VERR_COM_UNEXPECTED; 2502 2503 /* Register a new object ID. */ 2504 uint32_t idObject; 2505 int rc = i_objectRegister(pProcess, SESSIONOBJECTTYPE_PROCESS, &idObject); 2506 if (RT_FAILURE(rc)) 2507 { 2508 pProcess.setNull(); 2509 return rc; 2510 } 2426 2511 2427 2512 rc = pProcess->init(mParent->i_getConsole() /* Console */, this /* Session */, idObject, … … 2551 2636 AssertMsg(RT_SUCCESS(sessionRc), ("Guest rc must not be an error (%Rrc)\n", sessionRc)); 2552 2637 2638 int vrc = VINF_SUCCESS; 2639 2553 2640 if (mData.mStatus != sessionStatus) 2554 2641 { 2555 2642 mData.mStatus = sessionStatus; 2556 2643 mData.mRC = sessionRc; 2644 2645 /* Make sure to notify all underlying objects first. */ 2646 vrc = i_objectsNotifyAboutStatusChange(sessionStatus); 2557 2647 2558 2648 ComObjPtr<VirtualBoxErrorInfo> errorInfo; … … 2568 2658 } 2569 2659 2570 return VINF_SUCCESS; 2660 LogFlowFuncLeaveRC(vrc); 2661 return vrc; 2571 2662 } 2572 2663
Note:
See TracChangeset
for help on using the changeset viewer.