Changeset 63584 in vbox
- Timestamp:
- Aug 18, 2016 11:48:04 AM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 110276
- Location:
- trunk/src/VBox/Main
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/include/MachineImpl.h
r62141 r63584 39 39 #include "Performance.h" 40 40 #include "PerformanceImpl.h" 41 #include "ThreadTask.h" 41 42 #endif /* VBOX_WITH_RESOURCE_USAGE_API */ 42 43 … … 790 791 * in here (implemented by the subclasses). 791 792 */ 792 struct Task 793 { 793 class Task : public ThreadTask 794 { 795 public: 794 796 Task(Machine *m, Progress *p, const Utf8Str &t) 795 : m_pMachine(m), 797 : ThreadTask(t), 798 m_pMachine(m), 796 799 m_machineCaller(m), 797 800 m_pProgress(p), 798 m_strTaskName(t),799 801 m_machineStateBackup(m->mData->mMachineState) // save the current machine state 800 802 {} 801 803 virtual ~Task(){} 802 803 HRESULT createThread()804 {805 int vrc = RTThreadCreate(NULL,806 taskHandler,807 (void *)this,808 0,809 RTTHREADTYPE_MAIN_WORKER,810 0,811 m_strTaskName.c_str());812 if (RT_FAILURE(vrc))813 {814 HRESULT rc = Machine::i_setErrorStatic(E_FAIL, Machine::tr("Could not create thread \"%s\" (%Rrc)"), m_strTaskName.c_str(), vrc);815 delete this;816 return rc;817 }818 return S_OK;819 }820 804 821 805 void modifyBackedUpState(MachineState_T s) … … 824 808 } 825 809 826 virtual void handler() = 0; 827 828 ComObjPtr<Machine> m_pMachine; 810 ComObjPtr<Machine> m_pMachine; 829 811 AutoCaller m_machineCaller; 830 812 ComObjPtr<Progress> m_pProgress; 831 Utf8Str m_strTaskName;832 813 const MachineState_T m_machineStateBackup; 833 814 }; 834 815 835 structDeleteConfigTask;816 class DeleteConfigTask; 836 817 void i_deleteConfigHandler(DeleteConfigTask &task); 837 838 static DECLCALLBACK(int) taskHandler(RTTHREAD thread, void *pvUser);839 818 840 819 friend class SessionMachine; … … 1437 1416 }; 1438 1417 1439 struct SaveStateTask; 1440 struct SnapshotTask; 1441 struct TakeSnapshotTask; 1442 struct DeleteSnapshotTask; 1443 struct RestoreSnapshotTask; 1444 1445 friend struct TakeSnapshotTask; 1446 friend struct DeleteSnapshotTask; 1447 friend struct RestoreSnapshotTask; 1418 class SaveStateTask; 1419 class SnapshotTask; 1420 class TakeSnapshotTask; 1421 class DeleteSnapshotTask; 1422 class RestoreSnapshotTask; 1448 1423 1449 1424 void i_saveStateHandler(SaveStateTask &aTask); -
trunk/src/VBox/Main/src-client/GuestSessionImpl.cpp
r63251 r63584 2147 2147 } 2148 2148 2149 int GuestSession::i_startTaskAsync(const Utf8Str &strTaskDesc,2150 GuestSessionTask *pTask, ComObjPtr<Progress> &pProgress)2151 {2152 LogFlowThisFunc(("strTaskDesc=%s, pTask=%p\n", strTaskDesc.c_str(), pTask));2153 2154 AssertPtrReturn(pTask, VERR_INVALID_POINTER);2155 2156 /* Create the progress object. */2157 HRESULT hr = pProgress.createObject();2158 if (FAILED(hr))2159 return VERR_COM_UNEXPECTED;2160 2161 hr = pProgress->init(static_cast<IGuestSession*>(this),2162 Bstr(strTaskDesc).raw(),2163 TRUE /* aCancelable */);2164 if (FAILED(hr))2165 return VERR_COM_UNEXPECTED;2166 2167 /* Initialize our worker task. */2168 RT_GCC_NO_WARN_DEPRECATED_BEGIN2169 std::auto_ptr<GuestSessionTask> task(pTask);2170 RT_GCC_NO_WARN_DEPRECATED_END2171 int rc = task->RunAsync(strTaskDesc, pProgress);2172 if (RT_FAILURE(rc))2173 return rc;2174 2175 /* Don't destruct on success. */2176 task.release();2177 2178 LogFlowFuncLeaveRC(rc);2179 return rc;2180 }2149 //int GuestSession::i_startTaskAsync(const Utf8Str &strTaskDesc, 2150 // GuestSessionTask *pTask, ComObjPtr<Progress> &pProgress) 2151 //{ 2152 // LogFlowThisFunc(("strTaskDesc=%s, pTask=%p\n", strTaskDesc.c_str(), pTask)); 2153 // 2154 // AssertPtrReturn(pTask, VERR_INVALID_POINTER); 2155 // 2156 // /* Create the progress object. */ 2157 // HRESULT hr = pProgress.createObject(); 2158 // if (FAILED(hr)) 2159 // return VERR_COM_UNEXPECTED; 2160 // 2161 // hr = pProgress->init(static_cast<IGuestSession*>(this), 2162 // Bstr(strTaskDesc).raw(), 2163 // TRUE /* aCancelable */); 2164 // if (FAILED(hr)) 2165 // return VERR_COM_UNEXPECTED; 2166 // 2167 // /* Initialize our worker task. */ 2168 // RT_GCC_NO_WARN_DEPRECATED_BEGIN 2169 // std::auto_ptr<GuestSessionTask> task(pTask); 2170 // RT_GCC_NO_WARN_DEPRECATED_END 2171 // int rc = task->RunAsync(strTaskDesc, pProgress); 2172 // if (RT_FAILURE(rc)) 2173 // return rc; 2174 // 2175 // /* Don't destruct on success. */ 2176 // task.release(); 2177 // 2178 // LogFlowFuncLeaveRC(rc); 2179 // return rc; 2180 //} 2181 2181 2182 2182 /** -
trunk/src/VBox/Main/src-server/MachineImpl.cpp
r63563 r63584 5256 5256 * Task record for deleting a machine config. 5257 5257 */ 5258 structMachine::DeleteConfigTask5258 class Machine::DeleteConfigTask 5259 5259 : public Machine::Task 5260 5260 { 5261 public: 5261 5262 DeleteConfigTask(Machine *m, 5262 5263 Progress *p, … … 5269 5270 {} 5270 5271 5272 private: 5271 5273 void handler() 5272 5274 { 5273 m_pMachine->i_deleteConfigHandler(*this); 5275 try 5276 { 5277 m_pMachine->i_deleteConfigHandler(*this); 5278 } 5279 catch(...) 5280 { 5281 LogRel(("Some exception in the function Machine::i_deleteConfigHandler()\n")); 5282 } 5274 5283 } 5275 5284 5276 5285 RTCList<ComPtr<IMedium> > m_llMediums; 5277 5286 StringsList m_llFilesToDelete; 5287 5288 friend void Machine::i_deleteConfigHandler(DeleteConfigTask &task); 5278 5289 }; 5279 5290 … … 12846 12857 * Task record for saving the machine state. 12847 12858 */ 12848 structSessionMachine::SaveStateTask12859 class SessionMachine::SaveStateTask 12849 12860 : public Machine::Task 12850 12861 { 12862 public: 12851 12863 SaveStateTask(SessionMachine *m, 12852 12864 Progress *p, … … 12859 12871 {} 12860 12872 12873 private: 12861 12874 void handler() 12862 12875 { … … 12866 12879 Reason_T m_enmReason; 12867 12880 Utf8Str m_strStateFilePath; 12881 12882 friend class SessionMachine; 12868 12883 }; 12869 12884 … … 14779 14794 14780 14795 14781 /**14782 * Static Machine method that can get passed to RTThreadCreate to14783 * have a thread started for a Task. See Machine::Task.14784 */14785 /* static */ DECLCALLBACK(int) Machine::taskHandler(RTTHREAD /* thread */, void *pvUser)14786 {14787 AssertReturn(pvUser, VERR_INVALID_POINTER);14788 14789 Task *pTask = static_cast<Task *>(pvUser);14790 pTask->handler();14791 /** @todo r=klaus it would be safer to update the progress object here,14792 * as it avoids possible races due to scoping issues/tricks in the handler */14793 // it's our responsibility to delete the task14794 delete pTask;14795 14796 return 0;14797 }14798 14799 14796 /*static*/ 14800 14797 HRESULT Machine::i_setErrorStatic(HRESULT aResultCode, const char *pcszMsg, ...) -
trunk/src/VBox/Main/src-server/SnapshotImpl.cpp
r63563 r63584 1300 1300 * SessionMachine::RestoreSnapshotTask and SessionMachine::DeleteSnapshotTask. 1301 1301 */ 1302 structSessionMachine::SnapshotTask1302 class SessionMachine::SnapshotTask 1303 1303 : public SessionMachine::Task 1304 1304 { 1305 public: 1305 1306 SnapshotTask(SessionMachine *m, 1306 1307 Progress *p, … … 1315 1316 1316 1317 /** Take snapshot task */ 1317 structSessionMachine::TakeSnapshotTask1318 class SessionMachine::TakeSnapshotTask 1318 1319 : public SessionMachine::SnapshotTask 1319 1320 { 1321 public: 1320 1322 TakeSnapshotTask(SessionMachine *m, 1321 1323 Progress *p, … … 1344 1346 } 1345 1347 1348 private: 1346 1349 void handler() 1347 1350 { 1348 ((SessionMachine *)(Machine *)m_pMachine)->i_takeSnapshotHandler(*this); 1351 try 1352 { 1353 ((SessionMachine *)(Machine *)m_pMachine)->i_takeSnapshotHandler(*this); 1354 } 1355 catch(...) 1356 { 1357 LogRel(("Some exception in the function i_takeSnapshotHandler()\n")); 1358 } 1349 1359 } 1350 1360 … … 1357 1367 uint32_t m_uMemSize; 1358 1368 bool m_fTakingSnapshotOnline; 1369 1370 friend HRESULT SessionMachine::i_finishTakingSnapshot(TakeSnapshotTask &task, AutoWriteLock &alock, bool aSuccess); 1371 friend void SessionMachine::i_takeSnapshotHandler(TakeSnapshotTask &task); 1372 friend void SessionMachine::i_takeSnapshotProgressCancelCallback(void *pvUser); 1359 1373 }; 1360 1374 1361 1375 /** Restore snapshot task */ 1362 structSessionMachine::RestoreSnapshotTask1376 class SessionMachine::RestoreSnapshotTask 1363 1377 : public SessionMachine::SnapshotTask 1364 1378 { 1379 public: 1365 1380 RestoreSnapshotTask(SessionMachine *m, 1366 1381 Progress *p, … … 1370 1385 {} 1371 1386 1387 private: 1372 1388 void handler() 1373 1389 { 1374 ((SessionMachine *)(Machine *)m_pMachine)->i_restoreSnapshotHandler(*this); 1390 try 1391 { 1392 ((SessionMachine *)(Machine *)m_pMachine)->i_restoreSnapshotHandler(*this); 1393 } 1394 catch(...) 1395 { 1396 LogRel(("Some exception in the function i_restoreSnapshotHandler()\n")); 1397 } 1375 1398 } 1376 1399 }; 1377 1400 1378 1401 /** Delete snapshot task */ 1379 structSessionMachine::DeleteSnapshotTask1402 class SessionMachine::DeleteSnapshotTask 1380 1403 : public SessionMachine::SnapshotTask 1381 1404 { 1405 public: 1382 1406 DeleteSnapshotTask(SessionMachine *m, 1383 1407 Progress *p, … … 1389 1413 {} 1390 1414 1415 private: 1391 1416 void handler() 1392 1417 { 1393 ((SessionMachine *)(Machine *)m_pMachine)->i_deleteSnapshotHandler(*this); 1418 try 1419 { 1420 ((SessionMachine *)(Machine *)m_pMachine)->i_deleteSnapshotHandler(*this); 1421 } 1422 catch(...) 1423 { 1424 LogRel(("Some exception in the function i_deleteSnapshotHandler()\n")); 1425 } 1394 1426 } 1395 1427 1396 1428 bool m_fDeleteOnline; 1429 friend void SessionMachine::i_deleteSnapshotHandler(DeleteSnapshotTask &task); 1397 1430 }; 1398 1431 -
trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp
r63563 r63584 81 81 #ifdef RT_OS_WINDOWS 82 82 # include "win/svchlp.h" 83 # include "ThreadTask.h"84 # include "tchar.h"85 83 #endif 84 85 #include "ThreadTask.h" 86 86 87 87 //////////////////////////////////////////////////////////////////////////////// … … 3965 3965 } 3966 3966 3967 struct SaveMediaRegistriesDesc 3968 { 3967 static DECLCALLBACK(int) fntSaveMediaRegistries(RTTHREAD ThreadSelf, void *pvUser); 3968 3969 class SaveMediaRegistriesDesc : public ThreadTask 3970 { 3971 3972 public: 3973 SaveMediaRegistriesDesc() 3974 { 3975 m_strTaskName = "SaveMediaReg"; 3976 } 3977 virtual ~SaveMediaRegistriesDesc(void) { } 3978 3979 private: 3980 void handler() 3981 { 3982 try 3983 { 3984 fntSaveMediaRegistries(m_hThread, this); 3985 } 3986 catch(...) 3987 { 3988 LogRel(("Exception in the function fntSaveMediaRegistries()\n")); 3989 } 3990 } 3991 3969 3992 MediaList llMedia; 3970 3993 ComObjPtr<VirtualBox> pVirtualBox; 3994 3995 friend DECLCALLBACK(int) fntSaveMediaRegistries(RTTHREAD ThreadSelf, void *pvUser); 3996 friend void VirtualBox::i_saveMediaRegistry(settings::MediaRegistry &mediaRegistry, 3997 const Guid &uuidRegistry, 3998 const Utf8Str &strMachineFolder); 3971 3999 }; 3972 4000 3973 staticDECLCALLBACK(int) fntSaveMediaRegistries(RTTHREAD ThreadSelf, void *pvUser)4001 DECLCALLBACK(int) fntSaveMediaRegistries(RTTHREAD ThreadSelf, void *pvUser) 3974 4002 { 3975 4003 NOREF(ThreadSelf); … … 3993 4021 pDesc->llMedia.clear(); 3994 4022 pDesc->pVirtualBox.setNull(); 3995 delete pDesc;3996 4023 3997 4024 return VINF_SUCCESS; … … 4083 4110 // lots of places which would need to handle saving more settings. 4084 4111 pDesc->pVirtualBox = this; 4085 int vrc = RTThreadCreate(NULL, 4086 fntSaveMediaRegistries, 4087 (void *)pDesc, 4088 0, // cbStack (default) 4089 RTTHREADTYPE_MAIN_WORKER, 4090 0, // flags 4091 "SaveMediaReg"); 4092 ComAssertRC(vrc); 4093 // failure means that settings aren't saved, but there isn't 4094 // much we can do besides avoiding memory leaks 4095 if (RT_FAILURE(vrc)) 4112 HRESULT hr = S_OK; 4113 try 4096 4114 { 4097 LogRelFunc(("Failed to create thread for saving media registries (%Rrc)\n", vrc)); 4098 delete pDesc; 4115 //the function createThread() takes ownership of pDesc 4116 //so there is no need to use delete operator for pDesc 4117 //after calling this function 4118 hr = pDesc->createThread(); 4119 } 4120 catch(...) 4121 { 4122 hr = E_FAIL; 4123 } 4124 4125 if (FAILED(hr)) 4126 { 4127 // failure means that settings aren't saved, but there isn't 4128 // much we can do besides avoiding memory leaks 4129 LogRelFunc(("Failed to create thread for saving media registries (%Rhr)\n", hr)); 4099 4130 } 4100 4131 }
Note:
See TracChangeset
for help on using the changeset viewer.