Changeset 45697 in vbox for trunk/src/VBox/Main
- Timestamp:
- Apr 24, 2013 1:30:50 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 85242
- Location:
- trunk/src/VBox/Main/src-client
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/src-client/GuestProcessImpl.cpp
r45482 r45697 736 736 737 737 com::SafeArray<BYTE> data((size_t)dataCb.cbData); 738 data.initFrom((BYTE*)dataCb.pvData, dataCb.cbData); 738 if (dataCb.cbData) 739 data.initFrom((BYTE*)dataCb.pvData, dataCb.cbData); 739 740 740 741 fireGuestProcessOutputEvent(mEventSource, mSession, this, … … 755 756 /* pcbRead is optional. */ 756 757 757 /** @todo Validate uHandle. */758 759 758 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 760 759 761 if (mData.mStatus != ProcessStatus_Started) 760 if ( mData.mStatus != ProcessStatus_Started 761 /* Skip reading if the process wasn't started with the appropriate 762 * flags. */ 763 || ( ( uHandle == OUTPUT_HANDLE_ID_STDOUT 764 || uHandle == OUTPUT_HANDLE_ID_STDOUT_DEPRECATED) 765 && !(mData.mProcess.mFlags & ProcessCreateFlag_WaitForStdOut)) 766 || ( uHandle == OUTPUT_HANDLE_ID_STDERR 767 && !(mData.mProcess.mFlags & ProcessCreateFlag_WaitForStdErr)) 768 ) 762 769 { 763 770 if (pcbRead) … … 780 787 paParms[i++].setUInt32(0 /* Flags, none set yet. */); 781 788 789 alock.release(); /* Drop the write lock before sending. */ 790 782 791 vrc = sendCommand(HOST_EXEC_GET_OUTPUT, i, paParms); 783 792 } 784 793 785 794 if (RT_SUCCESS(vrc)) 786 {787 alock.release(); /* Drop the write lock before waiting. */788 789 795 vrc = waitForOutput(uHandle, uTimeoutMS, 790 796 pvData, cbData, pcbRead); 791 }792 797 793 798 LogFlowFuncLeaveRC(vrc); … … 904 909 if (RT_SUCCESS(vrc)) 905 910 vrc = mData.mProcess.mEnvironment.BuildEnvironmentBlock(&pvEnv, &cbEnv, NULL /* cEnv */); 911 912 uint32_t uTimeoutMS = mData.mProcess.mTimeoutMS; 906 913 907 914 if (RT_SUCCESS(vrc)) … … 939 946 paParms[i++].setUInt32(UINT32_MAX /* Infinite timeout */); 940 947 else 941 paParms[i++].setUInt32( mData.mProcess.mTimeoutMS);948 paParms[i++].setUInt32(uTimeoutMS); 942 949 if (uProtocol >= 2) 943 950 { … … 950 957 } 951 958 959 alock.release(); /* Drop the write lock before sending. */ 960 952 961 /* Note: Don't hold the write lock in here. */ 953 962 vrc = sendCommand(HOST_EXEC_CMD, i, paParms); … … 963 972 RTStrFree(pszArgs); 964 973 965 uint32_t uTimeoutMS = mData.mProcess.mTimeoutMS;966 967 /* Drop the write lock again before waiting. */968 alock.release();969 970 974 if (RT_SUCCESS(vrc)) 971 975 { 972 vrc = waitForStatusChange(ProcessWaitForFlag_Start, 30 * 1000 /* Timeout */,976 vrc = waitForStatusChange(ProcessWaitForFlag_Start, uTimeoutMS, 973 977 NULL /* Process status */, pGuestRc); 974 978 } … … 1055 1059 paParms[i++].setUInt32(mData.mPID); 1056 1060 1061 alock.release(); /* Drop the write lock before sending. */ 1062 1057 1063 vrc = sendCommand(HOST_EXEC_TERMINATE, i, paParms); 1058 1064 } 1059 1065 1060 1066 if (RT_SUCCESS(vrc)) 1061 {1062 alock.release(); /* Drop the write lock before waiting. */1063 1064 1067 vrc = waitForStatusChange(ProcessWaitForFlag_Terminate, 1065 1068 30 * 1000 /* 30s timeout */, 1066 1069 NULL /* ProcessStatus */, pGuestRc); 1067 }1068 1069 1070 LogFlowFuncLeaveRC(vrc); 1070 1071 return vrc; … … 1267 1268 if (SUCCEEDED(hr)) 1268 1269 { 1269 LogFlowThisFunc(("Waiting for guest fileevent(s) (timeout=%RU32ms, %zu events) ...\n",1270 LogFlowThisFunc(("Waiting for guest process event(s) (timeout=%RU32ms, %zu events) ...\n", 1270 1271 uTimeoutMS, arrEventTypes.size())); 1271 1272 … … 1427 1428 ComAssertComRC(hr); 1428 1429 size_t cbRead = data.size(); 1429 if ( cbRead 1430 && cbRead <= cbData) 1430 if (cbRead) 1431 1431 { 1432 memcpy(pvData, data.raw(), data.size()); 1432 if (cbRead <= cbData) 1433 { 1434 /* Copy data from event into our buffer. */ 1435 memcpy(pvData, data.raw(), data.size()); 1436 } 1437 else 1438 vrc = VERR_BUFFER_OVERFLOW; 1433 1439 } 1434 else1435 vrc = VERR_BUFFER_OVERFLOW;1436 1440 } 1437 1441 if (pcbRead) 1438 1442 { 1439 hr = pProcessEvent->COMGETTER(Processed)((ULONG*)pcbRead); 1443 ULONG cbRead; 1444 hr = pProcessEvent->COMGETTER(Processed)(&cbRead); 1440 1445 ComAssertComRC(hr); 1446 *pcbRead = (uint32_t)cbRead; 1441 1447 } 1442 1448 … … 1525 1531 paParms[i++].setUInt32(cbData); 1526 1532 1533 alock.release(); /* Drop the write lock before sending. */ 1534 1527 1535 vrc = sendCommand(HOST_EXEC_SET_INPUT, i, paParms); 1528 1536 } … … 1530 1538 if (RT_SUCCESS(vrc)) 1531 1539 { 1532 alock.release(); /* Drop the write lock before waiting. */1533 1534 1540 ProcessInputStatus_T inputStatus; 1535 1541 uint32_t cbProcessed; … … 1593 1599 } 1594 1600 1595 LogFlowThisFunc(("rc=%Rrc, cbRead=%RU 64\n", vrc, cbRead));1601 LogFlowThisFunc(("rc=%Rrc, cbRead=%RU32\n", vrc, cbRead)); 1596 1602 1597 1603 LogFlowFuncLeaveRC(vrc); … … 1736 1742 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 1737 1743 1744 com::SafeArray<BYTE> data(ComSafeArrayInArg(aData)); 1745 1738 1746 HRESULT hr = S_OK; 1739 1747 1740 com::SafeArray<BYTE> data(ComSafeArrayInArg(aData)); int guestRc;1741 int vrc = writeData(aHandle, aFlags, data.raw(), data.size(), aTimeoutMS, (uint32_t*)aWritten, &guestRc);1748 uint32_t cbWritten; int guestRc; 1749 int vrc = writeData(aHandle, aFlags, data.raw(), data.size(), aTimeoutMS, &cbWritten, &guestRc); 1742 1750 if (RT_FAILURE(vrc)) 1743 1751 { … … 1756 1764 } 1757 1765 1758 LogFlowThisFunc(("rc=%Rrc, aWritten=%RU32\n", vrc, aWritten)); 1766 LogFlowThisFunc(("rc=%Rrc, aWritten=%RU32\n", vrc, cbWritten)); 1767 1768 *aWritten = (ULONG)cbWritten; 1759 1769 1760 1770 LogFlowFuncLeaveRC(vrc); -
trunk/src/VBox/Main/src-client/GuestSessionImpl.cpp
r45434 r45697 1358 1358 pCurProc->getObjectID(), mData.mSession.mID, uPID, mData.mProcesses.size() - 1, mData.mNumObjects - 1)); 1359 1359 1360 LogFlowFunc(("1\n"));1361 1360 mData.mProcesses.erase(itProcs); 1362 1361 mData.mNumObjects--; 1363 1362 1364 LogFlowFunc(("2\n"));1365 1363 fireGuestProcessRegisteredEvent(mEventSource, this /* Session */, NULL /* Process */, 1366 1364 uPID, false /* Process unregistered */); 1367 LogFlowFunc(("3\n"));1368 1365 rc = VINF_SUCCESS; 1369 1366 break; 1370 1367 } 1371 1368 1372 LogFlowFunc(("4\n"));1373 1369 itProcs++; 1374 1370 }
Note:
See TracChangeset
for help on using the changeset viewer.