Changeset 40812 in vbox
- Timestamp:
- Apr 7, 2012 10:13:10 AM (12 years ago)
- Location:
- trunk/src/VBox/HostDrivers/Support
- Files:
-
- 2 edited
-
SUPDrvTracer.cpp (modified) (13 diffs)
-
testcase/tstSupLoadModule.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp
r40811 r40812 66 66 PSUPDRVSESSION pSession; 67 67 68 /** Set when the module is unloaded or the driver deregisters its probes. */ 68 /** Used to indicate that we've called pfnProviderDeregistered already and it 69 * failed because the provider was busy. Next time we must try 70 * pfnProviderDeregisterZombie. 71 * 72 * @remarks This does not necessiarly mean the provider is in the zombie 73 * list. See supdrvTracerCommonDeregisterImpl. */ 69 74 bool fZombie; 70 75 /** Set if the provider has been successfully registered with the … … 81 86 * Defined Constants And Macros * 82 87 *******************************************************************************/ 83 #if 088 #ifdef DEBUG_bird 84 89 # define LOG_TRACER(a_Args) SUPR0Printf a_Args 85 90 #else … … 552 557 if (RT_SUCCESS(rc)) 553 558 { 554 if (pDevExt->pTracerOps) 559 if ( pDevExt->pTracerOps 560 && !pDevExt->fTracerUnloading) 555 561 rc = pDevExt->pTracerOps->pfnProviderRegister(pDevExt->pTracerOps, &pProv->Core); 556 562 else … … 563 569 RTListAppend(&pDevExt->TracerProviderList, &pProv->ListEntry); 564 570 RTSemFastMutexRelease(pDevExt->mtxTracer); 565 LOG_TRACER(("Registered DTraceprovider '%s' in '%s' -> %p\n",571 LOG_TRACER(("Registered Tracer provider '%s' in '%s' -> %p\n", 566 572 pProv->szName, pszModName, pProv->Core.TracerData.DTrace.idProvider)); 567 573 } … … 680 686 int rc; 681 687 688 LOG_TRACER(("SUPR0TracerRegisterModule: %p\n", pVtgHdr)); 689 682 690 /* 683 691 * Validate input and context. … … 702 710 703 711 rc = supdrvTracerRegisterVtgObj(pDevExt, pVtgHdr, cbVtgObj, pImage, NULL, pImage->szName); 712 LOG_TRACER(("SUPR0TracerRegisterModule: rc=%d\n", rc)); 704 713 705 714 /* … … 725 734 SUPR0DECL(int) SUPR0TracerRegisterImpl(void *hMod, PSUPDRVSESSION pSession, PCSUPDRVTRACERREG pReg, PCSUPDRVTRACERHLP *ppHlp) 726 735 { 727 PSUPDRVLDRIMAGE pImage = (PSUPDRVLDRIMAGE)hMod; 728 PSUPDRVDEVEXT pDevExt; 729 int rc; 736 PSUPDRVLDRIMAGE pImage = (PSUPDRVLDRIMAGE)hMod; 737 PSUPDRVDEVEXT pDevExt; 738 PSUPDRVTPPROVIDER pProv; 739 int rc; 730 740 731 741 /* … … 753 763 } 754 764 765 AssertReturn(pReg->u32Magic == SUPDRVTRACERREG_MAGIC, VERR_INVALID_MAGIC); 766 AssertReturn(pReg->u32Version == SUPDRVTRACERREG_VERSION, VERR_VERSION_MISMATCH); 767 AssertReturn(pReg->uEndMagic == SUPDRVTRACERREG_MAGIC, VERR_VERSION_MISMATCH); 755 768 AssertPtrReturn(pReg->pfnProbeFireKernel, VERR_INVALID_POINTER); 756 769 AssertPtrReturn(pReg->pfnProbeFireUser, VERR_INVALID_POINTER); … … 770 783 if (!pDevExt->pTracerOps) 771 784 { 785 LOG_TRACER(("SUPR0TracerRegisterImpl: pReg=%p\n", pReg)); 772 786 pDevExt->pTracerOps = pReg; 773 787 pDevExt->pTracerSession = pSession; … … 775 789 776 790 *ppHlp = &pDevExt->TracerHlp; 791 777 792 rc = VINF_SUCCESS; 793 794 /* 795 * Iterate the already loaded modules and register their providers. 796 */ 797 RTListForEach(&pDevExt->TracerProviderList, pProv, SUPDRVTPPROVIDER, ListEntry) 798 { 799 Assert(!pProv->fRegistered); 800 pProv->fRegistered = true; 801 int rc2 = pDevExt->pTracerOps->pfnProviderRegister(pDevExt->pTracerOps, &pProv->Core); 802 if (RT_FAILURE(rc2)) 803 { 804 pProv->fRegistered = false; 805 SUPR0Printf("SUPR0TracerRegisterImpl: Failed to register provider %s::%s - rc=%d\n", 806 pProv->Core.pszModName, pProv->szName, rc2); 807 } 808 } 778 809 } 779 810 else … … 796 827 static void supdrvTracerCommonDeregisterImpl(PSUPDRVDEVEXT pDevExt) 797 828 { 798 supdrvTracerRemoveAllProviders(pDevExt); 829 uint32_t i; 830 PSUPDRVTPPROVIDER pProv; 831 PSUPDRVTPPROVIDER pProvNext; 799 832 800 833 RTSemFastMutexRequest(pDevExt->mtxTracer); 834 835 /* 836 * Disassociate the tracer implementation from all providers. 837 * We will have to wait on busy providers. 838 */ 839 for (i = 0; ; i++) 840 { 841 uint32_t cZombies = 0; 842 843 /* Live providers. */ 844 RTListForEachSafe(&pDevExt->TracerProviderList, pProv, pProvNext, SUPDRVTPPROVIDER, ListEntry) 845 { 846 int rc; 847 LOG_TRACER(("supdrvTracerRemoveAllProviders: Attemting to unregister '%s' / %p...\n", 848 pProv->szName, pProv->Core.TracerData.DTrace.idProvider)); 849 850 if (!pProv->fRegistered) 851 continue; 852 if (!pProv->fZombie) 853 { 854 rc = pDevExt->pTracerOps->pfnProviderDeregister(pDevExt->pTracerOps, &pProv->Core); 855 if (RT_FAILURE(rc)) 856 pProv->fZombie = true; 857 } 858 else 859 rc = pDevExt->pTracerOps->pfnProviderDeregisterZombie(pDevExt->pTracerOps, &pProv->Core); 860 if (RT_SUCCESS(rc)) 861 pProv->fZombie = pProv->fRegistered = false; 862 else 863 { 864 cZombies++; 865 if (!(i & 0xf)) 866 SUPR0Printf("supdrvTracerCommonDeregisterImpl: Waiting on busy provider '%s' / %p (rc=%d)\n", 867 pProv->szName, pProv->Core.TracerData.DTrace.idProvider, rc); 868 else 869 LOG_TRACER(("supdrvTracerCommonDeregisterImpl: Failed to unregister provider '%s' / %p - rc=%d\n", 870 pProv->szName, pProv->Core.TracerData.DTrace.idProvider, rc)); 871 } 872 } 873 874 /* Zombies providers. */ 875 RTListForEachSafe(&pDevExt->TracerProviderZombieList, pProv, pProvNext, SUPDRVTPPROVIDER, ListEntry) 876 { 877 int rc; 878 LOG_TRACER(("supdrvTracerRemoveAllProviders: Attemting to unregister '%s' / %p (zombie)...\n", 879 pProv->szName, pProv->Core.TracerData.DTrace.idProvider)); 880 881 rc = pDevExt->pTracerOps->pfnProviderDeregisterZombie(pDevExt->pTracerOps, &pProv->Core); 882 if (RT_SUCCESS(rc)) 883 { 884 RTListNodeRemove(&pProv->ListEntry); 885 supdrvTracerFreeProvider(pProv); 886 } 887 else 888 { 889 cZombies++; 890 if (!(i & 0xf)) 891 SUPR0Printf("supdrvTracerRemoveAllProviders: Waiting on busy provider '%s' / %p (rc=%d)\n", 892 pProv->szName, pProv->Core.TracerData.DTrace.idProvider, rc); 893 else 894 LOG_TRACER(("supdrvTracerRemoveAllProviders: Failed to unregister provider '%s' / %p - rc=%d\n", 895 pProv->szName, pProv->Core.TracerData.DTrace.idProvider, rc)); 896 } 897 } 898 899 if (cZombies == 0) 900 break; 901 902 /* Delay...*/ 903 RTSemFastMutexRelease(pDevExt->mtxTracer); 904 RTThreadSleep(1000); 905 RTSemFastMutexRequest(pDevExt->mtxTracer); 906 } 907 908 /* 909 * Deregister the tracer implementation. 910 */ 801 911 pDevExt->pTracerImage = NULL; 802 912 pDevExt->pTracerSession = NULL; 803 913 pDevExt->pTracerOps = NULL; 804 914 pDevExt->fTracerUnloading = false; 915 805 916 RTSemFastMutexRelease(pDevExt->mtxTracer); 806 917 } … … 849 960 : pDevExt->pTracerSession == pSession) 850 961 { 962 LOG_TRACER(("SUPR0TracerDeregisterImpl: Unloading ...\n")); 851 963 pDevExt->fTracerUnloading = true; 852 964 RTSemFastMutexRelease(pDevExt->mtxTracer); 853 965 supdrvTracerCommonDeregisterImpl(pDevExt); 966 LOG_TRACER(("SUPR0TracerDeregisterImpl: ... done.\n")); 854 967 } 855 968 else … … 922 1035 if (pDevExt->pTracerImage == pImage) 923 1036 { 1037 LOG_TRACER(("supdrvTracerModuleUnloading: Unloading tracer ...\n")); 924 1038 pDevExt->fTracerUnloading = true; 925 1039 RTSemFastMutexRelease(pDevExt->mtxTracer); 926 1040 supdrvTracerCommonDeregisterImpl(pDevExt); 1041 LOG_TRACER(("supdrvTracerModuleUnloading: ... done.\n")); 927 1042 } 928 1043 else -
trunk/src/VBox/HostDrivers/Support/testcase/tstSupLoadModule.cpp
r40810 r40812 54 54 static const RTGETOPTDEF s_aOptions[] = 55 55 { 56 { "--keep", 'k', RTGETOPT_REQ_NOTHING } 56 { "--keep", 'k', RTGETOPT_REQ_NOTHING }, 57 { "--no-keep", 'n', RTGETOPT_REQ_NOTHING }, 57 58 }; 58 59 … … 96 97 break; 97 98 99 case 'n': 100 fKeepLoaded = false; 101 break; 102 98 103 case 'h': 99 104 RTPrintf("%s [mod1 [mod2...]]\n");
Note:
See TracChangeset
for help on using the changeset viewer.

