VirtualBox

Changeset 63584 in vbox


Ignore:
Timestamp:
Aug 18, 2016 11:48:04 AM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
110276
Message:

bugref:8482. The redundant async task implementations was eliminated in the classes MachineImpl, GuestSessionImpl, SnapshotImpl, VirtualBoxImpl.

Location:
trunk/src/VBox/Main
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/MachineImpl.h

    r62141 r63584  
    3939#include "Performance.h"
    4040#include "PerformanceImpl.h"
     41#include "ThreadTask.h"
    4142#endif /* VBOX_WITH_RESOURCE_USAGE_API */
    4243
     
    790791     * in here (implemented by the subclasses).
    791792     */
    792     struct Task
    793     {
     793    class Task : public ThreadTask
     794    {
     795    public:
    794796        Task(Machine *m, Progress *p, const Utf8Str &t)
    795             : m_pMachine(m),
     797            : ThreadTask(t),
     798              m_pMachine(m),
    796799              m_machineCaller(m),
    797800              m_pProgress(p),
    798               m_strTaskName(t),
    799801              m_machineStateBackup(m->mData->mMachineState) // save the current machine state
    800802        {}
    801803        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         }
    820804
    821805        void modifyBackedUpState(MachineState_T s)
     
    824808        }
    825809
    826         virtual void handler() = 0;
    827 
    828         ComObjPtr<Machine>       m_pMachine;
     810        ComObjPtr<Machine>              m_pMachine;
    829811        AutoCaller                      m_machineCaller;
    830812        ComObjPtr<Progress>             m_pProgress;
    831         Utf8Str                         m_strTaskName;
    832813        const MachineState_T            m_machineStateBackup;
    833814    };
    834815
    835     struct DeleteConfigTask;
     816    class DeleteConfigTask;
    836817    void i_deleteConfigHandler(DeleteConfigTask &task);
    837 
    838     static DECLCALLBACK(int) taskHandler(RTTHREAD thread, void *pvUser);
    839818
    840819    friend class SessionMachine;
     
    14371416    };
    14381417
    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;
    14481423
    14491424    void i_saveStateHandler(SaveStateTask &aTask);
  • trunk/src/VBox/Main/src-client/GuestSessionImpl.cpp

    r63251 r63584  
    21472147}
    21482148
    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 }
     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//}
    21812181
    21822182/**
  • trunk/src/VBox/Main/src-server/MachineImpl.cpp

    r63563 r63584  
    52565256 * Task record for deleting a machine config.
    52575257 */
    5258 struct Machine::DeleteConfigTask
     5258class Machine::DeleteConfigTask
    52595259    : public Machine::Task
    52605260{
     5261public:
    52615262    DeleteConfigTask(Machine *m,
    52625263                     Progress *p,
     
    52695270    {}
    52705271
     5272private:
    52715273    void handler()
    52725274    {
    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        }
    52745283    }
    52755284
    52765285    RTCList<ComPtr<IMedium> >   m_llMediums;
    52775286    StringsList                 m_llFilesToDelete;
     5287
     5288    friend void Machine::i_deleteConfigHandler(DeleteConfigTask &task);
    52785289};
    52795290
     
    1284612857 * Task record for saving the machine state.
    1284712858 */
    12848 struct SessionMachine::SaveStateTask
     12859class SessionMachine::SaveStateTask
    1284912860    : public Machine::Task
    1285012861{
     12862public:
    1285112863    SaveStateTask(SessionMachine *m,
    1285212864                  Progress *p,
     
    1285912871    {}
    1286012872
     12873private:
    1286112874    void handler()
    1286212875    {
     
    1286612879    Reason_T m_enmReason;
    1286712880    Utf8Str m_strStateFilePath;
     12881
     12882    friend class SessionMachine;
    1286812883};
    1286912884
     
    1477914794
    1478014795
    14781 /**
    14782  * Static Machine method that can get passed to RTThreadCreate to
    14783  * 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 task
    14794     delete pTask;
    14795 
    14796     return 0;
    14797 }
    14798 
    1479914796/*static*/
    1480014797HRESULT Machine::i_setErrorStatic(HRESULT aResultCode, const char *pcszMsg, ...)
  • trunk/src/VBox/Main/src-server/SnapshotImpl.cpp

    r63563 r63584  
    13001300 * SessionMachine::RestoreSnapshotTask and SessionMachine::DeleteSnapshotTask.
    13011301 */
    1302 struct SessionMachine::SnapshotTask
     1302class SessionMachine::SnapshotTask
    13031303    : public SessionMachine::Task
    13041304{
     1305public:
    13051306    SnapshotTask(SessionMachine *m,
    13061307                 Progress *p,
     
    13151316
    13161317/** Take snapshot task */
    1317 struct SessionMachine::TakeSnapshotTask
     1318class SessionMachine::TakeSnapshotTask
    13181319    : public SessionMachine::SnapshotTask
    13191320{
     1321public:
    13201322    TakeSnapshotTask(SessionMachine *m,
    13211323                     Progress *p,
     
    13441346    }
    13451347
     1348private:
    13461349    void handler()
    13471350    {
    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        }
    13491359    }
    13501360
     
    13571367    uint32_t m_uMemSize;
    13581368    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);
    13591373};
    13601374
    13611375/** Restore snapshot task */
    1362 struct SessionMachine::RestoreSnapshotTask
     1376class SessionMachine::RestoreSnapshotTask
    13631377    : public SessionMachine::SnapshotTask
    13641378{
     1379public:
    13651380    RestoreSnapshotTask(SessionMachine *m,
    13661381                        Progress *p,
     
    13701385    {}
    13711386
     1387private:
    13721388    void handler()
    13731389    {
    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        }
    13751398    }
    13761399};
    13771400
    13781401/** Delete snapshot task */
    1379 struct SessionMachine::DeleteSnapshotTask
     1402class SessionMachine::DeleteSnapshotTask
    13801403    : public SessionMachine::SnapshotTask
    13811404{
     1405public:
    13821406    DeleteSnapshotTask(SessionMachine *m,
    13831407                       Progress *p,
     
    13891413    {}
    13901414
     1415private:
    13911416    void handler()
    13921417    {
    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        }
    13941426    }
    13951427
    13961428    bool m_fDeleteOnline;
     1429    friend void SessionMachine::i_deleteSnapshotHandler(DeleteSnapshotTask &task);
    13971430};
    13981431
  • trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp

    r63563 r63584  
    8181#ifdef RT_OS_WINDOWS
    8282# include "win/svchlp.h"
    83 # include "ThreadTask.h"
    84 # include "tchar.h"
    8583#endif
     84
     85#include "ThreadTask.h"
    8686
    8787////////////////////////////////////////////////////////////////////////////////
     
    39653965}
    39663966
    3967 struct SaveMediaRegistriesDesc
    3968 {
     3967static DECLCALLBACK(int) fntSaveMediaRegistries(RTTHREAD ThreadSelf, void *pvUser);
     3968
     3969class SaveMediaRegistriesDesc : public ThreadTask
     3970{
     3971
     3972public:
     3973    SaveMediaRegistriesDesc()
     3974    {
     3975        m_strTaskName = "SaveMediaReg";
     3976    }
     3977    virtual ~SaveMediaRegistriesDesc(void) { }
     3978
     3979private:
     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
    39693992    MediaList llMedia;
    39703993    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);
    39713999};
    39724000
    3973 static DECLCALLBACK(int) fntSaveMediaRegistries(RTTHREAD ThreadSelf, void *pvUser)
     4001DECLCALLBACK(int) fntSaveMediaRegistries(RTTHREAD ThreadSelf, void *pvUser)
    39744002{
    39754003    NOREF(ThreadSelf);
     
    39934021    pDesc->llMedia.clear();
    39944022    pDesc->pVirtualBox.setNull();
    3995     delete pDesc;
    39964023
    39974024    return VINF_SUCCESS;
     
    40834110            // lots of places which would need to handle saving more settings.
    40844111            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
    40964114            {
    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));
    40994130            }
    41004131        }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette