Changeset 51092 in vbox for trunk/src/VBox/Main/src-client/HGCM.cpp
- Timestamp:
- Apr 16, 2014 5:57:25 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 93367
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/src-client/HGCM.cpp
r48229 r51092 90 90 91 91 HGCMTHREADHANDLE m_thread; 92 friend DECLCALLBACK(void) hgcmServiceThread 92 friend DECLCALLBACK(void) hgcmServiceThread(HGCMTHREADHANDLE ThreadHandle, void *pvUser); 93 93 94 94 uint32_t volatile m_u32RefCnt; … … 116 116 HGCMSVCEXTHANDLE m_hExtension; 117 117 118 int loadServiceDLL 119 void unloadServiceDLL 118 int loadServiceDLL(void); 119 void unloadServiceDLL(void); 120 120 121 121 /* 122 122 * Main HGCM thread methods. 123 123 */ 124 int instanceCreate 125 void instanceDestroy 124 int instanceCreate(const char *pszServiceLibrary, const char *pszServiceName); 125 void instanceDestroy(void); 126 126 127 127 int saveClientState(uint32_t u32ClientId, PSSMHANDLE pSSM); 128 128 int loadClientState(uint32_t u32ClientId, PSSMHANDLE pSSM); 129 129 130 HGCMService 131 ~HGCMService 132 133 static DECLCALLBACK(void) svcHlpCallComplete 134 static DECLCALLBACK(void) svcHlpDisconnectClient 130 HGCMService(); 131 ~HGCMService() {}; 132 133 static DECLCALLBACK(void) svcHlpCallComplete(VBOXHGCMCALLHANDLE callHandle, int32_t rc); 134 static DECLCALLBACK(void) svcHlpDisconnectClient(void *pvInstance, uint32_t u32ClientId); 135 135 136 136 public: … … 139 139 * Main HGCM thread methods. 140 140 */ 141 static int LoadService 142 void UnloadService 143 144 static void UnloadAll 145 146 static int ResolveService 147 void ReferenceService 148 void ReleaseService 149 150 static void Reset 151 152 static int SaveState 153 static int LoadState 154 155 int CreateAndConnectClient 156 int DisconnectClient 157 158 int HostCall 141 static int LoadService(const char *pszServiceLibrary, const char *pszServiceName); 142 void UnloadService(void); 143 144 static void UnloadAll(void); 145 146 static int ResolveService(HGCMService **ppsvc, const char *pszServiceName); 147 void ReferenceService(void); 148 void ReleaseService(void); 149 150 static void Reset(void); 151 152 static int SaveState(PSSMHANDLE pSSM); 153 static int LoadState(PSSMHANDLE pSSM); 154 155 int CreateAndConnectClient(uint32_t *pu32ClientIdOut, uint32_t u32ClientIdIn); 156 int DisconnectClient(uint32_t u32ClientId, bool fFromService); 157 158 int HostCall(uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM *paParms); 159 159 160 160 #ifdef VBOX_WITH_CRHGSMI 161 161 int HandleAcquired(); 162 162 int HandleReleased(); 163 int HostFastCallAsync (uint32_t u32Function, VBOXHGCMSVCPARM *pParm, PHGCMHOSTFASTCALLCB pfnCompletion, void *pvCompletion); 163 int HostFastCallAsync(uint32_t u32Function, VBOXHGCMSVCPARM *pParm, PHGCMHOSTFASTCALLCB pfnCompletion, 164 void *pvCompletion); 164 165 #endif 165 166 166 uint32_t SizeOfClient 167 168 int RegisterExtension 169 void UnregisterExtension 167 uint32_t SizeOfClient(void) { return m_fntable.cbClient; }; 168 169 int RegisterExtension(HGCMSVCEXTHANDLE handle, PFNHGCMSVCEXT pfnExtension, void *pvExtension); 170 void UnregisterExtension(HGCMSVCEXTHANDLE handle); 170 171 171 172 /* … … 173 174 */ 174 175 175 int GuestCall (PPDMIHGCMPORT pHGCMPort, PVBOXHGCMCMD pCmd, uint32_t u32ClientId, uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM aParms[]); 176 int GuestCall(PPDMIHGCMPORT pHGCMPort, PVBOXHGCMCMD pCmd, uint32_t u32ClientId, 177 uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM aParms[]); 176 178 }; 177 179 … … 180 182 { 181 183 public: 182 HGCMClient 184 HGCMClient() : HGCMObject(HGCMOBJ_CLIENT), pService(NULL), 183 185 pvData(NULL) {}; 184 ~HGCMClient 185 186 int Init 186 ~HGCMClient(); 187 188 int Init(HGCMService *pSvc); 187 189 188 190 /** Service that the client is connected to. */ … … 193 195 }; 194 196 195 HGCMClient::~HGCMClient 196 { 197 if (pService->SizeOfClient 198 RTMemFree 199 } 200 201 int HGCMClient::Init 197 HGCMClient::~HGCMClient() 198 { 199 if (pService->SizeOfClient() > 0) 200 RTMemFree(pvData); 201 } 202 203 int HGCMClient::Init(HGCMService *pSvc) 202 204 { 203 205 pService = pSvc; 204 206 205 if (pService->SizeOfClient 206 { 207 pvData = RTMemAllocZ (pService->SizeOfClient());207 if (pService->SizeOfClient() > 0) 208 { 209 pvData = RTMemAllocZ(pService->SizeOfClient()); 208 210 209 211 if (!pvData) … … 217 219 218 220 219 #define HGCM_CLIENT_DATA(pService, pClient) 221 #define HGCM_CLIENT_DATA(pService, pClient)(pClient->pvData) 220 222 221 223 … … 225 227 int HGCMService::sm_cServices = 0; 226 228 227 HGCMService::HGCMService 229 HGCMService::HGCMService() 228 230 : 229 231 m_thread (0), … … 284 286 if (RT_FAILURE(rc) || !m_pfnLoad) 285 287 { 286 Log(("HGCMService::loadServiceDLL: Error resolving the service entry point %s, rc = %d, m_pfnLoad = %p\n", VBOX_HGCM_SVCLOAD_NAME, rc, m_pfnLoad)); 288 Log(("HGCMService::loadServiceDLL: Error resolving the service entry point %s, rc = %d, m_pfnLoad = %p\n", 289 VBOX_HGCM_SVCLOAD_NAME, rc, m_pfnLoad)); 287 290 288 291 if (RT_SUCCESS(rc)) … … 400 403 { 401 404 public: 402 HGCMMsgHeader () : pCmd (NULL), pHGCMPort(NULL) {};405 HGCMMsgHeader() : pCmd(NULL), pHGCMPort(NULL) {}; 403 406 404 407 /* Command pointer/identifier. */ … … 476 479 #endif 477 480 478 static HGCMMsgCore *hgcmMessageAllocSvc 481 static HGCMMsgCore *hgcmMessageAllocSvc(uint32_t u32MsgId) 479 482 { 480 483 switch (u32MsgId) 481 484 { 482 485 #ifdef VBOX_WITH_CRHGSMI 483 case SVC_MSG_HOSTFASTCALLASYNC: return new HGCMMsgHostFastCallAsyncSvc 486 case SVC_MSG_HOSTFASTCALLASYNC: return new HGCMMsgHostFastCallAsyncSvc(); 484 487 #endif 485 case SVC_MSG_LOAD: return new HGCMMsgSvcLoad 486 case SVC_MSG_UNLOAD: return new HGCMMsgSvcUnload 487 case SVC_MSG_CONNECT: return new HGCMMsgSvcConnect 488 case SVC_MSG_DISCONNECT: return new HGCMMsgSvcDisconnect 489 case SVC_MSG_HOSTCALL: return new HGCMMsgHostCallSvc 490 case SVC_MSG_GUESTCALL: return new HGCMMsgCall 488 case SVC_MSG_LOAD: return new HGCMMsgSvcLoad(); 489 case SVC_MSG_UNLOAD: return new HGCMMsgSvcUnload(); 490 case SVC_MSG_CONNECT: return new HGCMMsgSvcConnect(); 491 case SVC_MSG_DISCONNECT: return new HGCMMsgSvcDisconnect(); 492 case SVC_MSG_HOSTCALL: return new HGCMMsgHostCallSvc(); 493 case SVC_MSG_GUESTCALL: return new HGCMMsgCall(); 491 494 case SVC_MSG_LOADSTATE: 492 case SVC_MSG_SAVESTATE: return new HGCMMsgLoadSaveStateClient 493 case SVC_MSG_REGEXT: return new HGCMMsgSvcRegisterExtension 494 case SVC_MSG_UNREGEXT: return new HGCMMsgSvcUnregisterExtension 495 case SVC_MSG_SAVESTATE: return new HGCMMsgLoadSaveStateClient(); 496 case SVC_MSG_REGEXT: return new HGCMMsgSvcRegisterExtension(); 497 case SVC_MSG_UNREGEXT: return new HGCMMsgSvcUnregisterExtension(); 495 498 default: 496 499 AssertReleaseMsgFailed(("Msg id = %08X\n", u32MsgId)); … … 503 506 * The service thread. Loads the service library and calls the service entry points. 504 507 */ 505 DECLCALLBACK(void) hgcmServiceThread 508 DECLCALLBACK(void) hgcmServiceThread(HGCMTHREADHANDLE ThreadHandle, void *pvUser) 506 509 { 507 510 HGCMService *pSvc = (HGCMService *)pvUser; … … 513 516 { 514 517 HGCMMsgCore *pMsgCore; 515 int rc = hgcmMsgGet 518 int rc = hgcmMsgGet(ThreadHandle, &pMsgCore); 516 519 517 520 if (RT_FAILURE(rc)) 518 521 { 519 522 /* The error means some serious unrecoverable problem in the hgcmMsg/hgcmThread layer. */ 520 AssertMsgFailed 523 AssertMsgFailed(("%Rrc\n", rc)); 521 524 break; 522 525 } 523 526 524 527 /* Cache required information to avoid unnecessary pMsgCore access. */ 525 uint32_t u32MsgId = pMsgCore->MsgId 528 uint32_t u32MsgId = pMsgCore->MsgId(); 526 529 527 530 switch (u32MsgId) … … 534 537 LogFlowFunc(("SVC_MSG_HOSTFASTCALLASYNC u32Function = %d, pParm = %p\n", pMsg->u32Function, &pMsg->Param)); 535 538 536 rc = pSvc->m_fntable.pfnHostCall 539 rc = pSvc->m_fntable.pfnHostCall(pSvc->m_fntable.pvService, pMsg->u32Function, 1, &pMsg->Param); 537 540 } break; 538 541 #endif … … 540 543 { 541 544 LogFlowFunc(("SVC_MSG_LOAD\n")); 542 rc = pSvc->loadServiceDLL 545 rc = pSvc->loadServiceDLL(); 543 546 } break; 544 547 … … 548 551 if (pSvc->m_fntable.pfnUnload) 549 552 { 550 pSvc->m_fntable.pfnUnload 551 } 552 553 pSvc->unloadServiceDLL 553 pSvc->m_fntable.pfnUnload(pSvc->m_fntable.pvService); 554 } 555 556 pSvc->unloadServiceDLL(); 554 557 fQuit = true; 555 558 } break; … … 561 564 LogFlowFunc(("SVC_MSG_CONNECT u32ClientId = %d\n", pMsg->u32ClientId)); 562 565 563 HGCMClient *pClient = (HGCMClient *)hgcmObjReference 566 HGCMClient *pClient = (HGCMClient *)hgcmObjReference(pMsg->u32ClientId, HGCMOBJ_CLIENT); 564 567 565 568 if (pClient) 566 569 { 567 rc = pSvc->m_fntable.pfnConnect (pSvc->m_fntable.pvService, pMsg->u32ClientId, HGCM_CLIENT_DATA(pSvc, pClient)); 568 569 hgcmObjDereference (pClient); 570 rc = pSvc->m_fntable.pfnConnect(pSvc->m_fntable.pvService, pMsg->u32ClientId, 571 HGCM_CLIENT_DATA(pSvc, pClient)); 572 573 hgcmObjDereference(pClient); 570 574 } 571 575 else … … 581 585 LogFlowFunc(("SVC_MSG_DISCONNECT u32ClientId = %d\n", pMsg->u32ClientId)); 582 586 583 HGCMClient *pClient = (HGCMClient *)hgcmObjReference 587 HGCMClient *pClient = (HGCMClient *)hgcmObjReference(pMsg->u32ClientId, HGCMOBJ_CLIENT); 584 588 585 589 if (pClient) 586 590 { 587 rc = pSvc->m_fntable.pfnDisconnect (pSvc->m_fntable.pvService, pMsg->u32ClientId, HGCM_CLIENT_DATA(pSvc, pClient)); 588 589 hgcmObjDereference (pClient); 591 rc = pSvc->m_fntable.pfnDisconnect(pSvc->m_fntable.pvService, pMsg->u32ClientId, 592 HGCM_CLIENT_DATA(pSvc, pClient)); 593 594 hgcmObjDereference(pClient); 590 595 } 591 596 else … … 602 607 pMsg->u32ClientId, pMsg->u32Function, pMsg->cParms, pMsg->paParms)); 603 608 604 HGCMClient *pClient = (HGCMClient *)hgcmObjReference 609 HGCMClient *pClient = (HGCMClient *)hgcmObjReference(pMsg->u32ClientId, HGCMOBJ_CLIENT); 605 610 606 611 if (pClient) 607 612 { 608 pSvc->m_fntable.pfnCall (pSvc->m_fntable.pvService, (VBOXHGCMCALLHANDLE)pMsg, pMsg->u32ClientId, HGCM_CLIENT_DATA(pSvc, pClient), pMsg->u32Function, pMsg->cParms, pMsg->paParms); 609 610 hgcmObjDereference (pClient); 613 pSvc->m_fntable.pfnCall(pSvc->m_fntable.pvService, (VBOXHGCMCALLHANDLE)pMsg, pMsg->u32ClientId, 614 HGCM_CLIENT_DATA(pSvc, pClient), pMsg->u32Function, 615 pMsg->cParms, pMsg->paParms); 616 617 hgcmObjDereference(pClient); 611 618 } 612 619 else … … 620 627 HGCMMsgHostCallSvc *pMsg = (HGCMMsgHostCallSvc *)pMsgCore; 621 628 622 LogFlowFunc(("SVC_MSG_HOSTCALL u32Function = %d, cParms = %d, paParms = %p\n", pMsg->u32Function, pMsg->cParms, pMsg->paParms)); 623 624 rc = pSvc->m_fntable.pfnHostCall (pSvc->m_fntable.pvService, pMsg->u32Function, pMsg->cParms, pMsg->paParms); 629 LogFlowFunc(("SVC_MSG_HOSTCALL u32Function = %d, cParms = %d, paParms = %p\n", 630 pMsg->u32Function, pMsg->cParms, pMsg->paParms)); 631 632 rc = pSvc->m_fntable.pfnHostCall(pSvc->m_fntable.pvService, pMsg->u32Function, pMsg->cParms, pMsg->paParms); 625 633 } break; 626 634 … … 631 639 LogFlowFunc(("SVC_MSG_LOADSTATE\n")); 632 640 633 HGCMClient *pClient = (HGCMClient *)hgcmObjReference 641 HGCMClient *pClient = (HGCMClient *)hgcmObjReference(pMsg->u32ClientId, HGCMOBJ_CLIENT); 634 642 635 643 if (pClient) … … 637 645 if (pSvc->m_fntable.pfnLoadState) 638 646 { 639 rc = pSvc->m_fntable.pfnLoadState (pSvc->m_fntable.pvService, pMsg->u32ClientId, HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM); 647 rc = pSvc->m_fntable.pfnLoadState(pSvc->m_fntable.pvService, pMsg->u32ClientId, 648 HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM); 640 649 } 641 650 642 hgcmObjDereference 651 hgcmObjDereference(pClient); 643 652 } 644 653 else … … 654 663 LogFlowFunc(("SVC_MSG_SAVESTATE\n")); 655 664 656 HGCMClient *pClient = (HGCMClient *)hgcmObjReference 665 HGCMClient *pClient = (HGCMClient *)hgcmObjReference(pMsg->u32ClientId, HGCMOBJ_CLIENT); 657 666 658 667 rc = VINF_SUCCESS; … … 663 672 { 664 673 g_fSaveState = true; 665 rc = pSvc->m_fntable.pfnSaveState (pSvc->m_fntable.pvService, pMsg->u32ClientId, HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM); 674 rc = pSvc->m_fntable.pfnSaveState(pSvc->m_fntable.pvService, pMsg->u32ClientId, 675 HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM); 666 676 g_fSaveState = false; 667 677 } 668 678 669 hgcmObjDereference 679 hgcmObjDereference(pClient); 670 680 } 671 681 else … … 689 699 if (pSvc->m_fntable.pfnRegisterExtension) 690 700 { 691 rc = pSvc->m_fntable.pfnRegisterExtension (pSvc->m_fntable.pvService, pMsg->pfnExtension, pMsg->pvExtension); 701 rc = pSvc->m_fntable.pfnRegisterExtension(pSvc->m_fntable.pvService, pMsg->pfnExtension, 702 pMsg->pvExtension); 692 703 } 693 704 else … … 717 728 if (pSvc->m_fntable.pfnRegisterExtension) 718 729 { 719 rc = pSvc->m_fntable.pfnRegisterExtension 730 rc = pSvc->m_fntable.pfnRegisterExtension(pSvc->m_fntable.pvService, NULL, NULL); 720 731 } 721 732 else … … 745 756 } 746 757 747 /* static */ DECLCALLBACK(void) HGCMService::svcHlpCallComplete 758 /* static */ DECLCALLBACK(void) HGCMService::svcHlpCallComplete(VBOXHGCMCALLHANDLE callHandle, int32_t rc) 748 759 { 749 760 HGCMMsgCore *pMsgCore = (HGCMMsgCore *)callHandle; … … 755 766 * any other messages. 756 767 */ 757 hgcmMsgComplete 768 hgcmMsgComplete(pMsgCore, rc); 758 769 } 759 770 else 760 771 { 761 AssertFailed 772 AssertFailed(); 762 773 } 763 774 } 764 775 765 /* static */ DECLCALLBACK(void) HGCMService::svcHlpDisconnectClient 776 /* static */ DECLCALLBACK(void) HGCMService::svcHlpDisconnectClient(void *pvInstance, uint32_t u32ClientId) 766 777 { 767 778 HGCMService *pService = static_cast <HGCMService *> (pvInstance); … … 769 780 if (pService) 770 781 { 771 pService->DisconnectClient 782 pService->DisconnectClient(u32ClientId, true); 772 783 } 773 784 } 774 785 775 static DECLCALLBACK(void) hgcmMsgCompletionCallback 786 static DECLCALLBACK(void) hgcmMsgCompletionCallback(int32_t result, HGCMMsgCore *pMsgCore) 776 787 { 777 788 /* Call the VMMDev port interface to issue IRQ notification. */ … … 782 793 if (pMsgHdr->pHGCMPort && !g_fResetting) 783 794 { 784 pMsgHdr->pHGCMPort->pfnCompleted 795 pMsgHdr->pHGCMPort->pfnCompleted(pMsgHdr->pHGCMPort, g_fSaveState? VINF_HGCM_SAVE_STATE: result, pMsgHdr->pCmd); 785 796 } 786 797 } … … 790 801 */ 791 802 792 int HGCMService::instanceCreate 803 int HGCMService::instanceCreate(const char *pszServiceLibrary, const char *pszServiceName) 793 804 { 794 805 LogFlowFunc(("name %s, lib %s\n", pszServiceName, pszServiceLibrary)); … … 796 807 /* The maximum length of the thread name, allowed by the RT is 15. */ 797 808 char szThreadName[16]; 798 if (!strncmp 799 RTStrPrintf (szThreadName, sizeof(szThreadName), "Sh%s", pszServiceName + 10);800 else if (!strncmp 801 RTStrCopy (szThreadName, sizeof(szThreadName), pszServiceName + 4);809 if (!strncmp(pszServiceName, RT_STR_TUPLE("VBoxShared"))) 810 RTStrPrintf(szThreadName, sizeof(szThreadName), "Sh%s", pszServiceName + 10); 811 else if (!strncmp(pszServiceName, RT_STR_TUPLE("VBox"))) 812 RTStrCopy(szThreadName, sizeof(szThreadName), pszServiceName + 4); 802 813 else 803 RTStrCopy (szThreadName, sizeof(szThreadName), pszServiceName);804 805 int rc = hgcmThreadCreate 814 RTStrCopy(szThreadName, sizeof(szThreadName), pszServiceName); 815 816 int rc = hgcmThreadCreate(&m_thread, szThreadName, hgcmServiceThread, this); 806 817 807 818 if (RT_SUCCESS(rc)) 808 819 { 809 m_pszSvcName = RTStrDup 810 m_pszSvcLibrary = RTStrDup 820 m_pszSvcName = RTStrDup(pszServiceName); 821 m_pszSvcLibrary = RTStrDup(pszServiceLibrary); 811 822 812 823 if (!m_pszSvcName || !m_pszSvcLibrary) 813 824 { 814 RTStrFree 825 RTStrFree(m_pszSvcLibrary); 815 826 m_pszSvcLibrary = NULL; 816 827 817 RTStrFree 828 RTStrFree(m_pszSvcName); 818 829 m_pszSvcName = NULL; 819 830 … … 829 840 /* Execute the load request on the service thread. */ 830 841 HGCMMSGHANDLE hMsg; 831 rc = hgcmMsgAlloc 842 rc = hgcmMsgAlloc(m_thread, &hMsg, SVC_MSG_LOAD, hgcmMessageAllocSvc); 832 843 833 844 if (RT_SUCCESS(rc)) 834 845 { 835 rc = hgcmMsgSend 846 rc = hgcmMsgSend(hMsg); 836 847 } 837 848 } … … 840 851 if (RT_FAILURE(rc)) 841 852 { 842 instanceDestroy 853 instanceDestroy(); 843 854 } 844 855 … … 847 858 } 848 859 849 void HGCMService::instanceDestroy 860 void HGCMService::instanceDestroy(void) 850 861 { 851 862 LogFlowFunc(("%s\n", m_pszSvcName)); 852 863 853 864 HGCMMSGHANDLE hMsg; 854 int rc = hgcmMsgAlloc 865 int rc = hgcmMsgAlloc(m_thread, &hMsg, SVC_MSG_UNLOAD, hgcmMessageAllocSvc); 855 866 856 867 if (RT_SUCCESS(rc)) 857 868 { 858 rc = hgcmMsgSend 869 rc = hgcmMsgSend(hMsg); 859 870 860 871 if (RT_SUCCESS(rc)) 861 872 { 862 hgcmThreadWait 863 } 864 } 865 866 RTStrFree 873 hgcmThreadWait(m_thread); 874 } 875 } 876 877 RTStrFree(m_pszSvcLibrary); 867 878 m_pszSvcLibrary = NULL; 868 879 869 RTStrFree 880 RTStrFree(m_pszSvcName); 870 881 m_pszSvcName = NULL; 871 882 } … … 876 887 877 888 HGCMMSGHANDLE hMsg; 878 int rc = hgcmMsgAlloc 889 int rc = hgcmMsgAlloc(m_thread, &hMsg, SVC_MSG_SAVESTATE, hgcmMessageAllocSvc); 879 890 880 891 if (RT_SUCCESS(rc)) 881 892 { 882 HGCMMsgLoadSaveStateClient *pMsg = (HGCMMsgLoadSaveStateClient *)hgcmObjReference 893 HGCMMsgLoadSaveStateClient *pMsg = (HGCMMsgLoadSaveStateClient *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 883 894 AssertRelease(pMsg); 884 895 … … 886 897 pMsg->pSSM = pSSM; 887 898 888 hgcmObjDereference 889 890 rc = hgcmMsgSend 899 hgcmObjDereference(pMsg); 900 901 rc = hgcmMsgSend(hMsg); 891 902 } 892 903 … … 895 906 } 896 907 897 int HGCMService::loadClientState 908 int HGCMService::loadClientState(uint32_t u32ClientId, PSSMHANDLE pSSM) 898 909 { 899 910 LogFlowFunc(("%s\n", m_pszSvcName)); 900 911 901 912 HGCMMSGHANDLE hMsg; 902 int rc = hgcmMsgAlloc 913 int rc = hgcmMsgAlloc(m_thread, &hMsg, SVC_MSG_LOADSTATE, hgcmMessageAllocSvc); 903 914 904 915 if (RT_SUCCESS(rc)) 905 916 { 906 HGCMMsgLoadSaveStateClient *pMsg = (HGCMMsgLoadSaveStateClient *)hgcmObjReference 917 HGCMMsgLoadSaveStateClient *pMsg = (HGCMMsgLoadSaveStateClient *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 907 918 908 919 AssertRelease(pMsg); … … 911 922 pMsg->pSSM = pSSM; 912 923 913 hgcmObjDereference 914 915 rc = hgcmMsgSend 924 hgcmObjDereference(pMsg); 925 926 rc = hgcmMsgSend(hMsg); 916 927 } 917 928 … … 928 939 * @thread main HGCM 929 940 */ 930 /* static */ int HGCMService::LoadService 941 /* static */ int HGCMService::LoadService(const char *pszServiceLibrary, const char *pszServiceName) 931 942 { 932 943 LogFlowFunc(("lib %s, name = %s\n", pszServiceLibrary, pszServiceName)); … … 935 946 936 947 HGCMService *pSvc; 937 int rc = HGCMService::ResolveService 948 int rc = HGCMService::ResolveService(&pSvc, pszServiceName); 938 949 939 950 if (RT_SUCCESS(rc)) 940 951 { 941 952 /* The service is already loaded. */ 942 pSvc->ReleaseService 953 pSvc->ReleaseService(); 943 954 rc = VERR_HGCM_SERVICE_EXISTS; 944 955 } … … 946 957 { 947 958 /* Create the new service. */ 948 pSvc = new HGCMService 959 pSvc = new HGCMService(); 949 960 950 961 if (!pSvc) … … 955 966 { 956 967 /* Load the library and call the initialization entry point. */ 957 rc = pSvc->instanceCreate 968 rc = pSvc->instanceCreate(pszServiceLibrary, pszServiceName); 958 969 959 970 if (RT_SUCCESS(rc)) … … 977 988 978 989 /* Reference the service (for first time) until it is unloaded on HGCM termination. */ 979 AssertRelease 980 pSvc->ReferenceService 990 AssertRelease(pSvc->m_u32RefCnt == 0); 991 pSvc->ReferenceService(); 981 992 982 993 LogFlowFunc(("service %p\n", pSvc)); … … 993 1004 * @thread main HGCM 994 1005 */ 995 void HGCMService::UnloadService 1006 void HGCMService::UnloadService(void) 996 1007 { 997 1008 LogFlowFunc(("name = %s\n", m_pszSvcName)); … … 1020 1031 /* The service must be unloaded only if all clients were disconnected. */ 1021 1032 LogFlowFunc(("m_u32RefCnt = %d\n", m_u32RefCnt)); 1022 AssertRelease 1033 AssertRelease(m_u32RefCnt == 1); 1023 1034 1024 1035 /* Now the service can be released. */ 1025 ReleaseService 1036 ReleaseService(); 1026 1037 } 1027 1038 … … 1030 1041 * @thread main HGCM 1031 1042 */ 1032 /* static */ void HGCMService::UnloadAll 1043 /* static */ void HGCMService::UnloadAll(void) 1033 1044 { 1034 1045 while (sm_pSvcListHead) 1035 1046 { 1036 sm_pSvcListHead->UnloadService 1047 sm_pSvcListHead->UnloadService(); 1037 1048 } 1038 1049 } … … 1047 1058 * @thread main HGCM 1048 1059 */ 1049 /* static */ int HGCMService::ResolveService 1060 /* static */ int HGCMService::ResolveService(HGCMService **ppSvc, const char *pszServiceName) 1050 1061 { 1051 1062 LogFlowFunc(("ppSvc = %p name = %s\n", … … 1061 1072 while (pSvc) 1062 1073 { 1063 if (strcmp 1074 if (strcmp(pSvc->m_pszSvcName, pszServiceName) == 0) 1064 1075 { 1065 1076 break; … … 1077 1088 } 1078 1089 1079 pSvc->ReferenceService 1090 pSvc->ReferenceService(); 1080 1091 1081 1092 *ppSvc = pSvc; … … 1088 1099 * @thread main HGCM 1089 1100 */ 1090 void HGCMService::ReferenceService 1091 { 1092 ASMAtomicIncU32 1101 void HGCMService::ReferenceService(void) 1102 { 1103 ASMAtomicIncU32(&m_u32RefCnt); 1093 1104 LogFlowFunc(("[%s] m_u32RefCnt = %d\n", m_pszSvcName, m_u32RefCnt)); 1094 1105 } … … 1098 1109 * @thread main HGCM 1099 1110 */ 1100 void HGCMService::ReleaseService 1111 void HGCMService::ReleaseService(void) 1101 1112 { 1102 1113 LogFlowFunc(("m_u32RefCnt = %d\n", m_u32RefCnt)); 1103 uint32_t u32RefCnt = ASMAtomicDecU32 1114 uint32_t u32RefCnt = ASMAtomicDecU32(&m_u32RefCnt); 1104 1115 AssertRelease(u32RefCnt != ~0U); 1105 1116 … … 1108 1119 if (u32RefCnt == 0) 1109 1120 { 1110 instanceDestroy 1121 instanceDestroy(); 1111 1122 delete this; 1112 1123 } … … 1118 1129 * @thread main HGCM 1119 1130 */ 1120 /* static */ void HGCMService::Reset 1131 /* static */ void HGCMService::Reset(void) 1121 1132 { 1122 1133 g_fResetting = true; … … 1129 1140 { 1130 1141 LogFlowFunc(("handle %d\n", pSvc->m_paClientIds[0])); 1131 pSvc->DisconnectClient 1142 pSvc->DisconnectClient(pSvc->m_paClientIds[0], false); 1132 1143 } 1133 1144 … … 1137 1148 while (pSvc->m_cHandleAcquires) 1138 1149 { 1139 pSvc->HandleReleased 1140 pSvc->ReleaseService 1150 pSvc->HandleReleased(); 1151 pSvc->ReleaseService(); 1141 1152 } 1142 1153 pSvc = pNextSvc; … … 1155 1166 * @thread main HGCM 1156 1167 */ 1157 /* static */ int HGCMService::SaveState 1168 /* static */ int HGCMService::SaveState(PSSMHANDLE pSSM) 1158 1169 { 1159 1170 /* Save the current handle count and restore afterwards to avoid client id conflicts. */ … … 1203 1214 1204 1215 /* Call the service, so the operation is executed by the service thread. */ 1205 rc = pSvc->saveClientState 1216 rc = pSvc->saveClientState(u32ClientId, pSSM); 1206 1217 AssertRCReturn(rc, rc); 1207 1218 } … … 1219 1230 * @thread main HGCM 1220 1231 */ 1221 /* static */ int HGCMService::LoadState 1232 /* static */ int HGCMService::LoadState(PSSMHANDLE pSSM) 1222 1233 { 1223 1234 /* Restore handle count to avoid client id conflicts. */ … … 1244 1255 AssertReturn(u32 <= VBOX_HGCM_SVC_NAME_MAX_BYTES, VERR_SSM_UNEXPECTED_DATA); 1245 1256 1246 char *pszServiceName = (char *)alloca 1257 char *pszServiceName = (char *)alloca(u32); 1247 1258 1248 1259 /* Get the service name. */ … … 1254 1265 /* Resolve the service instance. */ 1255 1266 HGCMService *pSvc; 1256 rc = ResolveService 1267 rc = ResolveService(&pSvc, pszServiceName); 1257 1268 AssertLogRelMsgReturn(pSvc, ("rc=%Rrc, %s\n", rc, pszServiceName), VERR_SSM_UNEXPECTED_DATA); 1258 1269 … … 1262 1273 if (RT_FAILURE(rc)) 1263 1274 { 1264 pSvc->ReleaseService 1275 pSvc->ReleaseService(); 1265 1276 AssertFailed(); 1266 1277 return rc; … … 1274 1285 if (RT_FAILURE(rc)) 1275 1286 { 1276 pSvc->ReleaseService 1287 pSvc->ReleaseService(); 1277 1288 AssertFailed(); 1278 1289 return rc; … … 1280 1291 1281 1292 /* Connect the client. */ 1282 rc = pSvc->CreateAndConnectClient 1293 rc = pSvc->CreateAndConnectClient(NULL, u32ClientId); 1283 1294 if (RT_FAILURE(rc)) 1284 1295 { 1285 pSvc->ReleaseService 1296 pSvc->ReleaseService(); 1286 1297 AssertLogRelMsgFailed(("rc=%Rrc %s\n", rc, pszServiceName)); 1287 1298 return rc; … … 1289 1300 1290 1301 /* Call the service, so the operation is executed by the service thread. */ 1291 rc = pSvc->loadClientState 1302 rc = pSvc->loadClientState(u32ClientId, pSSM); 1292 1303 if (RT_FAILURE(rc)) 1293 1304 { 1294 pSvc->ReleaseService 1305 pSvc->ReleaseService(); 1295 1306 AssertLogRelMsgFailed(("rc=%Rrc %s\n", rc, pszServiceName)); 1296 1307 return rc; … … 1298 1309 } 1299 1310 1300 pSvc->ReleaseService 1311 pSvc->ReleaseService(); 1301 1312 } 1302 1313 … … 1311 1322 * @return VBox rc. 1312 1323 */ 1313 int HGCMService::CreateAndConnectClient 1324 int HGCMService::CreateAndConnectClient(uint32_t *pu32ClientIdOut, uint32_t u32ClientIdIn) 1314 1325 { 1315 1326 LogFlowFunc(("pu32ClientIdOut = %p, u32ClientIdIn = %d\n", pu32ClientIdOut, u32ClientIdIn)); 1316 1327 1317 1328 /* Allocate a client information structure. */ 1318 HGCMClient *pClient = new HGCMClient 1329 HGCMClient *pClient = new HGCMClient(); 1319 1330 1320 1331 if (!pClient) … … 1328 1339 if (pu32ClientIdOut != NULL) 1329 1340 { 1330 handle = hgcmObjGenerateHandle 1341 handle = hgcmObjGenerateHandle(pClient); 1331 1342 } 1332 1343 else 1333 1344 { 1334 handle = hgcmObjAssignHandle 1345 handle = hgcmObjAssignHandle(pClient, u32ClientIdIn); 1335 1346 } 1336 1347 … … 1340 1351 1341 1352 /* Initialize the HGCM part of the client. */ 1342 int rc = pClient->Init 1353 int rc = pClient->Init(this); 1343 1354 1344 1355 if (RT_SUCCESS(rc)) … … 1347 1358 HGCMMSGHANDLE hMsg; 1348 1359 1349 rc = hgcmMsgAlloc 1360 rc = hgcmMsgAlloc(m_thread, &hMsg, SVC_MSG_CONNECT, hgcmMessageAllocSvc); 1350 1361 1351 1362 if (RT_SUCCESS(rc)) 1352 1363 { 1353 HGCMMsgSvcConnect *pMsg = (HGCMMsgSvcConnect *)hgcmObjReference 1364 HGCMMsgSvcConnect *pMsg = (HGCMMsgSvcConnect *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 1354 1365 AssertRelease(pMsg); 1355 1366 1356 1367 pMsg->u32ClientId = handle; 1357 1368 1358 hgcmObjDereference 1359 1360 rc = hgcmMsgSend 1369 hgcmObjDereference(pMsg); 1370 1371 rc = hgcmMsgSend(hMsg); 1361 1372 1362 1373 if (RT_SUCCESS(rc)) … … 1365 1376 if (m_cClients == m_cClientsAllocated) 1366 1377 { 1367 m_paClientIds = (uint32_t *)RTMemRealloc (m_paClientIds, (m_cClientsAllocated + 64) * sizeof (m_paClientIds[0])); 1378 m_paClientIds = (uint32_t *)RTMemRealloc(m_paClientIds, (m_cClientsAllocated + 64) * 1379 sizeof(m_paClientIds[0])); 1368 1380 Assert(m_paClientIds); 1369 1381 m_cClientsAllocated += 64; … … 1378 1390 if (RT_FAILURE(rc)) 1379 1391 { 1380 hgcmObjDeleteHandle 1392 hgcmObjDeleteHandle(handle); 1381 1393 } 1382 1394 else … … 1387 1399 } 1388 1400 1389 ReferenceService 1401 ReferenceService(); 1390 1402 } 1391 1403 … … 1399 1411 * @return VBox rc. 1400 1412 */ 1401 int HGCMService::DisconnectClient 1413 int HGCMService::DisconnectClient(uint32_t u32ClientId, bool fFromService) 1402 1414 { 1403 1415 int rc = VINF_SUCCESS; … … 1410 1422 HGCMMSGHANDLE hMsg; 1411 1423 1412 rc = hgcmMsgAlloc 1424 rc = hgcmMsgAlloc(m_thread, &hMsg, SVC_MSG_DISCONNECT, hgcmMessageAllocSvc); 1413 1425 1414 1426 if (RT_SUCCESS(rc)) 1415 1427 { 1416 HGCMMsgSvcDisconnect *pMsg = (HGCMMsgSvcDisconnect *)hgcmObjReference 1428 HGCMMsgSvcDisconnect *pMsg = (HGCMMsgSvcDisconnect *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 1417 1429 AssertRelease(pMsg); 1418 1430 1419 1431 pMsg->u32ClientId = u32ClientId; 1420 1432 1421 hgcmObjDereference 1422 1423 rc = hgcmMsgSend 1433 hgcmObjDereference(pMsg); 1434 1435 rc = hgcmMsgSend(hMsg); 1424 1436 } 1425 1437 else … … 1441 1453 if (m_cClients > i) 1442 1454 { 1443 memmove (&m_paClientIds[i], &m_paClientIds[i + 1], sizeof 1455 memmove (&m_paClientIds[i], &m_paClientIds[i + 1], sizeof(m_paClientIds[0]) * (m_cClients - i)); 1444 1456 } 1445 1457 1446 1458 /* Delete the client handle. */ 1447 hgcmObjDeleteHandle 1459 hgcmObjDeleteHandle(u32ClientId); 1448 1460 1449 1461 /* The service must be released. */ 1450 ReleaseService 1462 ReleaseService(); 1451 1463 1452 1464 break; … … 1458 1470 } 1459 1471 1460 int HGCMService::RegisterExtension 1461 1462 1472 int HGCMService::RegisterExtension(HGCMSVCEXTHANDLE handle, 1473 PFNHGCMSVCEXT pfnExtension, 1474 void *pvExtension) 1463 1475 { 1464 1476 LogFlowFunc(("%s\n", handle->pszServiceName)); … … 1466 1478 /* Forward the message to the service thread. */ 1467 1479 HGCMMSGHANDLE hMsg = 0; 1468 int rc = hgcmMsgAlloc 1480 int rc = hgcmMsgAlloc(m_thread, &hMsg, SVC_MSG_REGEXT, hgcmMessageAllocSvc); 1469 1481 1470 1482 if (RT_SUCCESS(rc)) 1471 1483 { 1472 HGCMMsgSvcRegisterExtension *pMsg = (HGCMMsgSvcRegisterExtension *)hgcmObjReference 1484 HGCMMsgSvcRegisterExtension *pMsg = (HGCMMsgSvcRegisterExtension *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 1473 1485 AssertRelease(pMsg); 1474 1486 … … 1477 1489 pMsg->pvExtension = pvExtension; 1478 1490 1479 hgcmObjDereference 1480 1481 rc = hgcmMsgSend 1491 hgcmObjDereference(pMsg); 1492 1493 rc = hgcmMsgSend(hMsg); 1482 1494 } 1483 1495 … … 1486 1498 } 1487 1499 1488 void HGCMService::UnregisterExtension 1500 void HGCMService::UnregisterExtension(HGCMSVCEXTHANDLE handle) 1489 1501 { 1490 1502 /* Forward the message to the service thread. */ 1491 1503 HGCMMSGHANDLE hMsg = 0; 1492 int rc = hgcmMsgAlloc 1504 int rc = hgcmMsgAlloc(m_thread, &hMsg, SVC_MSG_UNREGEXT, hgcmMessageAllocSvc); 1493 1505 1494 1506 if (RT_SUCCESS(rc)) 1495 1507 { 1496 HGCMMsgSvcUnregisterExtension *pMsg = (HGCMMsgSvcUnregisterExtension *)hgcmObjReference 1508 HGCMMsgSvcUnregisterExtension *pMsg = (HGCMMsgSvcUnregisterExtension *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 1497 1509 AssertRelease(pMsg); 1498 1510 1499 1511 pMsg->handle = handle; 1500 1512 1501 hgcmObjDereference 1502 1503 rc = hgcmMsgSend 1513 hgcmObjDereference(pMsg); 1514 1515 rc = hgcmMsgSend(hMsg); 1504 1516 } 1505 1517 … … 1517 1529 * @return VBox rc. 1518 1530 */ 1519 int HGCMService::GuestCall (PPDMIHGCMPORT pHGCMPort, PVBOXHGCMCMD pCmd, uint32_t u32ClientId, uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[]) 1531 int HGCMService::GuestCall(PPDMIHGCMPORT pHGCMPort, PVBOXHGCMCMD pCmd, uint32_t u32ClientId, uint32_t u32Function, 1532 uint32_t cParms, VBOXHGCMSVCPARM paParms[]) 1520 1533 { 1521 1534 HGCMMSGHANDLE hMsg = 0; … … 1523 1536 LogFlow(("MAIN::HGCMService::Call\n")); 1524 1537 1525 int rc = hgcmMsgAlloc 1538 int rc = hgcmMsgAlloc(m_thread, &hMsg, SVC_MSG_GUESTCALL, hgcmMessageAllocSvc); 1526 1539 1527 1540 if (RT_SUCCESS(rc)) 1528 1541 { 1529 HGCMMsgCall *pMsg = (HGCMMsgCall *)hgcmObjReference 1542 HGCMMsgCall *pMsg = (HGCMMsgCall *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 1530 1543 1531 1544 AssertRelease(pMsg); … … 1539 1552 pMsg->paParms = paParms; 1540 1553 1541 hgcmObjDereference 1542 1543 rc = hgcmMsgPost 1554 hgcmObjDereference(pMsg); 1555 1556 rc = hgcmMsgPost(hMsg, hgcmMsgCompletionCallback); 1544 1557 } 1545 1558 else … … 1559 1572 * @return VBox rc. 1560 1573 */ 1561 int HGCMService::HostCall 1574 int HGCMService::HostCall(uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM *paParms) 1562 1575 { 1563 1576 LogFlowFunc(("%s u32Function = %d, cParms = %d, paParms = %p\n", … … 1565 1578 1566 1579 HGCMMSGHANDLE hMsg = 0; 1567 int rc = hgcmMsgAlloc 1580 int rc = hgcmMsgAlloc(m_thread, &hMsg, SVC_MSG_HOSTCALL, hgcmMessageAllocSvc); 1568 1581 1569 1582 if (RT_SUCCESS(rc)) 1570 1583 { 1571 HGCMMsgHostCallSvc *pMsg = (HGCMMsgHostCallSvc *)hgcmObjReference 1584 HGCMMsgHostCallSvc *pMsg = (HGCMMsgHostCallSvc *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 1572 1585 AssertRelease(pMsg); 1573 1586 … … 1576 1589 pMsg->paParms = paParms; 1577 1590 1578 hgcmObjDereference 1579 1580 rc = hgcmMsgSend 1591 hgcmObjDereference(pMsg); 1592 1593 rc = hgcmMsgSend(hMsg); 1581 1594 } 1582 1595 … … 1586 1599 1587 1600 #ifdef VBOX_WITH_CRHGSMI 1588 static DECLCALLBACK(void) hgcmMsgFastCallCompletionCallback 1601 static DECLCALLBACK(void) hgcmMsgFastCallCompletionCallback(int32_t result, HGCMMsgCore *pMsgCore) 1589 1602 { 1590 1603 /* Call the VMMDev port interface to issue IRQ notification. */ … … 1594 1607 if (pMsg->pfnCompletion) 1595 1608 { 1596 pMsg->pfnCompletion 1609 pMsg->pfnCompletion(result, pMsg->u32Function, &pMsg->Param, pMsg->pvCompletion); 1597 1610 } 1598 1611 } … … 1615 1628 } 1616 1629 1617 int HGCMService::HostFastCallAsync (uint32_t u32Function, VBOXHGCMSVCPARM *pParm, PHGCMHOSTFASTCALLCB pfnCompletion, void *pvCompletion) 1630 int HGCMService::HostFastCallAsync(uint32_t u32Function, VBOXHGCMSVCPARM *pParm, PHGCMHOSTFASTCALLCB pfnCompletion, 1631 void *pvCompletion) 1618 1632 { 1619 1633 LogFlowFunc(("%s u32Function = %d, pParm = %p\n", … … 1621 1635 1622 1636 HGCMMSGHANDLE hMsg = 0; 1623 int rc = hgcmMsgAlloc 1637 int rc = hgcmMsgAlloc(m_thread, &hMsg, SVC_MSG_HOSTFASTCALLASYNC, hgcmMessageAllocSvc); 1624 1638 1625 1639 if (RT_SUCCESS(rc)) 1626 1640 { 1627 HGCMMsgHostFastCallAsyncSvc *pMsg = (HGCMMsgHostFastCallAsyncSvc *)hgcmObjReference 1641 HGCMMsgHostFastCallAsyncSvc *pMsg = (HGCMMsgHostFastCallAsyncSvc *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 1628 1642 AssertRelease(pMsg); 1629 1643 … … 1633 1647 pMsg->pvCompletion = pvCompletion; 1634 1648 1635 hgcmObjDereference 1649 hgcmObjDereference(pMsg); 1636 1650 1637 1651 rc = hgcmMsgPost(hMsg, hgcmMsgFastCallCompletionCallback); … … 1759 1773 switch (u32MsgId) 1760 1774 { 1761 case HGCM_MSG_CONNECT: return new HGCMMsgMainConnect 1762 case HGCM_MSG_DISCONNECT: return new HGCMMsgMainDisconnect 1763 case HGCM_MSG_LOAD: return new HGCMMsgMainLoad 1764 case HGCM_MSG_HOSTCALL: return new HGCMMsgMainHostCall 1775 case HGCM_MSG_CONNECT: return new HGCMMsgMainConnect(); 1776 case HGCM_MSG_DISCONNECT: return new HGCMMsgMainDisconnect(); 1777 case HGCM_MSG_LOAD: return new HGCMMsgMainLoad(); 1778 case HGCM_MSG_HOSTCALL: return new HGCMMsgMainHostCall(); 1765 1779 case HGCM_MSG_LOADSTATE: 1766 case HGCM_MSG_SAVESTATE: return new HGCMMsgMainLoadSaveState 1767 case HGCM_MSG_RESET: return new HGCMMsgMainReset 1768 case HGCM_MSG_QUIT: return new HGCMMsgMainQuit 1769 case HGCM_MSG_REGEXT: return new HGCMMsgMainRegisterExtension 1770 case HGCM_MSG_UNREGEXT: return new HGCMMsgMainUnregisterExtension 1780 case HGCM_MSG_SAVESTATE: return new HGCMMsgMainLoadSaveState(); 1781 case HGCM_MSG_RESET: return new HGCMMsgMainReset(); 1782 case HGCM_MSG_QUIT: return new HGCMMsgMainQuit(); 1783 case HGCM_MSG_REGEXT: return new HGCMMsgMainRegisterExtension(); 1784 case HGCM_MSG_UNREGEXT: return new HGCMMsgMainUnregisterExtension(); 1771 1785 #ifdef VBOX_WITH_CRHGSMI 1772 1786 case HGCM_MSG_SVCAQUIRE: return new HGCMMsgMainSvcAcquire(); … … 1783 1797 1784 1798 /* The main HGCM thread handler. */ 1785 static DECLCALLBACK(void) hgcmThread 1799 static DECLCALLBACK(void) hgcmThread(HGCMTHREADHANDLE ThreadHandle, void *pvUser) 1786 1800 { 1787 1801 LogFlowFunc(("ThreadHandle = %p, pvUser = %p\n", … … 1795 1809 { 1796 1810 HGCMMsgCore *pMsgCore; 1797 int rc = hgcmMsgGet 1811 int rc = hgcmMsgGet(ThreadHandle, &pMsgCore); 1798 1812 1799 1813 if (RT_FAILURE(rc)) 1800 1814 { 1801 1815 /* The error means some serious unrecoverable problem in the hgcmMsg/hgcmThread layer. */ 1802 AssertMsgFailed 1816 AssertMsgFailed(("%Rrc\n", rc)); 1803 1817 break; 1804 1818 } 1805 1819 1806 uint32_t u32MsgId = pMsgCore->MsgId 1820 uint32_t u32MsgId = pMsgCore->MsgId(); 1807 1821 1808 1822 switch (u32MsgId) … … 1818 1832 */ 1819 1833 HGCMService *pService; 1820 rc = HGCMService::ResolveService 1834 rc = HGCMService::ResolveService(&pService, pMsg->pszServiceName); 1821 1835 1822 1836 if (RT_SUCCESS(rc)) 1823 1837 { 1824 1838 /* Call the service instance method. */ 1825 rc = pService->CreateAndConnectClient 1839 rc = pService->CreateAndConnectClient(pMsg->pu32ClientId, 0); 1826 1840 1827 1841 /* Release the service after resolve. */ 1828 pService->ReleaseService 1842 pService->ReleaseService(); 1829 1843 } 1830 1844 } break; … … 1837 1851 pMsg->u32ClientId)); 1838 1852 1839 HGCMClient *pClient = (HGCMClient *)hgcmObjReference 1853 HGCMClient *pClient = (HGCMClient *)hgcmObjReference(pMsg->u32ClientId, HGCMOBJ_CLIENT); 1840 1854 1841 1855 if (!pClient) … … 1849 1863 1850 1864 /* Call the service instance to disconnect the client. */ 1851 rc = pService->DisconnectClient 1852 1853 hgcmObjDereference 1865 rc = pService->DisconnectClient(pMsg->u32ClientId, false); 1866 1867 hgcmObjDereference(pClient); 1854 1868 } break; 1855 1869 … … 1861 1875 pMsg->pszServiceName, pMsg->pszServiceLibrary)); 1862 1876 1863 rc = HGCMService::LoadService 1877 rc = HGCMService::LoadService(pMsg->pszServiceLibrary, pMsg->pszServiceName); 1864 1878 } break; 1865 1879 … … 1873 1887 /* Resolve the service name to the pointer to service instance. */ 1874 1888 HGCMService *pService; 1875 rc = HGCMService::ResolveService 1889 rc = HGCMService::ResolveService(&pService, pMsg->pszServiceName); 1876 1890 1877 1891 if (RT_SUCCESS(rc)) 1878 1892 { 1879 rc = pService->HostCall 1880 1881 pService->ReleaseService 1893 rc = pService->HostCall(pMsg->u32Function, pMsg->cParms, pMsg->paParms); 1894 1895 pService->ReleaseService(); 1882 1896 } 1883 1897 } break; … … 1892 1906 /* Resolve the service name to the pointer to service instance. */ 1893 1907 HGCMService *pService; 1894 rc = HGCMService::ResolveService 1908 rc = HGCMService::ResolveService(&pService, pMsg->pszServiceName); 1895 1909 if (RT_SUCCESS(rc)) 1896 1910 { 1897 rc = pService->HandleAcquired 1911 rc = pService->HandleAcquired(); 1898 1912 if (RT_SUCCESS(rc)) 1899 1913 { … … 1902 1916 else 1903 1917 { 1904 pService->ReleaseService 1918 pService->ReleaseService(); 1905 1919 } 1906 1920 } … … 1915 1929 /* Resolve the service name to the pointer to service instance. */ 1916 1930 1917 rc = pMsg->pService->HandleReleased 1931 rc = pMsg->pService->HandleReleased(); 1918 1932 if (RT_SUCCESS(rc)) 1919 1933 { 1920 pMsg->pService->ReleaseService 1934 pMsg->pService->ReleaseService(); 1921 1935 } 1922 1936 } break; … … 1927 1941 LogFlowFunc(("HGCM_MSG_RESET\n")); 1928 1942 1929 HGCMService::Reset 1943 HGCMService::Reset(); 1930 1944 } break; 1931 1945 … … 1936 1950 LogFlowFunc(("HGCM_MSG_LOADSTATE\n")); 1937 1951 1938 rc = HGCMService::LoadState 1952 rc = HGCMService::LoadState(pMsg->pSSM); 1939 1953 } break; 1940 1954 … … 1945 1959 LogFlowFunc(("HGCM_MSG_SAVESTATE\n")); 1946 1960 1947 rc = HGCMService::SaveState 1961 rc = HGCMService::SaveState(pMsg->pSSM); 1948 1962 } break; 1949 1963 … … 1952 1966 LogFlowFunc(("HGCM_MSG_QUIT\n")); 1953 1967 1954 HGCMService::UnloadAll 1968 HGCMService::UnloadAll(); 1955 1969 1956 1970 fQuit = true; … … 1964 1978 1965 1979 /* Allocate the handle data. */ 1966 HGCMSVCEXTHANDLE handle = (HGCMSVCEXTHANDLE)RTMemAllocZ (sizeof(struct _HGCMSVCEXTHANDLEDATA)1967 + strlen(pMsg->pszServiceName)1968 + sizeof(char));1980 HGCMSVCEXTHANDLE handle = (HGCMSVCEXTHANDLE)RTMemAllocZ(sizeof(struct _HGCMSVCEXTHANDLEDATA) 1981 + strlen(pMsg->pszServiceName) 1982 + sizeof(char)); 1969 1983 1970 1984 if (handle == NULL) … … 1974 1988 else 1975 1989 { 1976 handle->pszServiceName = (char *)((uint8_t *)handle + sizeof 1977 strcpy 1990 handle->pszServiceName = (char *)((uint8_t *)handle + sizeof(struct _HGCMSVCEXTHANDLEDATA)); 1991 strcpy(handle->pszServiceName, pMsg->pszServiceName); 1978 1992 1979 1993 HGCMService *pService; 1980 rc = HGCMService::ResolveService 1994 rc = HGCMService::ResolveService(&pService, handle->pszServiceName); 1981 1995 1982 1996 if (RT_SUCCESS(rc)) 1983 1997 { 1984 pService->RegisterExtension 1985 1986 pService->ReleaseService 1998 pService->RegisterExtension(handle, pMsg->pfnExtension, pMsg->pvExtension); 1999 2000 pService->ReleaseService(); 1987 2001 } 1988 2002 1989 2003 if (RT_FAILURE(rc)) 1990 2004 { 1991 RTMemFree 2005 RTMemFree(handle); 1992 2006 } 1993 2007 else … … 2005 2019 2006 2020 HGCMService *pService; 2007 rc = HGCMService::ResolveService 2021 rc = HGCMService::ResolveService(&pService, pMsg->handle->pszServiceName); 2008 2022 2009 2023 if (RT_SUCCESS(rc)) 2010 2024 { 2011 pService->UnregisterExtension 2012 2013 pService->ReleaseService 2014 } 2015 2016 RTMemFree 2025 pService->UnregisterExtension(pMsg->handle); 2026 2027 pService->ReleaseService(); 2028 } 2029 2030 RTMemFree(pMsg->handle); 2017 2031 } break; 2018 2032 … … 2025 2039 2026 2040 /* Complete the message processing. */ 2027 hgcmMsgComplete 2041 hgcmMsgComplete(pMsgCore, rc); 2028 2042 2029 2043 LogFlowFunc(("message processed %Rrc\n", rc)); … … 2053 2067 * @return VBox rc. 2054 2068 */ 2055 int HGCMHostLoad 2056 2069 int HGCMHostLoad(const char *pszServiceLibrary, 2070 const char *pszServiceName) 2057 2071 { 2058 2072 LogFlowFunc(("lib = %s, name = %s\n", pszServiceLibrary, pszServiceName)); … … 2066 2080 HGCMMSGHANDLE hMsg = 0; 2067 2081 2068 int rc = hgcmMsgAlloc 2082 int rc = hgcmMsgAlloc(g_hgcmThread, &hMsg, HGCM_MSG_LOAD, hgcmMainMessageAlloc); 2069 2083 2070 2084 if (RT_SUCCESS(rc)) 2071 2085 { 2072 2086 /* Initialize the message. Since the message is synchronous, use the supplied pointers. */ 2073 HGCMMsgMainLoad *pMsg = (HGCMMsgMainLoad *)hgcmObjReference 2087 HGCMMsgMainLoad *pMsg = (HGCMMsgMainLoad *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 2074 2088 AssertRelease(pMsg); 2075 2089 … … 2077 2091 pMsg->pszServiceName = pszServiceName; 2078 2092 2079 hgcmObjDereference 2080 2081 rc = hgcmMsgSend 2093 hgcmObjDereference(pMsg); 2094 2095 rc = hgcmMsgSend(hMsg); 2082 2096 } 2083 2097 … … 2094 2108 * @return VBox rc. 2095 2109 */ 2096 int HGCMHostRegisterServiceExtension 2097 2098 2099 2110 int HGCMHostRegisterServiceExtension(HGCMSVCEXTHANDLE *pHandle, 2111 const char *pszServiceName, 2112 PFNHGCMSVCEXT pfnExtension, 2113 void *pvExtension) 2100 2114 { 2101 2115 LogFlowFunc(("pHandle = %p, name = %s, pfn = %p, rv = %p\n", pHandle, pszServiceName, pfnExtension, pvExtension)); … … 2109 2123 HGCMMSGHANDLE hMsg = 0; 2110 2124 2111 int rc = hgcmMsgAlloc 2125 int rc = hgcmMsgAlloc(g_hgcmThread, &hMsg, HGCM_MSG_REGEXT, hgcmMainMessageAlloc); 2112 2126 2113 2127 if (RT_SUCCESS(rc)) 2114 2128 { 2115 2129 /* Initialize the message. Since the message is synchronous, use the supplied pointers. */ 2116 HGCMMsgMainRegisterExtension *pMsg = (HGCMMsgMainRegisterExtension *)hgcmObjReference 2130 HGCMMsgMainRegisterExtension *pMsg = (HGCMMsgMainRegisterExtension *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 2117 2131 AssertRelease(pMsg); 2118 2132 … … 2122 2136 pMsg->pvExtension = pvExtension; 2123 2137 2124 hgcmObjDereference 2125 2126 rc = hgcmMsgSend 2138 hgcmObjDereference(pMsg); 2139 2140 rc = hgcmMsgSend(hMsg); 2127 2141 } 2128 2142 … … 2131 2145 } 2132 2146 2133 void HGCMHostUnregisterServiceExtension 2147 void HGCMHostUnregisterServiceExtension(HGCMSVCEXTHANDLE handle) 2134 2148 { 2135 2149 LogFlowFunc(("handle = %p\n", handle)); … … 2138 2152 HGCMMSGHANDLE hMsg = 0; 2139 2153 2140 int rc = hgcmMsgAlloc 2154 int rc = hgcmMsgAlloc(g_hgcmThread, &hMsg, HGCM_MSG_UNREGEXT, hgcmMainMessageAlloc); 2141 2155 2142 2156 if (RT_SUCCESS(rc)) 2143 2157 { 2144 2158 /* Initialize the message. */ 2145 HGCMMsgMainUnregisterExtension *pMsg = (HGCMMsgMainUnregisterExtension *)hgcmObjReference 2159 HGCMMsgMainUnregisterExtension *pMsg = (HGCMMsgMainUnregisterExtension *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 2146 2160 AssertRelease(pMsg); 2147 2161 2148 2162 pMsg->handle = handle; 2149 2163 2150 hgcmObjDereference 2151 2152 rc = hgcmMsgSend 2164 hgcmObjDereference(pMsg); 2165 2166 rc = hgcmMsgSend(hMsg); 2153 2167 } 2154 2168 … … 2165 2179 * @return VBox rc. 2166 2180 */ 2167 int HGCMGuestConnect 2168 2169 2170 2181 int HGCMGuestConnect(PPDMIHGCMPORT pHGCMPort, 2182 PVBOXHGCMCMD pCmd, 2183 const char *pszServiceName, 2184 uint32_t *pu32ClientId) 2171 2185 { 2172 2186 LogFlowFunc(("pHGCMPort = %p, pCmd = %p, name = %s, pu32ClientId = %p\n", … … 2181 2195 HGCMMSGHANDLE hMsg = 0; 2182 2196 2183 int rc = hgcmMsgAlloc 2197 int rc = hgcmMsgAlloc(g_hgcmThread, &hMsg, HGCM_MSG_CONNECT, hgcmMainMessageAlloc); 2184 2198 2185 2199 if (RT_SUCCESS(rc)) … … 2189 2203 * use the supplied pointers. 2190 2204 */ 2191 HGCMMsgMainConnect *pMsg = (HGCMMsgMainConnect *)hgcmObjReference 2205 HGCMMsgMainConnect *pMsg = (HGCMMsgMainConnect *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 2192 2206 AssertRelease(pMsg); 2193 2207 … … 2197 2211 pMsg->pu32ClientId = pu32ClientId; 2198 2212 2199 hgcmObjDereference 2200 2201 rc = hgcmMsgPost 2213 hgcmObjDereference(pMsg); 2214 2215 rc = hgcmMsgPost(hMsg, hgcmMsgCompletionCallback); 2202 2216 } 2203 2217 … … 2213 2227 * @return VBox rc. 2214 2228 */ 2215 int HGCMGuestDisconnect 2216 2217 2229 int HGCMGuestDisconnect(PPDMIHGCMPORT pHGCMPort, 2230 PVBOXHGCMCMD pCmd, 2231 uint32_t u32ClientId) 2218 2232 { 2219 2233 LogFlowFunc(("pHGCMPort = %p, pCmd = %p, u32ClientId = %d\n", … … 2228 2242 HGCMMSGHANDLE hMsg = 0; 2229 2243 2230 int rc = hgcmMsgAlloc 2244 int rc = hgcmMsgAlloc(g_hgcmThread, &hMsg, HGCM_MSG_DISCONNECT, hgcmMainMessageAlloc); 2231 2245 2232 2246 if (RT_SUCCESS(rc)) 2233 2247 { 2234 2248 /* Initialize the message. */ 2235 HGCMMsgMainDisconnect *pMsg = (HGCMMsgMainDisconnect *)hgcmObjReference 2249 HGCMMsgMainDisconnect *pMsg = (HGCMMsgMainDisconnect *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 2236 2250 AssertRelease(pMsg); 2237 2251 … … 2240 2254 pMsg->u32ClientId = u32ClientId; 2241 2255 2242 hgcmObjDereference 2243 2244 rc = hgcmMsgPost 2256 hgcmObjDereference(pMsg); 2257 2258 rc = hgcmMsgPost(hMsg, hgcmMsgCompletionCallback); 2245 2259 } 2246 2260 … … 2255 2269 * @return VBox rc. 2256 2270 */ 2257 static int hgcmHostLoadSaveState 2258 2271 static int hgcmHostLoadSaveState(PSSMHANDLE pSSM, 2272 uint32_t u32MsgId) 2259 2273 { 2260 2274 LogFlowFunc(("pSSM = %p, u32MsgId = %d\n", pSSM, u32MsgId)); … … 2262 2276 HGCMMSGHANDLE hMsg = 0; 2263 2277 2264 int rc = hgcmMsgAlloc 2278 int rc = hgcmMsgAlloc(g_hgcmThread, &hMsg, u32MsgId, hgcmMainMessageAlloc); 2265 2279 2266 2280 if (RT_SUCCESS(rc)) 2267 2281 { 2268 HGCMMsgMainLoadSaveState *pMsg = (HGCMMsgMainLoadSaveState *)hgcmObjReference 2282 HGCMMsgMainLoadSaveState *pMsg = (HGCMMsgMainLoadSaveState *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 2269 2283 AssertRelease(pMsg); 2270 2284 2271 2285 pMsg->pSSM = pSSM; 2272 2286 2273 hgcmObjDereference 2274 2275 rc = hgcmMsgSend 2287 hgcmObjDereference(pMsg); 2288 2289 rc = hgcmMsgSend(hMsg); 2276 2290 } 2277 2291 … … 2285 2299 * @return VBox rc. 2286 2300 */ 2287 int HGCMHostSaveState 2288 { 2289 return hgcmHostLoadSaveState 2301 int HGCMHostSaveState(PSSMHANDLE pSSM) 2302 { 2303 return hgcmHostLoadSaveState(pSSM, HGCM_MSG_SAVESTATE); 2290 2304 } 2291 2305 … … 2295 2309 * @return VBox rc. 2296 2310 */ 2297 int HGCMHostLoadState 2298 { 2299 return hgcmHostLoadSaveState 2311 int HGCMHostLoadState(PSSMHANDLE pSSM) 2312 { 2313 return hgcmHostLoadSaveState(pSSM, HGCM_MSG_LOADSTATE); 2300 2314 } 2301 2315 … … 2310 2324 * @return VBox rc. 2311 2325 */ 2312 int HGCMGuestCall 2313 2314 2315 2316 2317 2326 int HGCMGuestCall(PPDMIHGCMPORT pHGCMPort, 2327 PVBOXHGCMCMD pCmd, 2328 uint32_t u32ClientId, 2329 uint32_t u32Function, 2330 uint32_t cParms, 2331 VBOXHGCMSVCPARM *paParms) 2318 2332 { 2319 2333 LogFlowFunc(("pHGCMPort = %p, pCmd = %p, u32ClientId = %d, u32Function = %d, cParms = %d, paParms = %p\n", … … 2328 2342 2329 2343 /* Resolve the client handle to the client instance pointer. */ 2330 HGCMClient *pClient = (HGCMClient *)hgcmObjReference 2344 HGCMClient *pClient = (HGCMClient *)hgcmObjReference(u32ClientId, HGCMOBJ_CLIENT); 2331 2345 2332 2346 if (pClient) … … 2335 2349 2336 2350 /* Forward the message to the service thread. */ 2337 rc = pClient->pService->GuestCall 2338 2339 hgcmObjDereference 2351 rc = pClient->pService->GuestCall(pHGCMPort, pCmd, u32ClientId, u32Function, cParms, paParms); 2352 2353 hgcmObjDereference(pClient); 2340 2354 } 2341 2355 … … 2352 2366 * @return VBox rc. 2353 2367 */ 2354 int HGCMHostCall 2355 2356 2357 2368 int HGCMHostCall(const char *pszServiceName, 2369 uint32_t u32Function, 2370 uint32_t cParms, 2371 VBOXHGCMSVCPARM *paParms) 2358 2372 { 2359 2373 LogFlowFunc(("name = %s, u32Function = %d, cParms = %d, paParms = %p\n", … … 2373 2387 * other non-time-critical functions. 2374 2388 */ 2375 int rc = hgcmMsgAlloc 2389 int rc = hgcmMsgAlloc(g_hgcmThread, &hMsg, HGCM_MSG_HOSTCALL, hgcmMainMessageAlloc); 2376 2390 2377 2391 if (RT_SUCCESS(rc)) 2378 2392 { 2379 HGCMMsgMainHostCall *pMsg = (HGCMMsgMainHostCall *)hgcmObjReference 2393 HGCMMsgMainHostCall *pMsg = (HGCMMsgMainHostCall *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 2380 2394 AssertRelease(pMsg); 2381 2395 … … 2385 2399 pMsg->paParms = paParms; 2386 2400 2387 hgcmObjDereference 2388 2389 rc = hgcmMsgSend 2401 hgcmObjDereference(pMsg); 2402 2403 rc = hgcmMsgSend(hMsg); 2390 2404 } 2391 2405 … … 2395 2409 2396 2410 #ifdef VBOX_WITH_CRHGSMI 2397 int HGCMHostSvcHandleCreate 2411 int HGCMHostSvcHandleCreate(const char *pszServiceName, HGCMCVSHANDLE * phSvc) 2398 2412 { 2399 2413 LogFlowFunc(("name = %s\n", pszServiceName)); … … 2417 2431 * other non-time-critical functions. 2418 2432 */ 2419 int rc = hgcmMsgAlloc 2433 int rc = hgcmMsgAlloc(g_hgcmThread, &hMsg, HGCM_MSG_SVCAQUIRE, hgcmMainMessageAlloc); 2420 2434 2421 2435 if (RT_SUCCESS(rc)) 2422 2436 { 2423 HGCMMsgMainSvcAcquire *pMsg = (HGCMMsgMainSvcAcquire *)hgcmObjReference 2437 HGCMMsgMainSvcAcquire *pMsg = (HGCMMsgMainSvcAcquire *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 2424 2438 AssertRelease(pMsg); 2425 2439 … … 2427 2441 pMsg->pService = NULL; 2428 2442 2429 rc = hgcmMsgSend 2443 rc = hgcmMsgSend(hMsg); 2430 2444 if (RT_SUCCESS(rc)) 2431 2445 { … … 2434 2448 } 2435 2449 2436 hgcmObjDereference 2450 hgcmObjDereference(pMsg); 2437 2451 } 2438 2452 … … 2441 2455 } 2442 2456 2443 int HGCMHostSvcHandleDestroy 2457 int HGCMHostSvcHandleDestroy(HGCMCVSHANDLE hSvc) 2444 2458 { 2445 2459 LogFlowFunc(("hSvc = %p\n", hSvc)); … … 2458 2472 * other non-time-critical functions. 2459 2473 */ 2460 int rc = hgcmMsgAlloc 2474 int rc = hgcmMsgAlloc(g_hgcmThread, &hMsg, HGCM_MSG_SVCRELEASE, hgcmMainMessageAlloc); 2461 2475 2462 2476 if (RT_SUCCESS(rc)) 2463 2477 { 2464 HGCMMsgMainSvcRelease *pMsg = (HGCMMsgMainSvcRelease *)hgcmObjReference 2478 HGCMMsgMainSvcRelease *pMsg = (HGCMMsgMainSvcRelease *)hgcmObjReference(hMsg, HGCMOBJ_MSG); 2465 2479 AssertRelease(pMsg); 2466 2480 2467 2481 pMsg->pService = (HGCMService *)hSvc; 2468 2482 2469 hgcmObjDereference 2470 2471 rc = hgcmMsgSend 2483 hgcmObjDereference(pMsg); 2484 2485 rc = hgcmMsgSend(hMsg); 2472 2486 } 2473 2487 … … 2476 2490 } 2477 2491 2478 int HGCMHostFastCallAsync (HGCMCVSHANDLE hSvc, uint32_t function, VBOXHGCMSVCPARM *pParm, PHGCMHOSTFASTCALLCB pfnCompletion, void *pvCompletion) 2492 int HGCMHostFastCallAsync(HGCMCVSHANDLE hSvc, uint32_t function, VBOXHGCMSVCPARM *pParm, PHGCMHOSTFASTCALLCB pfnCompletion, 2493 void *pvCompletion) 2479 2494 { 2480 2495 LogFlowFunc(("hSvc = %p, u32Function = %d, pParm = %p\n", … … 2487 2502 2488 2503 HGCMService *pService = (HGCMService *)hSvc; 2489 int rc = pService->HostFastCallAsync 2504 int rc = pService->HostFastCallAsync(function, pParm, pfnCompletion, pvCompletion); 2490 2505 2491 2506 LogFlowFunc(("rc = %Rrc\n", rc)); … … 2494 2509 #endif 2495 2510 2496 int HGCMHostReset 2511 int HGCMHostReset(void) 2497 2512 { 2498 2513 LogFlowFunc(("\n")); … … 2503 2518 HGCMMSGHANDLE hMsg = 0; 2504 2519 2505 int rc = hgcmMsgAlloc 2520 int rc = hgcmMsgAlloc(g_hgcmThread, &hMsg, HGCM_MSG_RESET, hgcmMainMessageAlloc); 2506 2521 2507 2522 if (RT_SUCCESS(rc)) 2508 2523 { 2509 rc = hgcmMsgSend 2524 rc = hgcmMsgSend(hMsg); 2510 2525 } 2511 2526 … … 2514 2529 } 2515 2530 2516 int HGCMHostInit 2531 int HGCMHostInit(void) 2517 2532 { 2518 2533 LogFlowFunc(("\n")); 2519 2534 2520 int rc = hgcmThreadInit 2535 int rc = hgcmThreadInit(); 2521 2536 2522 2537 if (RT_SUCCESS(rc)) … … 2526 2541 */ 2527 2542 2528 rc = hgcmThreadCreate 2543 rc = hgcmThreadCreate(&g_hgcmThread, "MainHGCMthread", hgcmThread, NULL); 2529 2544 2530 2545 if (RT_FAILURE(rc)) … … 2538 2553 } 2539 2554 2540 int HGCMHostShutdown 2555 int HGCMHostShutdown(void) 2541 2556 { 2542 2557 LogFlowFunc(("\n")); … … 2546 2561 */ 2547 2562 2548 int rc = HGCMHostReset 2563 int rc = HGCMHostReset(); 2549 2564 2550 2565 if (RT_SUCCESS(rc)) … … 2553 2568 HGCMMSGHANDLE hMsg = 0; 2554 2569 2555 rc = hgcmMsgAlloc 2570 rc = hgcmMsgAlloc(g_hgcmThread, &hMsg, HGCM_MSG_QUIT, hgcmMainMessageAlloc); 2556 2571 2557 2572 if (RT_SUCCESS(rc)) 2558 2573 { 2559 rc = hgcmMsgSend 2574 rc = hgcmMsgSend(hMsg); 2560 2575 2561 2576 if (RT_SUCCESS(rc)) 2562 2577 { 2563 2578 /* Wait for the thread termination. */ 2564 hgcmThreadWait 2579 hgcmThreadWait(g_hgcmThread); 2565 2580 g_hgcmThread = 0; 2566 2581 2567 hgcmThreadUninit 2582 hgcmThreadUninit(); 2568 2583 } 2569 2584 }
Note:
See TracChangeset
for help on using the changeset viewer.