VirtualBox

Ignore:
Timestamp:
Jan 13, 2011 3:41:29 PM (14 years ago)
Author:
vboxsync
Message:

VBoxManage/GuestCtrl: Timeout adjustments.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp

    r35534 r35541  
    317317    bool fWaitForStdErr = false;
    318318    bool fVerbose = false;
    319     bool fTimeout = false;
    320319
    321320    int vrc = VINF_SUCCESS;
     
    374373            case 't': /* Timeout */
    375374                u32TimeoutMS = ValueUnion.u32;
    376                 fTimeout = true;
    377375                break;
    378376
     
    461459            if (fWaitForExit)
    462460            {
    463                 if (fTimeout)
     461                if (u32TimeoutMS) /* Wait with a certain timeout. */
    464462                {
    465463                    /* Calculate timeout value left after process has been started.  */
     
    468466                    if (u32TimeoutMS > u64Elapsed)
    469467                    {
    470                         u32TimeoutMS -= (uint32_t)u64Elapsed;
    471468                        if (fVerbose)
    472                             RTPrintf("Waiting for process to exit (%ums left) ...\n", u32TimeoutMS);
     469                            RTPrintf("Waiting for process to exit (%ums left) ...\n", u32TimeoutMS - u64Elapsed);
    473470                    }
    474471                    else
     
    478475                    }
    479476                }
    480                 else if (fVerbose)
     477                else if (fVerbose) /* Wait forever. */
    481478                    RTPrintf("Waiting for process to exit ...\n");
    482479
     
    505502                        || fWaitForStdErr)
    506503                    {
    507                         /** @todo r=bird: Why use u32TimeoutMS here?  */
    508504                        rc = guest->GetProcessOutput(uPID, 0 /* aFlags */,
    509                                                      u32TimeoutMS, _64K, ComSafeArrayAsOutParam(aOutputData));
     505                                                     RT_MAX(0, u32TimeoutMS - (RTTimeMilliTS() - u64StartMS)) /* Timeout in ms */,
     506                                                     _64K, ComSafeArrayAsOutParam(aOutputData));
    510507                        if (FAILED(rc))
    511508                        {
    512509                            vrc = ctrlPrintError(guest, COM_IIDOF(IGuest));
    513 
    514510                            cbOutputData = 0;
    515                             fCompleted = true; /* rc contains a failure, so we'll go into aborted state down below. */
    516511                        }
    517512                        else
     
    541536                        }
    542537                    }
    543                     if (cbOutputData <= 0) /* No more output data left? */
    544                     {
    545                         if (fCompleted)
    546                             break;
    547 
    548                         /** @todo r=bird: Why only apply the timeout here?
    549                          *        Shouldn't it time out regardless of
    550                          *        whether there is more output or not? */
    551                         if (   fTimeout
    552                             && RTTimeMilliTS() - u64StartMS > u32TimeoutMS + 5000)
    553                         {
    554                             progress->Cancel();
    555                             break;
    556                         }
    557                     }
     538
     539                    /* No more output data left? Then wait a little while ... */
     540                    if (cbOutputData <= 0)
     541                        progress->WaitForCompletion(1 /* ms */);
    558542
    559543                    /* Process async cancelation */
     
    574558                    }
    575559
    576                     /* Make sure the loop is not too tight. */
    577                     RTThreadYield();
     560                    /* Did we run out of time? */
     561                    if (   u32TimeoutMS
     562                        && RTTimeMilliTS() - u64StartMS > u32TimeoutMS)
     563                    {
     564                        progress->Cancel();
     565                        break;
     566                    }
    578567                }
    579568
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