- Timestamp:
- Feb 28, 2022 11:09:46 AM (3 years ago)
- File:
-
- 1 edited
-
trunk/include/VBox/GuestHost/HGCMMock.h (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/GuestHost/HGCMMock.h
r93969 r93970 21 21 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. 22 22 */ 23 23 #ifndef VBOX_INCLUDED_HGCMMock_h 24 #define VBOX_INCLUDED_HGCMMock_h 25 #ifndef RT_WITHOUT_PRAGMA_ONCE 26 # pragma once 27 #endif 28 29 #include <iprt/types.h> 30 31 #include <iprt/asm.h> 24 32 #include <iprt/assert.h> 25 #include <iprt/ initterm.h>33 #include <iprt/list.h> 26 34 #include <iprt/mem.h> 27 35 #include <iprt/rand.h> 28 36 #include <iprt/semaphore.h> 29 #include <iprt/stream.h>30 #include <iprt/string.h>31 37 #include <iprt/test.h> 38 #include <iprt/time.h> 39 #include <iprt/thread.h> 32 40 #include <iprt/utf16.h> 33 41 42 #include <VBox/err.h> 34 43 #include <VBox/VBoxGuestLib.h> 44 #include <VBox/hgcmsvc.h> 35 45 36 46 … … 39 49 *********************************************************************************************************************************/ 40 50 41 extern "C" DECLCALLBACK(DECLEXPORT(int)) VBoxHGCMSvcLoad(VBOXHGCMSVCFNTABLE *ptable); 42 43 typedef uint32_t HGCMCLIENTID; 51 RT_C_DECLS_BEGIN 52 53 #if defined(IN_RING3) /* Only R3 parts implemented so far. */ 54 55 extern DECLCALLBACK(DECLEXPORT(int)) VBoxHGCMSvcLoad(VBOXHGCMSVCFNTABLE *ptable); 56 44 57 # define VBGLR3DECL(type) DECL_HIDDEN_NOTHROW(type) VBOXCALL 45 58 46 RT_C_DECLS_BEGIN47 48 59 /** Simple call handle structure for the guest call completion callback. */ 49 struct VBOXHGCMCALLHANDLE_TYPEDEF60 typedef struct VBOXHGCMCALLHANDLE_TYPEDEF 50 61 { 51 62 /** Where to store the result code on call completion. */ 52 63 int32_t rc; 53 } ;64 } VBOXHGCMCALLHANDLE_TYPEDEF; 54 65 55 66 /** … … 65 76 } TSTHGCMMOCKFNTYPE; 66 77 67 /** Forward declaration of the HGCM mockservice. */68 structTSTHGCMMOCKSVC;78 /** Pointer to a mock HGCM service. */ 79 typedef struct TSTHGCMMOCKSVC *PTSTHGCMMOCKSVC; 69 80 70 81 /** … … 74 85 { 75 86 /** Pointer to to mock service instance this client belongs to. */ 76 TSTHGCMMOCKSVC *pSvc;87 PTSTHGCMMOCKSVC pSvc; 77 88 /** Assigned HGCM client ID. */ 78 89 uint32_t idClient; … … 108 119 union 109 120 { 110 struct111 {112 } Connect;113 struct114 {115 } Disconnect;116 121 struct 117 122 { … … 170 175 volatile bool fShutdown; 171 176 } TSTHGCMMOCKSVC; 172 /** Pointer to a mock HGCM service. */173 typedef TSTHGCMMOCKSVC *PTSTHGCMMOCKSVC;174 177 175 178 /** Static HGCM service to mock. */ 176 179 static TSTHGCMMOCKSVC s_tstHgcmSvc; 177 178 180 179 181 /********************************************************************************************************************************* 180 182 * Prototypes. * 181 183 *********************************************************************************************************************************/ 182 DECLINLINE(PTSTHGCMMOCKSVC) tstHgcmMockSvcInst(void); 184 PTSTHGCMMOCKSVC TstHgcmMockSvcInst(void); 185 PTSTHGCMMOCKCLIENT TstHgcmMockSvcWaitForConnectEx(PTSTHGCMMOCKSVC pSvc, RTMSINTERVAL msTimeout); 186 PTSTHGCMMOCKCLIENT TstHgcmMockSvcWaitForConnect(PTSTHGCMMOCKSVC pSvc); 187 int TstHgcmMockSvcCreate(PTSTHGCMMOCKSVC pSvc, size_t cbClient); 188 int TstHgcmMockSvcDestroy(PTSTHGCMMOCKSVC pSvc); 189 int TstHgcmMockSvcStart(PTSTHGCMMOCKSVC pSvc); 190 int TstHgcmMockSvcStop(PTSTHGCMMOCKSVC pSvc); 191 192 int TstHgcmMockSvcHostCall(PTSTHGCMMOCKSVC pSvc, void *pvService, int32_t function, uint32_t cParms, VBOXHGCMSVCPARM paParms[]); 193 194 VBGLR3DECL(int) VbglR3HGCMConnect(const char *pszServiceName, HGCMCLIENTID *pidClient); 195 VBGLR3DECL(int) VbglR3HGCMDisconnect(HGCMCLIENTID idClient); 196 VBGLR3DECL(int) VbglR3HGCMCall(PVBGLIOCHGCMCALL pInfo, size_t cbInfo); 197 183 198 184 199 … … 328 343 329 344 /* @copydoc VBOXHGCMSVCFNTABLE::pfnHostCall */ 330 static DECLCALLBACK(int) tstHgcmMockSvcHostCall(PTSTHGCMMOCKSVC pSvc, void *pvService, int32_t function, uint32_t cParms, VBOXHGCMSVCPARM paParms[]) 345 /** Note: Public for also being able to test host calls via testcases. */ 346 int TstHgcmMockSvcHostCall(PTSTHGCMMOCKSVC pSvc, void *pvService, int32_t function, uint32_t cParms, VBOXHGCMSVCPARM paParms[]) 331 347 { 332 348 RT_NOREF(pvService); … … 371 387 static DECLCALLBACK(int) tstHgcmMockSvcCallComplete(VBOXHGCMCALLHANDLE callHandle, int32_t rc) 372 388 { 373 PTSTHGCMMOCKSVC pSvc = tstHgcmMockSvcInst();389 PTSTHGCMMOCKSVC pSvc = TstHgcmMockSvcInst(); 374 390 375 391 for (size_t i = 0; RT_ELEMENTS(pSvc->aHgcmClient); i++) … … 501 517 * @return Pointer to HGCM mock service instance. 502 518 */ 503 DECLINLINE(PTSTHGCMMOCKSVC) tstHgcmMockSvcInst(void)519 PTSTHGCMMOCKSVC TstHgcmMockSvcInst(void) 504 520 { 505 521 return &s_tstHgcmSvc; … … 507 523 508 524 /** 509 * Waits for a HGCM mock client to connect .525 * Waits for a HGCM mock client to connect, extended version. 510 526 * 511 527 * @return VBox status code. 512 528 * @param pSvc HGCM mock service instance. 513 */ 514 static PTSTHGCMMOCKCLIENT tstHgcmMockSvcWaitForConnect(PTSTHGCMMOCKSVC pSvc) 515 { 516 int rc = RTSemEventWait(pSvc->hEventWait, RT_MS_30SEC); 529 * @param msTimeout Timeout (in ms) to wait for connection. 530 */ 531 PTSTHGCMMOCKCLIENT TstHgcmMockSvcWaitForConnectEx(PTSTHGCMMOCKSVC pSvc, RTMSINTERVAL msTimeout) 532 { 533 int rc = RTSemEventWait(pSvc->hEventWait, msTimeout); 517 534 if (RT_SUCCESS(rc)) 518 535 { … … 521 538 } 522 539 return NULL; 540 } 541 542 /** 543 * Waits for a HGCM mock client to connect. 544 * 545 * @return VBox status code. 546 * @param pSvc HGCM mock service instance. 547 */ 548 PTSTHGCMMOCKCLIENT TstHgcmMockSvcWaitForConnect(PTSTHGCMMOCKSVC pSvc) 549 { 550 return TstHgcmMockSvcWaitForConnectEx(pSvc, RT_MS_30SEC); 523 551 } 524 552 … … 531 559 * allocate for a HGCM mock client. 532 560 */ 533 static int tstHgcmMockSvcCreate(PTSTHGCMMOCKSVC pSvc, size_t cbClient)561 int TstHgcmMockSvcCreate(PTSTHGCMMOCKSVC pSvc, size_t cbClient) 534 562 { 535 563 AssertReturn(cbClient, VERR_INVALID_PARAMETER); … … 562 590 * @param pSvc HGCM mock service instance to destroy. 563 591 */ 564 static int tstHgcmMockSvcDestroy(PTSTHGCMMOCKSVC pSvc)592 int TstHgcmMockSvcDestroy(PTSTHGCMMOCKSVC pSvc) 565 593 { 566 594 int rc = RTSemEventDestroy(pSvc->hEventQueue); … … 580 608 * @param pSvc HGCM mock service instance to start. 581 609 */ 582 static int tstHgcmMockSvcStart(PTSTHGCMMOCKSVC pSvc)610 int TstHgcmMockSvcStart(PTSTHGCMMOCKSVC pSvc) 583 611 { 584 612 int rc = RTThreadCreate(&pSvc->hThread, tstHgcmMockSvcThread, pSvc, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, … … 596 624 * @param pSvc HGCM mock service instance to stop. 597 625 */ 598 static int tstHgcmMockSvcStop(PTSTHGCMMOCKSVC pSvc)626 int TstHgcmMockSvcStop(PTSTHGCMMOCKSVC pSvc) 599 627 { 600 628 ASMAtomicWriteBool(&pSvc->fShutdown, true); … … 629 657 RT_NOREF(pszServiceName); 630 658 631 PTSTHGCMMOCKSVC pSvc = tstHgcmMockSvcInst();659 PTSTHGCMMOCKSVC pSvc = TstHgcmMockSvcInst(); 632 660 633 661 return tstHgcmMockSvcConnect(pSvc, pSvc->fnTable.pvService, pidClient); … … 642 670 VBGLR3DECL(int) VbglR3HGCMDisconnect(HGCMCLIENTID idClient) 643 671 { 644 PTSTHGCMMOCKSVC pSvc = tstHgcmMockSvcInst();672 PTSTHGCMMOCKSVC pSvc = TstHgcmMockSvcInst(); 645 673 646 674 return tstHgcmMockSvcDisconnect(pSvc, pSvc->fnTable.pvService, idClient); … … 698 726 } 699 727 700 PTSTHGCMMOCKSVC const pSvc = tstHgcmMockSvcInst();728 PTSTHGCMMOCKSVC const pSvc = TstHgcmMockSvcInst(); 701 729 702 730 int rc2 = tstHgcmMockSvcCall(pSvc, pSvc->fnTable.pvService, &pSvc->aHgcmClient[pInfo->u32ClientID].hCall, … … 743 771 } 744 772 773 #endif /* IN_RING3 */ 774 745 775 RT_C_DECLS_END 776 777 #endif /* !VBOX_INCLUDED_HGCMMock_h */
Note:
See TracChangeset
for help on using the changeset viewer.

