Changeset 83296 in vbox for trunk/src/VBox/Devices/testcase
- Timestamp:
- Mar 16, 2020 11:43:32 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 136463
- Location:
- trunk/src/VBox/Devices/testcase
- Files:
-
- 3 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/testcase/tstDeviceInternal.h
r83261 r83296 141 141 142 142 143 /** 144 * The usual device/driver/internal/external stuff. 145 */ 146 typedef enum 147 { 148 /** The usual invalid entry. */ 149 PDMTHREADTYPE_INVALID = 0, 150 /** Device type. */ 151 PDMTHREADTYPE_DEVICE, 152 /** USB Device type. */ 153 PDMTHREADTYPE_USB, 154 /** Driver type. */ 155 PDMTHREADTYPE_DRIVER, 156 /** Internal type. */ 157 PDMTHREADTYPE_INTERNAL, 158 /** External type. */ 159 PDMTHREADTYPE_EXTERNAL, 160 /** The usual 32-bit hack. */ 161 PDMTHREADTYPE_32BIT_HACK = 0x7fffffff 162 } PDMTHREADTYPE; 163 164 165 /** 166 * The internal structure for the thread. 167 */ 168 typedef struct PDMTHREADINT 169 { 170 /** Node for the list of threads. */ 171 RTLISTNODE NdPdmThrds; 172 /** Pointer to the device under test the allocation was made for. */ 173 PTSTDEVDUTINT pDut; 174 /** The event semaphore the thread blocks on when not running. */ 175 RTSEMEVENTMULTI BlockEvent; 176 /** The event semaphore the thread sleeps on while running. */ 177 RTSEMEVENTMULTI SleepEvent; 178 /** The thread type. */ 179 PDMTHREADTYPE enmType; 180 } PDMTHREADINT; 181 182 183 #define PDMTHREADINT_DECLARED 143 184 #define PDMCRITSECTINT_DECLARED 144 185 #define PDMDEVINSINT_DECLARED … … 148 189 RT_C_DECLS_END 149 190 #include <VBox/vmm/pdmcritsect.h> 191 #include <VBox/vmm/pdmthread.h> 150 192 #include <VBox/vmm/pdmdev.h> 151 193 #include <VBox/vmm/pdmpci.h> … … 416 458 } 417 459 460 DECLHIDDEN(int) tstDevPdmR3ThreadCreateDevice(PTSTDEVDUTINT pDut, PPDMDEVINS pDevIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDEV pfnThread, 461 PFNPDMTHREADWAKEUPDEV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName); 462 DECLHIDDEN(int) tstDevPdmR3ThreadCreateUsb(PTSTDEVDUTINT pDut, PPDMUSBINS pUsbIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADUSB pfnThread, 463 PFNPDMTHREADWAKEUPUSB pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName); 464 DECLHIDDEN(int) tstDevPdmR3ThreadCreateDriver(PTSTDEVDUTINT pDut, PPDMDRVINS pDrvIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDRV pfnThread, 465 PFNPDMTHREADWAKEUPDRV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName); 466 DECLHIDDEN(int) tstDevPdmR3ThreadCreate(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADINT pfnThread, 467 PFNPDMTHREADWAKEUPINT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName); 468 DECLHIDDEN(int) tstDevPdmR3ThreadCreateExternal(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADEXT pfnThread, 469 PFNPDMTHREADWAKEUPEXT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName); 470 DECLHIDDEN(int) tstDevPdmR3ThreadDestroy(PPDMTHREAD pThread, int *pRcThread); 471 DECLHIDDEN(int) tstDevPdmR3ThreadDestroyDevice(PTSTDEVDUTINT pDut, PPDMDEVINS pDevIns); 472 DECLHIDDEN(int) tstDevPdmR3ThreadDestroyUsb(PTSTDEVDUTINT pDut, PPDMUSBINS pUsbIns); 473 DECLHIDDEN(int) tstDevPdmR3ThreadDestroyDriver(PTSTDEVDUTINT pDut, PPDMDRVINS pDrvIns); 474 DECLHIDDEN(void) tstDevPdmR3ThreadDestroyAll(PTSTDEVDUTINT pDut); 475 DECLHIDDEN(int) tstDevPdmR3ThreadIAmSuspending(PPDMTHREAD pThread); 476 DECLHIDDEN(int) tstDevPdmR3ThreadIAmRunning(PPDMTHREAD pThread); 477 DECLHIDDEN(int) tstDevPdmR3ThreadSleep(PPDMTHREAD pThread, RTMSINTERVAL cMillies); 478 DECLHIDDEN(int) tstDevPdmR3ThreadSuspend(PPDMTHREAD pThread); 479 DECLHIDDEN(int) tstDevPdmR3ThreadResume(PPDMTHREAD pThread); 480 481 418 482 RT_C_DECLS_END 419 483 -
trunk/src/VBox/Devices/testcase/tstDevicePdmDevHlp.cpp
r83281 r83296 2707 2707 pszDesc, pszDesc, phType)); 2708 2708 2709 int rc = VERR_NOT_IMPLEMENTED; 2710 AssertFailed(); 2709 #ifndef VBOX_TSTDEV_NOT_IMPLEMENTED_STUBS_FAKE_SUCCESS 2710 int rc = VERR_NOT_IMPLEMENTED; 2711 AssertFailed(); 2712 #else 2713 int rc = VINF_SUCCESS; 2714 #endif 2711 2715 2712 2716 LogRel(("pdmR3DevHlp_PGMHandlerPhysicalTypeRegister: caller='%s'/%d: returns %Rrc\n", … … 4210 4214 pDevIns->pReg->szName, pDevIns->iInstance, ppThread, pvUser, pfnThread, pfnWakeup, cbStack, enmType, pszName, pszName)); 4211 4215 4212 RT_NOREF(ppThread, pvUser, pfnThread, pfnWakeup, cbStack, enmType, pszName); 4213 4214 #ifndef VBOX_TSTDEV_NOT_IMPLEMENTED_STUBS_FAKE_SUCCESS 4215 int rc = VERR_NOT_IMPLEMENTED; 4216 AssertFailed(); 4217 #else 4218 int rc = VINF_SUCCESS; 4219 #endif 4216 int rc = tstDevPdmR3ThreadCreateDevice(pDevIns->Internal.s.pDut, pDevIns, ppThread, pvUser, pfnThread, pfnWakeup, cbStack, enmType, pszName); 4220 4217 4221 4218 LogFlow(("pdmR3DevHlp_ThreadCreate: caller='%s'/%d: returns %Rrc *ppThread=%RTthrd\n", pDevIns->pReg->szName, pDevIns->iInstance, … … 4227 4224 static DECLCALLBACK(int) pdmR3DevHlp_ThreadDestroy(PPDMTHREAD pThread, int *pRcThread) 4228 4225 { 4229 RT_NOREF(pThread, pRcThread); 4230 int rc = VERR_NOT_IMPLEMENTED; 4231 AssertFailed(); 4232 return rc; 4226 return tstDevPdmR3ThreadDestroy(pThread, pRcThread); 4233 4227 } 4234 4228 … … 4236 4230 static DECLCALLBACK(int) pdmR3DevHlp_ThreadIAmSuspending(PPDMTHREAD pThread) 4237 4231 { 4238 RT_NOREF(pThread); 4239 int rc = VERR_NOT_IMPLEMENTED; 4240 AssertFailed(); 4241 return rc; 4232 return tstDevPdmR3ThreadIAmSuspending(pThread); 4242 4233 } 4243 4234 … … 4245 4236 static DECLCALLBACK(int) pdmR3DevHlp_ThreadIamRunning(PPDMTHREAD pThread) 4246 4237 { 4247 RT_NOREF(pThread); 4248 int rc = VERR_NOT_IMPLEMENTED; 4249 AssertFailed(); 4250 return rc; 4238 return tstDevPdmR3ThreadIAmRunning(pThread); 4251 4239 } 4252 4240 … … 4254 4242 static DECLCALLBACK(int) pdmR3DevHlp_ThreadSleep(PPDMTHREAD pThread, RTMSINTERVAL cMillies) 4255 4243 { 4256 RT_NOREF(pThread, cMillies); 4257 int rc = VERR_NOT_IMPLEMENTED; 4258 AssertFailed(); 4259 return rc; 4244 return tstDevPdmR3ThreadSleep(pThread, cMillies); 4260 4245 } 4261 4246 … … 4263 4248 static DECLCALLBACK(int) pdmR3DevHlp_ThreadSuspend(PPDMTHREAD pThread) 4264 4249 { 4265 RT_NOREF(pThread); 4266 int rc = VERR_NOT_IMPLEMENTED; 4267 AssertFailed(); 4268 return rc; 4250 return tstDevPdmR3ThreadSuspend(pThread); 4269 4251 } 4270 4252 … … 4272 4254 static DECLCALLBACK(int) pdmR3DevHlp_ThreadResume(PPDMTHREAD pThread) 4273 4255 { 4274 RT_NOREF(pThread); 4275 int rc = VERR_NOT_IMPLEMENTED; 4276 AssertFailed(); 4277 return rc; 4256 return tstDevPdmR3ThreadResume(pThread); 4278 4257 } 4279 4258 -
trunk/src/VBox/Devices/testcase/tstDevicePdmThread.cpp
r83294 r83296 1 1 /* $Id$ */ 2 2 /** @file 3 * PDM Thread - VM Thread Management.3 * PDM Thread - Thread Management (copied from PDMThread). 4 4 */ 5 5 … … 21 21 *********************************************************************************************************************************/ 22 22 /// @todo \#define LOG_GROUP LOG_GROUP_PDM_THREAD 23 #include "PDMInternal.h"24 #include <VBox/vmm/pdm.h>25 #include <VBox/vmm/mm.h>26 #include <VBox/vmm/vm.h>27 #include <VBox/vmm/uvm.h>28 23 #include <VBox/err.h> 29 30 24 #include <VBox/log.h> 25 31 26 #include <iprt/asm.h> 32 27 #include <iprt/semaphore.h> 33 28 #include <iprt/assert.h> 29 #include <iprt/mem.h> 34 30 #include <iprt/thread.h> 31 32 #include "tstDeviceInternal.h" 35 33 36 34 … … 78 76 79 77 case PDMTHREADTYPE_INTERNAL: 80 rc = pThread->u.Int.pfnWakeUp( pThread->Internal.s.pVM, pThread);78 rc = pThread->u.Int.pfnWakeUp(NULL /*pVM*/, pThread); 81 79 break; 82 80 … … 99 97 * 100 98 * @returns VBox status code. 101 * @param p VM The cross context VM structure.99 * @param pDut The device under test. 102 100 * @param ppThread Where to store the pointer to the instance. 103 101 */ 104 static int pdmR3ThreadNew(PVM pVM, PPPDMTHREAD ppThread) 105 { 106 PPDMTHREAD pThread; 107 int rc = MMR3HeapAllocZEx(pVM, MM_TAG_PDM_THREAD, sizeof(*pThread), (void **)&pThread); 108 if (RT_FAILURE(rc)) 109 return rc; 110 111 pThread->u32Version = PDMTHREAD_VERSION; 112 pThread->enmState = PDMTHREADSTATE_INITIALIZING; 113 pThread->Thread = NIL_RTTHREAD; 114 pThread->Internal.s.pVM = pVM; 102 static int pdmR3ThreadNew(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread) 103 { 104 PPDMTHREAD pThread = (PPDMTHREAD)RTMemAllocZ(sizeof(*pThread)); 105 if (!pThread) 106 return VERR_NO_MEMORY; 107 108 pThread->u32Version = PDMTHREAD_VERSION; 109 pThread->enmState = PDMTHREADSTATE_INITIALIZING; 110 pThread->Thread = NIL_RTTHREAD; 111 pThread->Internal.s.pDut = pDut; 115 112 116 113 *ppThread = pThread; … … 124 121 * 125 122 * @returns VBox status code. 126 * @param p VM The cross context VM structure.123 * @param pDut The device under test. 127 124 * @param ppThread Where the thread instance data handle is. 128 125 * @param cbStack The stack size, see RTThreadCreate(). … … 130 127 * @param pszName The thread name, see RTThreadCreate(). 131 128 */ 132 static int pdmR3ThreadInit(P VM pVM, PPPDMTHREAD ppThread, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)129 static int pdmR3ThreadInit(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, size_t cbStack, RTTHREADTYPE enmType, const char *pszName) 133 130 { 134 131 PPDMTHREAD pThread = *ppThread; 135 PUVM pUVM = pVM->pUVM;136 137 /*138 * Initialize the remainder of the structure.139 */140 pThread->Internal.s.pVM = pVM;141 132 142 133 int rc = RTSemEventMultiCreate(&pThread->Internal.s.BlockEvent); … … 163 154 * Insert it into the thread list. 164 155 */ 165 RTCritSectEnter(&pUVM->pdm.s.ListCritSect); 166 pThread->Internal.s.pNext = NULL; 167 if (pUVM->pdm.s.pThreadsTail) 168 pUVM->pdm.s.pThreadsTail->Internal.s.pNext = pThread; 169 else 170 pUVM->pdm.s.pThreads = pThread; 171 pUVM->pdm.s.pThreadsTail = pThread; 172 RTCritSectLeave(&pUVM->pdm.s.ListCritSect); 156 tstDevDutLockExcl(pDut); 157 RTListAppend(&pDut->LstPdmThreads, &pThread->Internal.s.NdPdmThrds); 158 tstDevDutUnlockExcl(pDut); 173 159 174 160 rc = RTThreadUserReset(Thread); … … 186 172 pThread->Internal.s.BlockEvent = NIL_RTSEMEVENTMULTI; 187 173 } 188 MMR3HeapFree(pThread);174 RTMemFree(pThread); 189 175 *ppThread = NULL; 190 176 … … 197 183 * 198 184 * @returns VBox status code. 199 * @param p VM The cross context VM structure.185 * @param pDut The device under test. 200 186 * @param pDevIns The device instance. 201 187 * @param ppThread Where to store the thread 'handle'. … … 208 194 * @param pszName See RTThreadCreate. 209 195 */ 210 int pdmR3ThreadCreateDevice(PVM pVM, PPDMDEVINS pDevIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDEV pfnThread,211 PFNPDMTHREADWAKEUPDEV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)212 { 213 int rc = pdmR3ThreadNew(p VM, ppThread);196 DECLHIDDEN(int) tstDevPdmR3ThreadCreateDevice(PTSTDEVDUTINT pDut, PPDMDEVINS pDevIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDEV pfnThread, 197 PFNPDMTHREADWAKEUPDEV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName) 198 { 199 int rc = pdmR3ThreadNew(pDut, ppThread); 214 200 if (RT_SUCCESS(rc)) 215 201 { … … 220 206 pThread->u.Dev.pfnThread = pfnThread; 221 207 pThread->u.Dev.pfnWakeUp = pfnWakeUp; 222 rc = pdmR3ThreadInit(p VM, ppThread, cbStack, enmType, pszName);208 rc = pdmR3ThreadInit(pDut, ppThread, cbStack, enmType, pszName); 223 209 } 224 210 return rc; … … 230 216 * 231 217 * @returns VBox status code. 232 * @param p VM The cross context VM structure.218 * @param pDut The device under test. 233 219 * @param pUsbIns The USB device instance. 234 220 * @param ppThread Where to store the thread 'handle'. … … 241 227 * @param pszName See RTThreadCreate. 242 228 */ 243 int pdmR3ThreadCreateUsb(PVM pVM, PPDMUSBINS pUsbIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADUSB pfnThread,244 PFNPDMTHREADWAKEUPUSB pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)245 { 246 int rc = pdmR3ThreadNew(p VM, ppThread);229 DECLHIDDEN(int) tstDevPdmR3ThreadCreateUsb(PTSTDEVDUTINT pDut, PPDMUSBINS pUsbIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADUSB pfnThread, 230 PFNPDMTHREADWAKEUPUSB pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName) 231 { 232 int rc = pdmR3ThreadNew(pDut, ppThread); 247 233 if (RT_SUCCESS(rc)) 248 234 { … … 253 239 pThread->u.Usb.pfnThread = pfnThread; 254 240 pThread->u.Usb.pfnWakeUp = pfnWakeUp; 255 rc = pdmR3ThreadInit(p VM, ppThread, cbStack, enmType, pszName);241 rc = pdmR3ThreadInit(pDut, ppThread, cbStack, enmType, pszName); 256 242 } 257 243 return rc; … … 263 249 * 264 250 * @returns VBox status code. 265 * @param p VM The cross context VM structure.251 * @param pDut The device under test. 266 252 * @param pDrvIns The driver instance. 267 253 * @param ppThread Where to store the thread 'handle'. … … 274 260 * @param pszName See RTThreadCreate. 275 261 */ 276 int pdmR3ThreadCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDRV pfnThread,277 PFNPDMTHREADWAKEUPDRV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)278 { 279 int rc = pdmR3ThreadNew(p VM, ppThread);262 DECLHIDDEN(int) tstDevPdmR3ThreadCreateDriver(PTSTDEVDUTINT pDut, PPDMDRVINS pDrvIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDRV pfnThread, 263 PFNPDMTHREADWAKEUPDRV pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName) 264 { 265 int rc = pdmR3ThreadNew(pDut, ppThread); 280 266 if (RT_SUCCESS(rc)) 281 267 { … … 286 272 pThread->u.Drv.pfnThread = pfnThread; 287 273 pThread->u.Drv.pfnWakeUp = pfnWakeUp; 288 rc = pdmR3ThreadInit(p VM, ppThread, cbStack, enmType, pszName);274 rc = pdmR3ThreadInit(pDut, ppThread, cbStack, enmType, pszName); 289 275 } 290 276 return rc; … … 296 282 * 297 283 * @returns VBox status code. 298 * @param p VM The cross context VM structure.284 * @param pDut The device under test. 299 285 * @param ppThread Where to store the thread 'handle'. 300 286 * @param pvUser The user argument to the thread function. … … 306 292 * @param pszName See RTThreadCreate. 307 293 */ 308 VMMR3DECL(int) PDMR3ThreadCreate(PVM pVM, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADINT pfnThread,309 PFNPDMTHREADWAKEUPINT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)310 { 311 int rc = pdmR3ThreadNew(p VM, ppThread);294 DECLHIDDEN(int) tstDevPdmR3ThreadCreate(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADINT pfnThread, 295 PFNPDMTHREADWAKEUPINT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName) 296 { 297 int rc = pdmR3ThreadNew(pDut, ppThread); 312 298 if (RT_SUCCESS(rc)) 313 299 { … … 317 303 pThread->u.Int.pfnThread = pfnThread; 318 304 pThread->u.Int.pfnWakeUp = pfnWakeUp; 319 rc = pdmR3ThreadInit(p VM, ppThread, cbStack, enmType, pszName);305 rc = pdmR3ThreadInit(pDut, ppThread, cbStack, enmType, pszName); 320 306 } 321 307 return rc; … … 327 313 * 328 314 * @returns VBox status code. 329 * @param p VM The cross context VM structure.315 * @param pDut The device under test. 330 316 * @param ppThread Where to store the thread 'handle'. 331 317 * @param pvUser The user argument to the thread function. … … 337 323 * @param pszName See RTThreadCreate. 338 324 */ 339 VMMR3DECL(int) PDMR3ThreadCreateExternal(PVM pVM, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADEXT pfnThread,340 PFNPDMTHREADWAKEUPEXT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName)341 { 342 int rc = pdmR3ThreadNew(p VM, ppThread);325 DECLHIDDEN(int) tstDevPdmR3ThreadCreateExternal(PTSTDEVDUTINT pDut, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADEXT pfnThread, 326 PFNPDMTHREADWAKEUPEXT pfnWakeUp, size_t cbStack, RTTHREADTYPE enmType, const char *pszName) 327 { 328 int rc = pdmR3ThreadNew(pDut, ppThread); 343 329 if (RT_SUCCESS(rc)) 344 330 { … … 348 334 pThread->u.Ext.pfnThread = pfnThread; 349 335 pThread->u.Ext.pfnWakeUp = pfnWakeUp; 350 rc = pdmR3ThreadInit(p VM, ppThread, cbStack, enmType, pszName);336 rc = pdmR3ThreadInit(pDut, ppThread, cbStack, enmType, pszName); 351 337 } 352 338 return rc; … … 366 352 * @thread The emulation thread (EMT). 367 353 */ 368 VMMR3DECL(int) PDMR3ThreadDestroy(PPDMTHREAD pThread, int *pRcThread)354 DECLHIDDEN(int) tstDevPdmR3ThreadDestroy(PPDMTHREAD pThread, int *pRcThread) 369 355 { 370 356 /* … … 375 361 Assert(pThread->Thread != RTThreadSelf()); 376 362 AssertPtrNullReturn(pRcThread, VERR_INVALID_POINTER); 377 PVM pVM = pThread->Internal.s.pVM; 378 VM_ASSERT_EMT(pVM); 379 PUVM pUVM = pVM->pUVM; 363 364 PTSTDEVDUTINT pDut = pThread->Internal.s.pDut; 380 365 381 366 /* … … 431 416 432 417 /* unlink */ 433 RTCritSectEnter(&pUVM->pdm.s.ListCritSect); 434 if (pUVM->pdm.s.pThreads == pThread) 435 { 436 pUVM->pdm.s.pThreads = pThread->Internal.s.pNext; 437 if (!pThread->Internal.s.pNext) 438 pUVM->pdm.s.pThreadsTail = NULL; 439 } 440 else 441 { 442 PPDMTHREAD pPrev = pUVM->pdm.s.pThreads; 443 while (pPrev && pPrev->Internal.s.pNext != pThread) 444 pPrev = pPrev->Internal.s.pNext; 445 Assert(pPrev); 446 if (pPrev) 447 pPrev->Internal.s.pNext = pThread->Internal.s.pNext; 448 if (!pThread->Internal.s.pNext) 449 pUVM->pdm.s.pThreadsTail = pPrev; 450 } 451 pThread->Internal.s.pNext = NULL; 452 RTCritSectLeave(&pUVM->pdm.s.ListCritSect); 418 tstDevDutLockExcl(pDut); 419 RTListNodeRemove(&pThread->Internal.s.NdPdmThrds); 420 tstDevDutUnlockExcl(pDut); 453 421 454 422 /* free the resources */ … … 459 427 pThread->Internal.s.SleepEvent = NIL_RTSEMEVENTMULTI; 460 428 461 MMR3HeapFree(pThread);429 RTMemFree(pThread); 462 430 } 463 431 else if (RT_SUCCESS(rc)) … … 475 443 * 476 444 * @returns VBox status code of the first failure. 477 * @param p VM The cross context VM structure.445 * @param pDut The device under test. 478 446 * @param pDevIns the device instance. 479 447 */ 480 int pdmR3ThreadDestroyDevice(PVM pVM, PPDMDEVINS pDevIns) 481 { 482 int rc = VINF_SUCCESS; 483 PUVM pUVM = pVM->pUVM; 448 DECLHIDDEN(int) tstDevPdmR3ThreadDestroyDevice(PTSTDEVDUTINT pDut, PPDMDEVINS pDevIns) 449 { 450 int rc = VINF_SUCCESS; 484 451 485 452 AssertPtr(pDevIns); 486 453 487 RTCritSectEnter(&pUVM->pdm.s.ListCritSect); 454 tstDevDutLockExcl(pDut); 455 #if 0 488 456 PPDMTHREAD pThread = pUVM->pdm.s.pThreads; 489 457 while (pThread) … … 499 467 pThread = pNext; 500 468 } 501 RTCritSectLeave(&pUVM->pdm.s.ListCritSect); 469 #endif 470 tstDevDutUnlockExcl(pDut); 502 471 return rc; 503 472 } … … 510 479 * 511 480 * @returns VBox status code of the first failure. 512 * @param p VM The cross context VM structure.481 * @param pDut The device under test. 513 482 * @param pUsbIns The USB device instance. 514 483 */ 515 int pdmR3ThreadDestroyUsb(PVM pVM, PPDMUSBINS pUsbIns) 516 { 517 int rc = VINF_SUCCESS; 518 PUVM pUVM = pVM->pUVM; 484 DECLHIDDEN(int) tstDevPdmR3ThreadDestroyUsb(PTSTDEVDUTINT pDut, PPDMUSBINS pUsbIns) 485 { 486 int rc = VINF_SUCCESS; 519 487 520 488 AssertPtr(pUsbIns); 521 489 522 RTCritSectEnter(&pUVM->pdm.s.ListCritSect); 490 tstDevDutLockExcl(pDut); 491 #if 0 523 492 PPDMTHREAD pThread = pUVM->pdm.s.pThreads; 524 493 while (pThread) … … 534 503 pThread = pNext; 535 504 } 536 RTCritSectLeave(&pUVM->pdm.s.ListCritSect); 505 #endif 506 tstDevDutUnlockExcl(pDut); 537 507 return rc; 538 508 } … … 545 515 * 546 516 * @returns VBox status code of the first failure. 547 * @param p VM The cross context VM structure.517 * @param pDut The device under test. 548 518 * @param pDrvIns The driver instance. 549 519 */ 550 int pdmR3ThreadDestroyDriver(PVM pVM, PPDMDRVINS pDrvIns) 551 { 552 int rc = VINF_SUCCESS; 553 PUVM pUVM = pVM->pUVM; 520 DECLHIDDEN(int) tstDevPdmR3ThreadDestroyDriver(PTSTDEVDUTINT pDut, PPDMDRVINS pDrvIns) 521 { 522 int rc = VINF_SUCCESS; 554 523 555 524 AssertPtr(pDrvIns); 556 525 557 RTCritSectEnter(&pUVM->pdm.s.ListCritSect); 526 tstDevDutLockExcl(pDut); 527 #if 0 558 528 PPDMTHREAD pThread = pUVM->pdm.s.pThreads; 559 529 while (pThread) … … 569 539 pThread = pNext; 570 540 } 571 RTCritSectLeave(&pUVM->pdm.s.ListCritSect); 541 #endif 542 tstDevDutUnlockExcl(pDut); 572 543 return rc; 573 544 } … … 577 548 * Called For VM power off. 578 549 * 579 * @param p VM The cross context VM structure.580 */ 581 void pdmR3ThreadDestroyAll(PVM pVM)582 { 583 PUVM pUVM = pVM->pUVM;584 RTCritSectEnter(&pUVM->pdm.s.ListCritSect); 550 * @param pDut The device under test. 551 */ 552 DECLHIDDEN(void) tstDevPdmR3ThreadDestroyAll(PTSTDEVDUTINT pDut) 553 { 554 tstDevDutLockExcl(pDut); 555 #if 0 585 556 PPDMTHREAD pThread = pUVM->pdm.s.pThreads; 586 557 while (pThread) … … 592 563 } 593 564 Assert(!pUVM->pdm.s.pThreads && !pUVM->pdm.s.pThreadsTail); 594 RTCritSectLeave(&pUVM->pdm.s.ListCritSect); 565 #endif 566 tstDevDutUnlockExcl(pDut); 595 567 } 596 568 … … 642 614 * @param pThread The PDM thread. 643 615 */ 644 VMMR3DECL(int) PDMR3ThreadIAmSuspending(PPDMTHREAD pThread)616 DECLHIDDEN(int) tstDevPdmR3ThreadIAmSuspending(PPDMTHREAD pThread) 645 617 { 646 618 /* … … 690 662 * @param pThread The PDM thread. 691 663 */ 692 VMMR3DECL(int) PDMR3ThreadIAmRunning(PPDMTHREAD pThread)664 DECLHIDDEN(int) tstDevPdmR3ThreadIAmRunning(PPDMTHREAD pThread) 693 665 { 694 666 /* … … 728 700 * @param cMillies The number of milliseconds to sleep. 729 701 */ 730 VMMR3DECL(int) PDMR3ThreadSleep(PPDMTHREAD pThread, RTMSINTERVAL cMillies)702 DECLHIDDEN(int) tstDevPdmR3ThreadSleep(PPDMTHREAD pThread, RTMSINTERVAL cMillies) 731 703 { 732 704 /* … … 759 731 Log(("PDMThread: Initializing thread %RTthrd / %p / '%s'...\n", Thread, pThread, RTThreadGetName(Thread))); 760 732 pThread->Thread = Thread; 761 762 PUVM pUVM = pThread->Internal.s.pVM->pUVM;763 if ( pUVM->pVmm2UserMethods764 && pUVM->pVmm2UserMethods->pfnNotifyPdmtInit)765 pUVM->pVmm2UserMethods->pfnNotifyPdmtInit(pUVM->pVmm2UserMethods, pUVM);766 733 767 734 /* … … 790 757 791 758 case PDMTHREADTYPE_INTERNAL: 792 rc = pThread->u.Int.pfnThread( pThread->Internal.s.pVM, pThread);759 rc = pThread->u.Int.pfnThread(NULL /*pVM*/, pThread); 793 760 break; 794 761 … … 815 782 break; 816 783 } 817 rc = PDMR3ThreadIAmSuspending(pThread);784 rc = tstDevPdmR3ThreadIAmSuspending(pThread); 818 785 if (RT_FAILURE(rc)) 819 786 break; … … 824 791 } 825 792 826 rc = PDMR3ThreadIAmRunning(pThread);793 rc = tstDevPdmR3ThreadIAmRunning(pThread); 827 794 if (RT_FAILURE(rc)) 828 795 break; … … 846 813 int rc2 = RTThreadUserSignal(Thread); AssertRC(rc2); 847 814 848 if ( pUVM->pVmm2UserMethods849 && pUVM->pVmm2UserMethods->pfnNotifyPdmtTerm)850 pUVM->pVmm2UserMethods->pfnNotifyPdmtTerm(pUVM->pVmm2UserMethods, pUVM);851 815 Log(("PDMThread: Terminating thread %RTthrd / %p / '%s': %Rrc\n", Thread, pThread, RTThreadGetName(Thread), rc)); 852 816 return rc; … … 911 875 * @param pThread The PDM thread. 912 876 */ 913 VMMR3DECL(int) PDMR3ThreadSuspend(PPDMTHREAD pThread)877 DECLHIDDEN(int) tstDevPdmR3ThreadSuspend(PPDMTHREAD pThread) 914 878 { 915 879 /* … … 967 931 968 932 /** 969 * Suspend all running threads.970 *971 * This is called by PDMR3Suspend() and PDMR3PowerOff() after all the devices972 * and drivers have been notified about the suspend / power off.973 *974 * @return VBox status code.975 * @param pVM The cross context VM structure.976 */977 int pdmR3ThreadSuspendAll(PVM pVM)978 {979 PUVM pUVM = pVM->pUVM;980 RTCritSectEnter(&pUVM->pdm.s.ListCritSect); /* This may cause deadlocks later... */981 for (PPDMTHREAD pThread = pUVM->pdm.s.pThreads; pThread; pThread = pThread->Internal.s.pNext)982 switch (pThread->enmState)983 {984 case PDMTHREADSTATE_RUNNING:985 {986 int rc = PDMR3ThreadSuspend(pThread);987 AssertLogRelMsgReturnStmt(RT_SUCCESS(rc),988 ("PDMR3ThreadSuspend -> %Rrc for '%s'\n", rc, RTThreadGetName(pThread->Thread)),989 RTCritSectLeave(&pUVM->pdm.s.ListCritSect),990 rc);991 break;992 }993 994 /* suspend -> power off; voluntary suspend. */995 case PDMTHREADSTATE_SUSPENDED:996 break;997 998 default:999 AssertMsgFailed(("pThread=%p enmState=%d\n", pThread, pThread->enmState));1000 break;1001 }1002 RTCritSectLeave(&pUVM->pdm.s.ListCritSect);1003 return VINF_SUCCESS;1004 }1005 1006 1007 /**1008 933 * Resumes the thread. 1009 934 * … … 1018 943 * @param pThread The PDM thread. 1019 944 */ 1020 VMMR3DECL(int) PDMR3ThreadResume(PPDMTHREAD pThread)945 DECLHIDDEN(int) tstDevPdmR3ThreadResume(PPDMTHREAD pThread) 1021 946 { 1022 947 /* … … 1060 985 } 1061 986 1062 1063 /**1064 * Resumes all threads not running.1065 *1066 * This is called by PDMR3Resume() and PDMR3PowerOn() after all the devices1067 * and drivers have been notified about the resume / power on .1068 *1069 * @return VBox status code.1070 * @param pVM The cross context VM structure.1071 */1072 int pdmR3ThreadResumeAll(PVM pVM)1073 {1074 PUVM pUVM = pVM->pUVM;1075 RTCritSectEnter(&pUVM->pdm.s.ListCritSect);1076 for (PPDMTHREAD pThread = pUVM->pdm.s.pThreads; pThread; pThread = pThread->Internal.s.pNext)1077 switch (pThread->enmState)1078 {1079 case PDMTHREADSTATE_SUSPENDED:1080 {1081 int rc = PDMR3ThreadResume(pThread);1082 AssertRCReturn(rc, rc);1083 break;1084 }1085 1086 default:1087 AssertMsgFailed(("pThread=%p enmState=%d\n", pThread, pThread->enmState));1088 break;1089 }1090 RTCritSectLeave(&pUVM->pdm.s.ListCritSect);1091 return VINF_SUCCESS;1092 }1093 -
trunk/src/VBox/Devices/testcase/tstDeviceSsmFuzz.cpp
r83261 r83296 104 104 if (RT_SUCCESS(rc)) 105 105 { 106 rc = RTFuzzCtxCorpusInputAddFromDirPath(hFuzzCtx, tstDevSsmFuzzGetCfgString(paCfg, cCfgItems, "CorpusPath")); 106 uint64_t cbMutateRange = tstDevSsmFuzzGetCfgU64(paCfg, cCfgItems, "OffMutateSize"); 107 if (!cbMutateRange) 108 cbMutateRange = UINT64_MAX; 109 110 rc = RTFuzzCtxCfgSetMutationRange(hFuzzCtx, 111 tstDevSsmFuzzGetCfgU64(paCfg, cCfgItems, "OffMutateStart"), 112 cbMutateRange); 113 if (RT_SUCCESS(rc)) 114 rc = RTFuzzCtxCorpusInputAddFromDirPath(hFuzzCtx, tstDevSsmFuzzGetCfgString(paCfg, cCfgItems, "CorpusPath")); 107 115 if (RT_SUCCESS(rc)) 108 116 {
Note:
See TracChangeset
for help on using the changeset viewer.