Changeset 19185 in vbox for trunk/src/VBox/Runtime/testcase
- Timestamp:
- Apr 26, 2009 9:04:33 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 46509
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/testcase/tstFileAio.cpp
r19054 r19185 63 63 RTFOFF Offset = 0; 64 64 size_t cbLeft = cbTestFile; 65 66 /* Initialize buffers. */ 67 for (unsigned i = 0; i < RT_ELEMENTS(apvBuf); i++) 65 int cRun = 0; 66 67 /* Associate file with context.*/ 68 rc = RTFileAioCtxAssociateWithFile(hAioContext, File); 69 if (RT_SUCCESS(rc)) 68 70 { 69 apvBuf[i] = RTMemPageAllocZ(cbTestBuf); 70 71 if (fWrite) 72 memcpy(apvBuf[i], pvTestBuf, cbTestBuf); 71 /* Initialize buffers. */ 72 for (unsigned i = 0; i < RT_ELEMENTS(apvBuf); i++) 73 { 74 apvBuf[i] = RTMemPageAllocZ(cbTestBuf); 75 76 if (fWrite) 77 memcpy(apvBuf[i], pvTestBuf, cbTestBuf); 78 } 79 80 /* Initialize requests. */ 81 for (unsigned i = 0; i < RT_ELEMENTS(aReqs); i++) 82 RTFileAioReqCreate(&aReqs[i]); 83 84 while (cbLeft) 85 { 86 int cReqs = 0; 87 size_t cReqsSubmitted = 0; 88 89 for (unsigned i = 0; i < RT_ELEMENTS(aReqs); i++) 90 { 91 size_t cbTransfer = (cbLeft < cbTestBuf) ? cbLeft : cbTestBuf; 92 93 if (!cbTransfer) 94 break; 95 96 if (fWrite) 97 rc = RTFileAioReqPrepareWrite(aReqs[i], File, Offset, apvBuf[i], 98 cbTransfer, apvBuf[i]); 99 else 100 rc = RTFileAioReqPrepareRead(aReqs[i], File, Offset, apvBuf[i], 101 cbTransfer, apvBuf[i]); 102 103 cbLeft -= cbTransfer; 104 Offset += cbTransfer; 105 cReqs++; 106 } 107 108 rc = RTFileAioCtxSubmit(hAioContext, aReqs, cReqs, &cReqsSubmitted); 109 if (RT_FAILURE(rc)) 110 { 111 RTPrintf("tstFileAio: FATAL ERROR - Failed to submit tasks after %d runs. rc=%Rrc\n", cRun, rc); 112 cErrors++; 113 break; 114 } 115 else if (cReqs != cReqsSubmitted) 116 { 117 RTPrintf("tstFileAio: FATAL ERROR - Submitted tasks but the result is not equal to the number of submitted tasks\n", rc); 118 cErrors++; 119 break; 120 } 121 122 /* Wait */ 123 RTFILEAIOREQ aReqsCompleted[TSTFILEAIO_MAX_REQS_IN_FLIGHT]; 124 uint32_t cCompleted = 0; 125 rc = RTFileAioCtxWait(hAioContext, cReqs, RT_INDEFINITE_WAIT, 126 aReqsCompleted, TSTFILEAIO_MAX_REQS_IN_FLIGHT, 127 &cCompleted); 128 if (RT_FAILURE(rc)) 129 { 130 RTPrintf("tstFileAio: FATAL ERROR - Waiting failed. rc=%Rrc\n", rc); 131 cErrors++; 132 break; 133 } 134 135 if (!fWrite) 136 { 137 for (uint32_t i = 0; i < cCompleted; i++) 138 { 139 /* Compare that we read the right stuff. */ 140 void *pvBuf = RTFileAioReqGetUser(aReqsCompleted[i]); 141 142 size_t cbTransfered; 143 int rcReq = RTFileAioReqGetRC(aReqsCompleted[i], &cbTransfered); 144 if (RT_FAILURE(rcReq) || (cbTransfered != cbTestBuf)) 145 { 146 RTPrintf("tstFileAio: FATAL ERROR - Request %d failed with rc=%Rrc cbTransfered=%d.\n", 147 i, rcReq, cbTransfered); 148 cErrors++; 149 rc = rcReq; 150 break; 151 } 152 153 if (memcmp(pvBuf, pvTestBuf, cbTestBuf) != 0) 154 { 155 RTPrintf("tstFileAio: FATAL ERROR - Unexpected content in memory.\n"); 156 cErrors++; 157 break; 158 } 159 memset(pvBuf, 0, cbTestBuf); 160 } 161 } 162 cRun++; 163 if (RT_FAILURE(rc)) 164 break; 165 } 166 167 /* Free buffers. */ 168 for (unsigned i = 0; i < RT_ELEMENTS(apvBuf); i++) 169 RTMemPageFree(apvBuf[i]); 170 171 /* Free requests. */ 172 for (unsigned i = 0; i < RT_ELEMENTS(aReqs); i++) 173 RTFileAioReqDestroy(aReqs[i]); 174 175 NanoTS = RTTimeNanoTS() - NanoTS; 176 unsigned SpeedKBs = cbTestFile / (NanoTS / 1000000000.0) / 1024; 177 178 RTPrintf("tstFileAio: Completed simple %s test: %d.%03d MB/sec\n", 179 fWrite ? "write" : "read", 180 SpeedKBs / 1000, 181 SpeedKBs % 1000); 73 182 } 74 75 /* Initialize requests. */ 76 for (unsigned i = 0; i < RT_ELEMENTS(aReqs); i++) 77 RTFileAioReqCreate(&aReqs[i]); 78 79 while (cbLeft) 183 else 80 184 { 81 int cReqs = 0; 82 83 for (unsigned i = 0; i < RT_ELEMENTS(aReqs); i++) 84 { 85 size_t cbTransfer = (cbLeft < cbTestBuf) ? cbLeft : cbTestBuf; 86 87 if (!cbTransfer) 88 break; 89 90 if (fWrite) 91 rc = RTFileAioReqPrepareWrite(aReqs[i], File, Offset, apvBuf[i], 92 cbTransfer, apvBuf[i]); 93 else 94 rc = RTFileAioReqPrepareRead(aReqs[i], File, Offset, apvBuf[i], 95 cbTransfer, apvBuf[i]); 96 97 cbLeft -= cbTransfer; 98 Offset += cbTransfer; 99 cReqs++; 100 } 101 102 rc = RTFileAioCtxSubmit(hAioContext, aReqs, cReqs); 103 if (RT_FAILURE(rc)) 104 { 105 RTPrintf("tstFileAio: FATAL ERROR - Failed to submit tasks. rc=%Rrc\n", rc); 106 cErrors++; 107 break; 108 } 109 110 /* Wait */ 111 RTFILEAIOREQ aReqsCompleted[TSTFILEAIO_MAX_REQS_IN_FLIGHT]; 112 uint32_t cCompleted = 0; 113 rc = RTFileAioCtxWait(hAioContext, cReqs, RT_INDEFINITE_WAIT, 114 aReqsCompleted, TSTFILEAIO_MAX_REQS_IN_FLIGHT, 115 &cCompleted); 116 if (RT_FAILURE(rc)) 117 { 118 RTPrintf("tstFileAio: FATAL ERROR - Waiting failed. rc=%Rrc\n", rc); 119 cErrors++; 120 break; 121 } 122 123 if (!fWrite) 124 { 125 for (uint32_t i = 0; i < cCompleted; i++) 126 { 127 /* Compare that we read the right stuff. */ 128 void *pvBuf = RTFileAioReqGetUser(aReqsCompleted[i]); 129 130 if (memcmp(pvBuf, pvTestBuf, cbTestBuf) != 0) 131 { 132 RTPrintf("tstFileAio: FATAL ERROR - Unexpected content in memory.\n"); 133 cErrors++; 134 break; 135 } 136 memset(pvBuf, 0, cbTestBuf); 137 } 138 } 185 RTPrintf("tstFileAio: FATAL ERROR - Failed to asssociate file with async I/O context. rc=%Rrc\n", rc); 186 cErrors++; 139 187 } 140 141 /* Free buffers. */142 for (unsigned i = 0; i < RT_ELEMENTS(apvBuf); i++)143 RTMemPageFree(apvBuf[i]);144 145 /* Free requests. */146 for (unsigned i = 0; i < RT_ELEMENTS(aReqs); i++)147 RTFileAioReqDestroy(aReqs[i]);148 149 NanoTS = RTTimeNanoTS() - NanoTS;150 unsigned SpeedKBs = cbTestFile / (NanoTS / 1000000000.0) / 1024;151 152 RTPrintf("tstFileAio: Completed simple %s test: %d.%03d MB/sec\n",153 fWrite ? "write" : "read",154 SpeedKBs / 1000,155 SpeedKBs % 1000);156 188 157 189 rc = RTFileAioCtxDestroy(hAioContext); … … 190 222 RTPrintf("tstFileAio: Preparing test file, this can take some time and needs quite a bit of harddisk\n"); 191 223 tstFileAioTestReadWriteBasic(File, true, pvTestBuf, 64*_1K, 100*_1M); 192 tstFileAioTestReadWriteBasic(File, false, pvTestBuf, 64*_1K, 100*_1M); 193 224 /* Reopen the file. */ 194 225 RTFileClose(File); 226 rc = RTFileOpen(&File, "tstFileAio#1.tst", RTFILE_O_READWRITE | RTFILE_O_DENY_NONE | RTFILE_O_ASYNC_IO); 227 if (RT_SUCCESS(rc)) 228 { 229 tstFileAioTestReadWriteBasic(File, false, pvTestBuf, 64*_1K, 100*_1M); 230 RTFileClose(File); 231 } 232 else 233 { 234 RTPrintf("tstFileAio: FATAL ERROR - Failed to open file #1. rc=%Rrc\n", rc); 235 cErrors++; 236 } 237 238 /* Cleanup */ 195 239 RTMemFree(pvTestBuf); 196 240 RTFileDelete("tstFileAio#1.tst");
Note:
See TracChangeset
for help on using the changeset viewer.