home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / VSCPPv8.zip / VACPP / IBMCPP / samples / TOOLKIT / MM / ADMCT / ADMCINIT.C < prev    next >
C/C++ Source or Header  |  1994-11-17  |  11KB  |  356 lines

  1. /********************* START OF SPECIFICATIONS *********************
  2. *
  3. * SUBROUTINE NAME: ADMCINIT.c
  4. *
  5. *              Copyright (c) IBM Corporation  1991, 1993
  6. *                        All Rights Reserved
  7. *
  8. * DESCRIPTIVE NAME: Audio MCD DLL Intialization and termination
  9. *                  functions.
  10. *
  11.  
  12. * FUNCTION: Create Global heap, carry out per process intialization.
  13. *
  14. * NOTES:
  15. *
  16. * ENTRY POINTS:
  17. *
  18. * INPUT:
  19. *
  20. * EXIT-NORMAL: Return Code 0.
  21. *
  22. * EXIT_ERROR:  Error Code.
  23. *
  24. * EFFECTS:
  25. *
  26. * Global Vars Referenced:
  27. *              hmtxProcSem, heap, UserCount,
  28. *              hEventInitCompleted,
  29. *
  30. * INTERNAL REFERENCES:   ADMCEXIT () -- DLL Termination Routine.
  31. *                        InitADMC () -- DLL Intialization Routine
  32. *
  33. * EXTERNAL REFERENCES:   DosResetEventSem ()        - OS/2 API
  34. *                        DosPostEventSem  ()        - OS/2 API
  35. *                        DosCreateMutexSem()        - OS/2 API
  36. *                        HhpCreateHeap    ()        - MME  API
  37. *                        HhpDestroyHeap   ()        - MME  API
  38. *                        HhpGetPID()      ()        - MME  API
  39. *
  40. *********************** END OF SPECIFICATIONS **********************/
  41.  
  42. #define INCL_BASE
  43. #define INCL_DOSSEMAPHORES
  44. #define INCL_DOSPROCESS
  45. #define INCL_ERRORS
  46.  
  47. #define MCIERR_SUCCESS          0
  48. #define INTIALIZE               0
  49. #define TERMINATE               1
  50. #define FAILURE                 0L
  51. #define SUCCESS                 1L
  52. #define ADMC_SEM_NAME           "\\SEM32\\ADMC"
  53.  
  54. #include <os2.h>                        // OS/2 System Include
  55. #include <string.h>
  56. #include <os2medef.h>                   // MME includes files.
  57. #include <stdlib.h>                     // Math functions
  58. #include <ssm.h>                        // SSM Spi includes.
  59. #include <meerror.h>                    // MM Error Messages.
  60. #include <mmioos2.h>                    // MMIO Include.
  61. #include <mcios2.h>                     // MM System Include.
  62. #include <mcipriv.h>                    // MCI Connection stuff
  63. #include <mmdrvos2.h>                   // MCI Driver include.
  64. #include <mcd.h>                        // AudioIFDriverInterface.
  65. #include <hhpheap.h>                    // Heap Manager Definitions
  66. #include <qos.h>
  67. #include "audiomcd.h"                   // Component Definitions.
  68. #include "admcfunc.h"                   // Function Prototypes.
  69. #include "admcres.h"
  70. #include <mmdsload.h>
  71.  
  72. //MRESULT EXPENTRY ClipboardProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
  73. extern int          UserCount;
  74. extern HHUGEHEAP    heap;
  75. extern HMTX         hmtxProcSem;
  76. extern ULONG        hModuleHandle;
  77.  
  78. //MRESULT EXPENTRY ClipboardProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
  79.  
  80. /********************* START OF SPECIFICATIONS *******************************
  81. *
  82. * SUBROUTINE NAME: ADMEXIT
  83. *
  84. * DESCRIPTIVE NAME: AudioMCD DLL Temination Routine
  85. *
  86. * FUNCTION: Cleanup and deallocate resources used.
  87. *
  88. *
  89. * ENTRY POINTS:
  90. *
  91. * NOTES: The following concepts are illustrated in this file:
  92. *  A. How to keep track of the number of copies of a dll which
  93. *     are loaded in this system.
  94. *  B. How to allocate and deallocate heaps.
  95. *  C. How to use semaphores accross processes.
  96. *
  97. * INPUT:
  98. *
  99. * EXIT-NORMAL: Return Code 1 to the System Loader.
  100. *
  101. * EXIT_ERROR:  Failure To Load This Module.
  102. *
  103. * EFFECTS:
  104. *
  105. * INTERNAL REFERENCES: heap management Routines.
  106. *
  107. *               Global Variables referenced:
  108. *                      heap.
  109. *                      hmtxProcSem.
  110. *                      UserCount.
  111. *
  112. * EXTERNAL REFERENCES: DosCreateMutexSem  ()    -  OS/2 API
  113. *                      DosOpenMutexSem    ()    -  OS/2 API
  114. *                      DosReleaseMutexSem ()    -  OS/2 API
  115. *                      DosCloseMutexSem   ()    -  OS/2 API
  116. *                      DosExitList        ()    -  OS/2 API -- (DCR ed )
  117. *
  118. *********************** END OF SPECIFICATIONS ********************************/
  119.  
  120.  
  121. USHORT ADMCEXIT ()                    /* AudioMCD Exit Routine    */
  122. {
  123.  
  124.   ULONG               ulrc;        // Return Code
  125.  
  126.   ulrc = MCIERR_SUCCESS;
  127.  
  128.   /*************************************************
  129.   * Since we are terminating, there is one less
  130.   * copy of our dll alive, so reduce the global
  131.   * memory count of the number of dll's alive by
  132.   * one.  This count is important, since if we ever
  133.   * are reduced to 0 copies of the dll, we should
  134.   * free the heap memory that we allocatd.
  135.   *************************************************/
  136.  
  137.  
  138.  
  139.  
  140.   /*****************************************
  141.   * Request the mutex semaphore.
  142.   ******************************************/
  143.   if ((ulrc = DosRequestMutexSem ( hmtxProcSem, SEM_INDEFINITE_WAIT)) != 0)
  144.     {
  145.     DosCloseMutexSem (hmtxProcSem);
  146.     return (FAILURE);
  147.     }
  148.  
  149.   UserCount--;
  150.  
  151.   /*********************************************
  152.   * If there are no more dll's alive, destroy the
  153.   * heap.
  154.   **********************************************/
  155.   if (!UserCount)
  156.   {
  157.      HhpDestroyHeap (heap);    /* Destroy the heap */
  158.      heap = 0;
  159.   }
  160.   else
  161.   {
  162.     /*********************************************
  163.     * If not the last dll, then release access to heap
  164.     **********************************************/
  165.     HhpReleaseHeap (heap, HhpGetPID());  /* Release access */
  166.   }
  167.  
  168.   DosReleaseMutexSem (hmtxProcSem);
  169.   DosCloseMutexSem (hmtxProcSem);
  170.   return (SUCCESS);
  171. } /* ADMCExit */
  172.  
  173.  
  174. /********************* START OF SPECIFICATIONS *******************************
  175. *
  176. * SUBROUTINE NAME: ADMCINIT.C
  177. *
  178. * DESCRIPTIVE NAME: AudioMCD DLL Ibtialization.
  179. *
  180. * FUNCTION: Intialize the DLL and provide mem access to multiple processes.
  181. *
  182. * NOTES: Access to The Global heap is provided using the heap manager
  183. *        Routines. The DLL_InitTerm function is the first function
  184. *        called by the OS/2 DLL Loader.  If the flag variable is set to
  185. *        0, then this is DLL initialization, else it will be termination.
  186. *
  187. *        With the global variable ulUserCount, we keep track of how many
  188. *        times this dll is loaded (i.e. how many process have loaded the
  189. *        DLL).  This variable is used to monitor access to the global
  190. *        memory heap that all instances of the dll maintain.
  191. *
  192. *
  193. * ENTRY POINTS:
  194. *
  195. * INPUT:
  196. *
  197. * EXIT-NORMAL: Return Code 1 to the System Loader.
  198. *
  199. * EXIT_ERROR:  Failure To Load This Module.
  200. *
  201. * EFFECTS:
  202. *
  203. * INTERNAL REFERENCES: heap management Routines,
  204. *
  205. *               Global Variables referenced:
  206. *                      heap.
  207. *                      hmtxProcSem.
  208. *                      UserCount.
  209. *
  210. * EXTERNAL REFERENCES: DosCreateMutexSem  ()    -  OS/2 API
  211. *                      DosOpenMutexSem    ()    -  OS/2 API
  212. *                      DosReleaseMutexSem ()    -  OS/2 API
  213. *                      DosCloseMutexSem   ()    -  OS/2 API
  214. *                      DosExitList        ()    -  OS/2 API
  215. *
  216. *********************** END OF SPECIFICATIONS ********************************/
  217.  
  218. /* COVCC_!INSTR */
  219. #pragma linkage (_DLL_InitTerm, system)
  220.  
  221. /* COVCC_!INSTR */
  222. unsigned long APIENTRY _ADMCInitTerm (unsigned long hModhandle, unsigned long Flag );
  223. unsigned long APIENTRY _ADMCInitTerm (unsigned long hModhandle, unsigned long Flag )
  224.  
  225.  
  226. {
  227.  
  228.  
  229. //  extern   HAB        hab;
  230. //  extern   HMQ        hmq;
  231. //  extern   QMSG       qmsg;
  232. //  extern   HWND       hwndClipWin;               /* Clipboard win handle */
  233.  
  234.  
  235.  
  236.   ULONG               ulrc;
  237.   USHORT              RCExit;
  238.   ULONG               hmodSSM;
  239.   ULONG               hmodMMIO;
  240.   ulrc = hModhandle;      // Subdue the Warning for now
  241.   ulrc = MCIERR_SUCCESS;
  242.  
  243.   /*********************************************
  244.   * Store the module handle for future reference
  245.   * (i.e. GpiLoadBitmap)
  246.   **********************************************/
  247.  
  248.  
  249.   hModuleHandle = hModhandle;
  250.  
  251.   if (Flag == INTIALIZE )
  252.   {
  253.        /**************************************
  254.        * Create a semaphore which will be used
  255.        * by all instances of this dll to prevent
  256.        * one copy of the dll from overwriting
  257.        * another's memory etc.
  258.        ***************************************/
  259.        _CRT_init();
  260.        ulrc = DosCreateMutexSem (ADMC_SEM_NAME, &hmtxProcSem, 0L, FALSE);
  261.        if (ulrc == ERROR_DUPLICATE_NAME)
  262.        {
  263.            ulrc = DosOpenMutexSem (ADMC_SEM_NAME, &hmtxProcSem);
  264.        }
  265.  
  266.        if (ulrc)
  267.           return (FAILURE);  /* Failed Sem Create */
  268.  
  269.        /****************************************
  270.        * Acquire The Mutex Semaphore
  271.        *****************************************/
  272.        ulrc = DosRequestMutexSem ( hmtxProcSem, SEM_INDEFINITE_WAIT);
  273.        if (ulrc)
  274.        {
  275.          DosCloseMutexSem (hmtxProcSem);
  276.          return (FAILURE);
  277.        }
  278.  
  279.  
  280.        /**************************************
  281.        * If we are the first copy of the dll
  282.        * currently loaded, then create a heap
  283.        * where all of our memory will be
  284.        * allocated from.
  285.        ***************************************/
  286.        if (!UserCount && !heap)
  287.        {
  288.            heap = HhpCreateHeap (HEAP_SIZE, HH_SHARED);
  289.            if (heap == (ULONG)NULL)
  290.            {
  291.               DosReleaseMutexSem (hmtxProcSem);
  292.               DosCloseMutexSem (hmtxProcSem);
  293.               return (FAILURE);
  294.            }
  295.  
  296.  
  297.        }
  298.        else
  299.        {
  300.          /*************************************************
  301.          * If the user count is greater than one
  302.          * then we just provide access to the global heap
  303.          * which was created on the load of the initial
  304.          * copy of this dll.
  305.          **************************************************/
  306.           ulrc = HhpAccessHeap (heap, HhpGetPID());
  307.           if (ulrc)
  308.                return (FAILURE);
  309.        }
  310.  
  311.        UserCount++;                         /* Increment Usage */
  312.  
  313.        /*****************************************
  314.        * The stream handlers, but only for the
  315.        * first DLL
  316.        *****************************************/
  317.        MM_DosLoadModule (NULL, 0L, "SSM",  &hmodSSM);
  318.        MM_DosLoadModule (NULL, 0L, "MMIO", &hmodMMIO);
  319.        ulrc = StreamSetup ( );
  320.        if ( ulrc )
  321.        {
  322.           DosReleaseMutexSem (hmtxProcSem);
  323.           return ( ulrc );
  324.        }
  325.  
  326.        /******************************************
  327.        * Release The Mutex Semaphore
  328.        *******************************************/
  329.        ulrc = DosReleaseMutexSem (hmtxProcSem);
  330.        if (ulrc)
  331.        {
  332.           if (UserCount)
  333.             DosCloseMutexSem (hmtxProcSem);
  334.           return (FAILURE);
  335.        }
  336.  
  337.        /***********************************************
  338.        * Init Complete, Indicate success to the loader
  339.        ************************************************/
  340.        return (SUCCESS);
  341.  
  342.   } /* if this is DLL initialization */
  343.   else
  344.   {
  345.       /********************************************
  346.       * If the flag is anything but initialization
  347.       * then it MUST be termination.
  348.       *********************************************/
  349.       RCExit = ADMCEXIT ();
  350.       return (RCExit);
  351.   } /* else this must be termination */
  352.  
  353. } /* of Init Term Function */
  354.  
  355. /* COVCC_INSTR */
  356.