VirtualBox

Changeset 24725 in vbox for trunk


Ignore:
Timestamp:
Nov 17, 2009 3:27:03 PM (15 years ago)
Author:
vboxsync
Message:

Main/Medium: Move per-operation state (progress object reference etc) to local variables. Clean up things slightly, and review the code for Medium data accesses

without holding the appropriate locks.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/MediumImpl.cpp

    r24691 r24725  
    103103          implicit(false),
    104104          numCreateDiffTasks(0),
    105           vdProgress(NULL),
    106105          vdDiskIfaces(NULL)
    107106    {}
     
    150149
    151150    Utf8Str vdError;        /*< Error remembered by the VD error callback. */
    152     Progress *vdProgress;  /*< Progress for the VD progress callback. */
    153151
    154152    VDINTERFACE vdIfError;
    155153    VDINTERFACEERROR vdIfCallsError;
    156 
    157     VDINTERFACE vdIfProgress;
    158     VDINTERFACEPROGRESS vdIfCallsProgress;
    159154
    160155    VDINTERFACE vdIfConfig;
     
    798793    m->vdIfCallsError.pfnMessage = NULL;
    799794
    800     /* Initialize the callbacks of the VD progress interface */
    801     m->vdIfCallsProgress.cbSize = sizeof(VDINTERFACEPROGRESS);
    802     m->vdIfCallsProgress.enmInterface = VDINTERFACETYPE_PROGRESS;
    803     m->vdIfCallsProgress.pfnProgress = vdProgressCall;
    804 
    805795    /* Initialize the callbacks of the VD config interface */
    806796    m->vdIfCallsConfig.cbSize = sizeof(VDINTERFACECONFIG);
     
    811801
    812802    /* Initialize the callbacks of the VD TCP interface (we always use the host
    813      * IP stack for now) */
     803     * IP stack for now) */
    814804    m->vdIfCallsTcpNet.cbSize = sizeof(VDINTERFACETCPNET);
    815805    m->vdIfCallsTcpNet.enmInterface = VDINTERFACETYPE_TCPNET;
     
    829819    AssertRCReturn(vrc, E_FAIL);
    830820
    831     vrc = VDInterfaceAdd(&m->vdIfProgress,
    832                          "Medium::vdInterfaceProgress",
    833                          VDINTERFACETYPE_PROGRESS,
    834                          &m->vdIfCallsProgress, this, &m->vdDiskIfaces);
    835     AssertRCReturn(vrc, E_FAIL);
    836821    vrc = VDInterfaceAdd(&m->vdIfConfig,
    837822                         "Medium::vdInterfaceConfig",
     
    47674752                                         void *pvUser)
    47684753{
    4769     Medium *that = static_cast<Medium*>(pvUser);
    4770     AssertReturn(that != NULL, VERR_GENERAL_FAILURE);
    4771 
    4772     if (that->m->vdProgress != NULL)
     4754    Progress *that = static_cast<Progress *>(pvUser);
     4755
     4756    if (that != NULL)
    47734757    {
    47744758        /* update the progress object, capping it at 99% as the final percent
    47754759         * is used for additional operations like setting the UUIDs and similar. */
    4776         HRESULT rc = that->m->vdProgress->SetCurrentOperationProgress(uPercent * 99 / 100);
     4760        HRESULT rc = that->SetCurrentOperationProgress(uPercent * 99 / 100);
    47774761        if (FAILED(rc))
    47784762        {
     
    48664850
    48674851    Medium *that = task->that;
     4852
     4853    /* Set up a per-operation progress interface, can be used freely (for
     4854     * binary operations you can use it either on the source or target). */
     4855    VDINTERFACEPROGRESS vdIfCallsProgress;
     4856    vdIfCallsProgress.cbSize = sizeof(VDINTERFACEPROGRESS);
     4857    vdIfCallsProgress.enmInterface = VDINTERFACETYPE_PROGRESS;
     4858    vdIfCallsProgress.pfnProgress = Medium::vdProgressCall;
     4859    VDINTERFACE vdIfProgress;
     4860    PVDINTERFACE vdOperationIfaces = NULL;
     4861    int vrc = VDInterfaceAdd(&vdIfProgress,
     4862                             "Medium::vdInterfaceProgress",
     4863                             VDINTERFACETYPE_PROGRESS,
     4864                             &vdIfCallsProgress, task->progress, &vdOperationIfaces);
     4865    AssertRCReturn(vrc, E_FAIL);
    48684866
    48694867    /// @todo ugly hack, fix ComAssert... later
     
    49234921                    PDMMEDIAGEOMETRY geo = { 0 }; /* auto-detect */
    49244922
    4925                     /* needed for vdProgressCallback */
    4926                     that->m->vdProgress = task->progress;
    4927 
    49284923                    vrc = VDCreateBase(hdd, format.c_str(), location.c_str(),
    49294924                                       task->d.size * _1M,
     
    49314926                                       NULL, &geo, &geo, id.raw(),
    49324927                                       VD_OPEN_FLAGS_NORMAL,
    4933                                        NULL, that->m->vdDiskIfaces);
    4934 
     4928                                       NULL, vdOperationIfaces);
    49354929                    if (RT_FAILURE(vrc))
    49364930                    {
     
    50425036                    CheckComRCThrowRC(rc);
    50435037
    5044                     /* needed for vdProgressCallback */
    5045                     that->m->vdProgress = task->progress;
    5046 
    50475038                    /** @todo add VD_IMAGE_FLAGS_DIFF to the image flags, to
    50485039                     * be on the safe side. */
     
    50545045                                       VD_OPEN_FLAGS_NORMAL,
    50555046                                       target->m->vdDiskIfaces,
    5056                                        that->m->vdDiskIfaces);
    5057 
    5058                     that->m->vdProgress = NULL;
    5059 
     5047                                       vdOperationIfaces);
    50605048                    if (RT_FAILURE(vrc))
    50615049                    {
     
    50795067                 * here), but lock VirtualBox first to follow the rule */
    50805068                AutoMultiWriteLock2 alock(that->mVirtualBox->lockHandle(),
    5081                                            that->treeLock());
     5069                                          that->treeLock());
    50825070
    50835071                Assert(target->mParent.isNull());
     
    50895077                target->mVirtualBox->removeDependentChild(target);
    50905078
     5079                /** @todo r=klaus neither target nor that->base() are locked,
     5080                 * potential race! */
    50915081                /* diffs for immutable hard disks are auto-reset by default */
    50925082                target->m->autoReset =
     
    52155205                    }
    52165206
    5217                     /* needed for vdProgressCallback */
    5218                     that->m->vdProgress = task->progress;
    5219 
    52205207                    unsigned start = chain->isForward() ?
    52215208                        0 : (unsigned)chain->size() - 1;
     
    52255212                    LogFlow(("*** MERGE from %d to %d\n", start, end));
    52265213#endif
    5227                     vrc = VDMerge(hdd, start, end, that->m->vdDiskIfaces);
    5228 
    5229                     that->m->vdProgress = NULL;
    5230 
     5214                    vrc = VDMerge(hdd, start, end, vdOperationIfaces);
    52315215                    if (RT_FAILURE(vrc))
    52325216                        throw vrc;
     
    55075491                    }
    55085492
    5509                     /* unlock before the potentially lengthy operation */
    5510                     thatLock.leave();
    5511 
    55125493                    Utf8Str targetFormat(target->m->strFormat);
    55135494                    Utf8Str targetLocation(target->m->strLocationFull);
     
    55185499                    Assert(parent.isNull() || parent->m->state == MediumState_LockedRead);
    55195500
     5501                    /* unlock before the potentially lengthy operation */
     5502                    thatLock.leave();
     5503
    55205504                    /* ensure the target directory exists */
    55215505                    rc = VirtualBox::ensureFilePathExists(targetLocation);
    55225506                    CheckComRCThrowRC(rc);
    5523 
    5524                     /* needed for vdProgressCallback */
    5525                     that->m->vdProgress = task->progress;
    55265507
    55275508                    PVBOXHDD targetHdd;
     
    55355516                             it != parentChain->end(); ++ it)
    55365517                        {
     5518                            /** @todo r=klaus (*it) is not locked, lots of
     5519                             * race opportunities below */
    55375520                            /* sanity check */
    55385521                            Assert(    (*it)->m->state == MediumState_LockedRead
     
    55535536                        }
    55545537
     5538                        /** @todo r=klaus target isn't locked, race getting the state */
    55555539                        vrc = VDCopy(hdd, VD_LAST_IMAGE, targetHdd,
    55565540                                     targetFormat.c_str(),
     
    55595543                                     task->d.variant, targetId.raw(), NULL,
    55605544                                     target->m->vdDiskIfaces,
    5561                                      that->m->vdDiskIfaces);
    5562 
    5563                         that->m->vdProgress = NULL;
    5564 
     5545                                     vdOperationIfaces);
    55655546                        if (RT_FAILURE(vrc))
    55665547                        {
     
    57705751                    }
    57715752
    5772                     /* needed for vdProgressCallback */
    5773                     that->m->vdProgress = task->progress;
    5774 
    57755753                    vrc = VDCreateDiff(hdd, format.c_str(), location.c_str(),
    57765754                                       /// @todo use the same image variant as before
     
    57805758                                       VD_OPEN_FLAGS_NORMAL,
    57815759                                       that->m->vdDiskIfaces,
    5782                                        that->m->vdDiskIfaces);
    5783 
    5784                     that->m->vdProgress = NULL;
    5785 
     5760                                       vdOperationIfaces);
    57865761                    if (RT_FAILURE(vrc))
    57875762                    {
     
    58635838                    }
    58645839
     5840                    Assert(that->m->state == MediumState_LockedWrite);
     5841
     5842                    Utf8Str location(that->m->strLocationFull);
     5843
    58655844                    /* unlock before the potentially lengthy operation */
    58665845                    thatLock.leave();
    58675846
    5868                     Assert(that->m->state == MediumState_LockedWrite);
    5869 
    5870                     /* needed for vdProgressCallback */
    5871                     that->m->vdProgress = task->progress;
    5872 
    5873                     vrc = VDCompact(hdd, VD_LAST_IMAGE, that->m->vdDiskIfaces);
    5874 
    5875                     that->m->vdProgress = NULL;
    5876 
     5847                    vrc = VDCompact(hdd, VD_LAST_IMAGE, vdOperationIfaces);
    58775848                    if (RT_FAILURE(vrc))
    58785849                    {
     
    58805851                            throw setError(VBOX_E_NOT_SUPPORTED,
    58815852                                           tr("Compacting is not yet supported for hard disk '%s'"),
    5882                                            that->m->strLocationFull.raw());
     5853                                           location.raw());
    58835854                        else if (vrc == VERR_NOT_IMPLEMENTED)
    58845855                            throw setError(E_NOTIMPL,
    58855856                                           tr("Compacting is not implemented, hard disk '%s'"),
    5886                                            that->m->strLocationFull.raw());
     5857                                           location.raw());
    58875858                        else
    58885859                            throw setError(E_FAIL,
    58895860                                           tr("Could not compact hard disk '%s'%s"),
    5890                                            that->m->strLocationFull.raw(),
     5861                                           location.raw(),
    58915862                                           that->vdError(vrc).raw());
    58925863                    }
Note: See TracChangeset for help on using the changeset viewer.

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