home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cscout.zip / SAMPLES / MTESTPM.C < prev    next >
Text File  |  1995-06-12  |  31KB  |  780 lines

  1. /************************************************************************/
  2. /***                                                                  ***/
  3. /*** AUTHOR :            RH                                           ***/
  4. /***                                                                  ***/
  5. /*** SHORT DESCRIPTION : test PM tracin                               ***/
  6. /***                                                                  ***/
  7. /*** COPYRIGHT :         (C) 1995 a priori Computer Solutions GmbH    ***/
  8. /***                                                                  ***/
  9. /************************************************************************/
  10.  
  11. #ifdef __IBMC__
  12. #pragma strings(readonly)
  13. #endif
  14.  
  15. /*----------------------------------------------------------------------*/
  16. /* includes                                                             */
  17. /*----------------------------------------------------------------------*/
  18.  
  19. #define INCL_BASE
  20. #define INCL_PM
  21. #include <os2.h>
  22.  
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include <stdlib.h>
  26. #include <setjmp.h>
  27. #ifndef __IBMC__
  28. #include <process.h>
  29. #endif
  30.  
  31. /*--------------------------------------*/
  32. /* Define trace levels                  */
  33. /*--------------------------------------*/
  34. #define   DATT_BASE_LEVEL   2000
  35. #define   DATT_TM_LEVEL     2001
  36. #define   TM_I              DATT_BASE_LEVEL + 1   /* Info */
  37. #define   TM_E              DATT_BASE_LEVEL + 2   /* error */
  38. #define   TM_H              DATT_BASE_LEVEL + 3   /* hex dump */
  39.  
  40. /*--------------------------------------*/
  41. /* include the C-Scout definitions here */
  42. /*--------------------------------------*/
  43. #include "datt.h"
  44.  
  45. #include "mtestpm.h"
  46. #include "resid.h"
  47.  
  48. /*----------------------------------------------------------------------*/
  49. /* defines                                                              */
  50. /*----------------------------------------------------------------------*/
  51.  
  52. #define TITLE "mtestpm"
  53. #define DESC "test PM tracing"
  54.  
  55. #define TEST_DLG_TITLE "Test Dialog"
  56. #define TEST_DLG_PROMPT "Prompt"
  57.  
  58. /*----------------------------------------------------------------------*/
  59. /* macros                                                               */
  60. /*----------------------------------------------------------------------*/
  61.  
  62. // sets the text contents h = hwnd, i = id, s = string of text
  63. #define SetText( h, i, s ) \
  64.         WinSetWindowText(WinWindowFromID( h , i ), s )
  65.  
  66. /*----------------------------------------------------------------------*/
  67. /* declarations                                                         */
  68. /*----------------------------------------------------------------------*/
  69.  
  70. int main (int argc, char * argv [] );
  71.  
  72. static MRESULT EXPENTRY wpClient ( HWND hwndClient,
  73.                                    ULONG msg,
  74.                                    MPARAM mp1,
  75.                                    MPARAM mp2 );
  76.  
  77. static MRESULT EXPENTRY dlgpTest ( HWND    dialog,
  78.                                    ULONG   msg,
  79.                                    MPARAM  mp1,
  80.                                    MPARAM  mp2 );
  81.  
  82. static MRESULT EXPENTRY dlgpAbout( HWND     hwnd,
  83.                                    ULONG    msg,
  84.                                    MPARAM   mp1,
  85.                                    MPARAM   mp2 );
  86.  
  87. static  VOID  WmCreate (HWND client);
  88. static  VOID  StartThreads( USHORT   usNumThreads );
  89. static  VOID  fnThread ( PVOID   lfn );
  90. static  VOID  WmCommand (HWND client, MPARAM mp1);
  91. static  VOID  WmPaint (HWND client);
  92.  
  93. static VOID   RegisterExceptionHandler( _REGREC     *pstRegRec,
  94.                                         _UserExcRec *pstUserExcRec );
  95.  
  96. #ifdef __IBMC__
  97. ULONG _System ExHandler( EXCEPTIONREPORTRECORD       *pExRep,
  98. #else
  99. ULONG _syscall ExHandler( EXCEPTIONREPORTRECORD       *pExRep,
  100. #endif
  101.                          EXCEPTIONREGISTRATIONRECORD *pExReg,
  102.                          CONTEXTRECORD               *pConRec,
  103.                          VOID                        *pDspCon );
  104.  
  105. BOOL   APIENTRY ConditionHandler( PTXMI  ptxBuffer );
  106.  
  107. /*----------------------------------------------------------------------*/
  108. /* external static variables                                            */
  109. /*----------------------------------------------------------------------*/
  110. HAB  habThis ;
  111. HWND hwndFrame, hwndClient;
  112.  
  113. static LONG ulCxFrame, ulCyFrame ;
  114.  
  115. ULONG TCOUNT  = 0;
  116. ULONG TLOOP   = 100;
  117. ULONG TSLEEP  = 1000;
  118.  
  119. /************************************************************************/
  120. /* FUNCTION-NAME       : main                                           */
  121. /*                                                                      */
  122. /* DESCRIPTION         :                                                */
  123. /*                                                                      */
  124. /* PARAMETERS          :                                                */
  125. /*                                                                      */
  126. /* RETURN-VALUE        :                                                */
  127. /*                                                                      */
  128. /************************************************************************/
  129. int main (int argc, char * argv [] )
  130.   {
  131.   HMQ     hmq;
  132.   QMSG    qmsg;
  133.   ULONG   cf;
  134.  
  135.   argc = argc;
  136.   argv = argv;
  137.  
  138.   /*----------------------------------------*/
  139.   /* Register my own critical error handler */
  140.   /*----------------------------------------*/
  141.   SetErrorInfo ( ConditionHandler );
  142.  
  143.   TX (! (habThis = WinInitialize (0) ) );
  144.  
  145.   TX(! (hmq = WinCreateMsgQueue( habThis, 0 ) ) );
  146.   TX(! WinRegisterClass( habThis,
  147.                          TITLE,
  148.                          wpClient,
  149.                          CS_SIZEREDRAW,
  150.                          0 ) );
  151.  
  152.   cf = FCF_TITLEBAR | FCF_SYSMENU | FCF_MENU | FCF_ICON
  153.           | FCF_SIZEBORDER | FCF_MINMAX | FCF_ACCELTABLE;
  154.  
  155.   TX(! (hwndFrame = WinCreateStdWindow( HWND_DESKTOP,
  156.                                         0L,
  157.                                         &cf,
  158.                                         TITLE,
  159.                                         TITLE,
  160.                                         0L,
  161.                                         0,
  162.                                         ID_mtestpm,
  163.                                         &hwndClient ) ) );
  164.  
  165.   TX(! WinSetWindowPos( hwndFrame,
  166.                         HWND_TOP,
  167.                         (SHORT) (ulCxFrame * 3L / 18L),
  168.                         (SHORT) (ulCyFrame * 3L / 14L),
  169.                         (SHORT) (ulCxFrame * 12L / 18L),
  170.                         (SHORT) (ulCyFrame * 8L / 14L),
  171.                         SWP_SIZE | SWP_MOVE | SWP_ACTIVATE | SWP_SHOW) );
  172.  
  173.   while (WinGetMsg (habThis, & qmsg, 0L, 0L, 0L) )
  174.           WinDispatchMsg (habThis, & qmsg);
  175.  
  176.   TX(! WinDestroyWindow (hwndFrame) );
  177.   TX(! WinDestroyMsgQueue (hmq) );
  178.   TX(! WinTerminate (habThis) );
  179.  
  180.   return 0;
  181.   }
  182.  
  183. /************************************************************************/
  184. /* FUNCTION-NAME       : wpClient                                       */
  185. /*                                                                      */
  186. /* DESCRIPTION         : hwndClient window procedure                    */
  187. /*                                                                      */
  188. /* PARAMETERS          :                                                */
  189. /*                                                                      */
  190. /* RETURN-VALUE        :                                                */
  191. /*                                                                      */
  192. /************************************************************************/
  193. static MRESULT EXPENTRY wpClient ( HWND    hwndClient,
  194.                                    ULONG   msg,
  195.                                    MPARAM  mp1,
  196.                                    MPARAM  mp2 )
  197.   {
  198.   switch (msg)
  199.     {
  200.     case WM_START_THREADS:
  201.          StartThreads( SHORT1FROMMP( mp1 ) );
  202.          return FALSE;
  203.  
  204.     case WM_CREATE:
  205.          WmCreate (hwndClient);
  206.          return FALSE;
  207.  
  208.     case WM_COMMAND:
  209.          WmCommand (hwndClient, mp1);
  210.          return FALSE;
  211.  
  212.     case WM_ERASEBACKGROUND:
  213.          return (MRESULT) TRUE;
  214.  
  215.     case WM_PAINT:
  216.          WmPaint (hwndClient);
  217.          return FALSE;
  218.  
  219.     case HM_ERROR:
  220.          MiscDisplayMsg( hwndClient,
  221.                          IDMSG_HELPERROR,
  222.                          MB_OK | MB_ERROR,
  223.                          TRUE );
  224.          break;
  225.  
  226.     case HM_QUERY_KEYS_HELP:
  227.          return (MRESULT) PANEL_KEYS;
  228.  
  229.     default:
  230.           break;
  231.     }
  232.  
  233.   return ( WinDefWindowProc (hwndClient, msg, mp1, mp2) );
  234.  
  235.   }                                    /* wpClient                      */
  236.  
  237. /************************************************************************/
  238. /* FUNCTION-NAME       : StartThreads                                   */
  239. /*                                                                      */
  240. /* DESCRIPTION         : handle message WM_START_THREADS                */
  241. /*                                                                      */
  242. /* PARAMETERS          : number of threads to start                     */
  243. /*                                                                      */
  244. /* RETURN-VALUE        : VOID                                           */
  245. /*                                                                      */
  246. /************************************************************************/
  247. static VOID  StartThreads( USHORT   usNumThreads )
  248.   {
  249.   #define   STACK_SIZE   32000
  250.  
  251.   ULONG      i;
  252.   TID        tid;
  253.  
  254. #if defined __WATCOMC__
  255.   char      *stack;
  256. #endif
  257.  
  258.   FncEntry();
  259.  
  260.   Tracef( TM_I, "Starting threads now" );
  261.  
  262.   /*----------------------------------------------*/
  263.   /* thread starter loop                          */
  264.   /*----------------------------------------------*/
  265.  
  266.   for (i = 1 ; i <= usNumThreads; i++)
  267.       {
  268.       tid = -1;
  269.       /*----------------------------------------------*/
  270.       /* _beginthread  logic                          */
  271.       /*----------------------------------------------*/
  272.       #if defined __IBMC__
  273.       TX( -1 == (LONG)( tid = (TID)_beginthread( fnThread,
  274.                                                  NULL,
  275.                                                  STACK_SIZE,
  276.                                                  (PVOID) i ) ) );
  277.       #elif defined __WATCOMC__
  278.       TX( -1 == (LONG)( tid = (TID)_beginthread( fnThread,
  279.                                                  NULL,
  280.                                                  STACK_SIZE,
  281.                                                  (PVOID) i ) ) );
  282.       #elif defined __BORLANDC__
  283.       TX( -1 == (LONG)( tid = (TID)_beginthread( fnThread,
  284.                                                  8192,
  285.                                                  (void*) i ) ) );
  286.       #endif
  287.       if ( -1 == (LONG)tid )
  288.          {
  289.          Tracef( TM_E, "ERROR !!! - beginthread returns [%ld]", tid );
  290.          DosBeep(100,100);
  291.          }
  292.       else
  293.          Tracef( TM_I, "thread tid %ld lfn %ld started", tid, i );
  294.       }                                // END(IF) usNumThreads
  295.  
  296.   Tracef( TM_I, "Threads all started" );
  297.  
  298.   FncExitVoid();
  299.   }
  300.  
  301. /************************************************************************/
  302. /* FUNCTION-NAME       : fnThread                                       */
  303. /*                                                                      */
  304. /* DESCRIPTION         : test function running in a thread              */
  305. /*                                                                      */
  306. /* PARAMETERS          :                                                */
  307. /*                                                                      */
  308. /* RETURN-VALUE        :                                                */
  309. /*                                                                      */
  310. /************************************************************************/
  311. static  VOID fnThread ( PVOID   lfn )
  312.   {
  313.   INT     i;
  314.   PTIB    ptib;
  315.   PPIB    ppib;
  316.   ULONG   ulLevel = (ULONG)lfn;
  317.   HAB     hab;
  318.   HMQ     hmq;
  319.   ULONG            ulException;
  320.   _REGREC          stRegRec;
  321.   _UserExcRec      stUserExcRec;
  322.   BOOL             fRegistered = FALSE;
  323.  
  324.   FncEntry();
  325.  
  326.   // Register Exception Handler
  327.   RegisterExceptionHandler( &stRegRec, &stUserExcRec );
  328.   fRegistered = TRUE;
  329.   stUserExcRec.pvBuffer = calloc( 1, DUMP_BUFFER_LEN );
  330.   ulException = setjmp( stUserExcRec.jmp );
  331.   if ( ulException )
  332.     {
  333.     /*--------------------------------------*/
  334.     /* An exception has occurred somewhere  */
  335.     /* which we have handled. Just exit     */
  336.     /* this thread.                         */
  337.     /*--------------------------------------*/
  338.     goto FnExit;
  339.     }
  340.  
  341.   TCOUNT ++;
  342.  
  343.   TX (! (hab = WinInitialize (0) ) );
  344.   TX (! (hmq = WinCreateMsgQueue (hab, 0) ) );
  345.   TX (! WinCancelShutdown( hmq, TRUE ) );
  346.  
  347.   DosGetInfoBlocks(&ptib, &ppib);
  348.  
  349.   if ( ptib->tib_ptib2->tib2_ultid == 3 )
  350.     {
  351.     /*----------------------*/
  352.     /* Force an error       */
  353.     /*----------------------*/
  354.     TX( NULL == ( fopen( "test.ter", "r" ) ) );
  355.     TX (!GpiAssociate( (HPS)2, (HDC)22 ) );
  356.     }
  357.   else
  358.     {
  359.     /*----------------------*/
  360.     /* Force an error       */
  361.     /*----------------------*/
  362.     DosSleep(10);
  363.     TX (DosCloseEventSem( 9083 ) );
  364.     }
  365.  
  366.   for (i = 1; i <= TLOOP; i++)
  367.      {
  368.      Tracef( TM_I,
  369.              "thread pid %ld tid %ld ulLevel %ld running",
  370.              ppib->pib_ulpid, ptib->tib_ptib2->tib2_ultid, ulLevel );
  371.      if ( ( ptib->tib_ptib2->tib2_ultid == 3 ) &&
  372.           ( i == 5 ) )
  373.        {
  374.        UCHAR    test[8200];
  375.        PLONG    ptr = NULL;
  376.        memset( test, '0', sizeof(test) );
  377.  
  378.        /*----------------------*/
  379.        /* Force an exception   */
  380.        /*----------------------*/
  381.        i = (int)*ptr;
  382.        }
  383.  
  384.      DosSleep(TSLEEP);
  385.      }
  386.  
  387. FnExit:
  388.  
  389.   Tracef( TM_I,
  390.           "thread tid %ld ulLevel %ld ended",
  391.           ptib->tib_ptib2->tib2_ultid, ulLevel );
  392.  
  393.   TX (! WinDestroyMsgQueue (hmq) );
  394.   TX (! WinTerminate (hab) );
  395.  
  396.   TCOUNT --;
  397.  
  398.   if ( fRegistered )
  399.      /*-------------------------------*/
  400.      /* De-Register Exception Handler */
  401.      /*-------------------------------*/
  402.      DosUnsetExceptionHandler( (PEXCEPTIONREGISTRATIONRECORD) &stRegRec );
  403.  
  404.   free( stUserExcRec.pvBuffer );
  405.  
  406.   FncExitVoid();
  407.   }                                    /* thread            */
  408.  
  409. /************************************************************************/
  410. /* FUNCTION-NAME       : WmCreate                                       */
  411. /*                                                                      */
  412. /* DESCRIPTION         : handle message WM_CREATE                       */
  413. /*                                                                      */
  414. /*                                                                      */
  415. /* PARAMETERS          : hwndClient window handle                       */
  416. /*                                                                      */
  417. /* RETURN-VALUE        : VOID                                           */
  418. /*                                                                      */
  419. /************************************************************************/
  420. static VOID WmCreate (HWND hwndClient)
  421.   {
  422.   SWCNTRL sw;
  423.  
  424.   /* defaults */
  425.   memset (& sw, 0, sizeof sw);
  426.  
  427.   sw.hwnd = WinQueryWindow (hwndClient, QW_PARENT);
  428.   strcpy (sw.szSwtitle, TITLE);
  429.  
  430.   TX(! WinAddSwitchEntry (& sw) );
  431.  
  432.   /* QUERY SCREEN SIZE */
  433.   ulCxFrame = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN) ;
  434.   ulCyFrame = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN) ;
  435.  
  436.   MiscInitHelp(hwndClient);
  437.  
  438.   return;
  439.   }                                    /* WmCreate             */
  440.  
  441. /************************************************************************/
  442. /* FUNCTION-NAME       : WmCommand                                      */
  443. /*                                                                      */
  444. /* DESCRIPTION         : handle message WM_COMMAND                      */
  445. /*                                                                      */
  446. /* PARAMETERS          : - hwndClient window handle                     */
  447. /*                       - message parameter                            */
  448. /*                                                                      */
  449. /* RETURN-VALUE        : VOID                                           */
  450. /*                                                                      */
  451. /************************************************************************/
  452. static VOID WmCommand (HWND hwndClient, MPARAM mp1)
  453.   {
  454.   switch (SHORT1FROMMP (mp1) )
  455.      {
  456.      case IDD_ABOUTDLG:
  457.  
  458.          TX(WinDlgBox (HWND_DESKTOP,
  459.                        hwndClient,
  460.                        dlgpAbout,
  461.                        0,
  462.                        IDD_ABOUTDLG,
  463.                        NULL ) == DID_ERROR );
  464.  
  465.          break;
  466.  
  467.      case IDD_TESTDLG:
  468.          {
  469.          SHORT     sNumThreads;
  470.          TX( WinDlgBox ( HWND_DESKTOP,
  471.                          hwndClient,
  472.                          dlgpTest,
  473.                          0,
  474.                          IDD_TESTDLG,
  475.                          &sNumThreads ) == DID_ERROR );
  476.  
  477.          Tracef( TM_I, "Number of threads to be started %d", sNumThreads );
  478.  
  479.          TX(! WinPostMsg (hwndClient,
  480.                           WM_START_THREADS,
  481.                           MPFROMSHORT( sNumThreads ),
  482.                           NULL ) );
  483.          break;
  484.          }
  485.  
  486.      case ID_EXIT:
  487.  
  488.              MiscDestroyHelp();
  489.              TX(! WinPostMsg (hwndClient, WM_QUIT, NULL, NULL) );
  490.              break;
  491.      }
  492.  
  493.   return;
  494.   }                 /* WmCommand                   */
  495.  
  496. /************************************************************************/
  497. /* FUNCTION-NAME       : WmPaint                                        */
  498. /*                                                                      */
  499. /* DESCRIPTION         : handle message WM_PAINT                        */
  500. /*                                                                      */
  501. /* PARAMETERS          : hwndClient window handle                       */
  502. /*                                                                      */
  503. /* RETURN-VALUE        : VOID                                           */
  504. /*                                                                      */
  505. /************************************************************************/
  506. static VOID WmPaint (HWND hwndClient)
  507.   {
  508.   HPS     hps;
  509.   RECTL   rc;
  510.   POINTL  pt;
  511.  
  512.   /* create a cache presentation space */
  513.   hps = WinBeginPaint (hwndClient, 0L, & rc);
  514.  
  515.   /* Set the text coordinates, */
  516.   pt.x = pt.y = 20;
  517.  
  518.   /* set text color */
  519.   GpiSetColor (hps, SYSCLR_WINDOWTEXT);
  520.  
  521.   /* set background color */
  522.   GpiSetBackColor (hps, SYSCLR_WINDOW);
  523.  
  524.   /* set mix mode */
  525.   GpiSetBackMix (hps, BM_OVERPAINT);
  526.  
  527.   /* draw the string */
  528.   GpiCharStringAt (hps, & pt, (LONG) sizeof DESC - 1, DESC);
  529.  
  530.   WinEndPaint (hps);
  531.  
  532.   } /* WmPaint  */
  533.  
  534. /************************************************************************/
  535. /* FUNCTION-NAME       : ConditonHandler                                */
  536. /*                                                                      */
  537. /* DESCRIPTION         : handles errors detected by TX macro            */
  538. /*                                                                      */
  539. /* PARAMETERS          : PTXMI                                          */
  540. /*                                                                      */
  541. /* RETURN-VALUE        : TRUE - don't terminate process                 */
  542. /*                                                                      */
  543. /************************************************************************/
  544.  
  545. BOOL   APIENTRY ConditionHandler( PTXMI  pTxmi )
  546.   {
  547.   BOOL     fRc = TRUE;        // call default error handler
  548.                               // FALSE = terminate process
  549.   FncEntry();
  550.  
  551.   /*----------------------------------------------*/
  552.   /* Can now do whatever I want in this situation */
  553.   /*----------------------------------------------*/
  554.  
  555.   Tracef ( TM_I,
  556.            "An internal Program Error has occurred - "
  557.            "for detailed information see below\n"
  558.            "Module (Line)    : %.50s (%ld)\n"\
  559.            "Function Name    : %.60s\n"\
  560.            "Source Line      : %.60s\n"\
  561.            "Return Code      : %ld(dec) %08x(hex)\n"\
  562.            "Kernel RC text   : %.60s\n"\
  563.            "PM RC text       : %.60s\n"\
  564.            "CRT error text   : %.60s\n",
  565.            pTxmi->szModuleName,
  566.            pTxmi->ulLineNo,
  567.            pTxmi->szFunction,
  568.            pTxmi->szSourceLine,
  569.            pTxmi->apiretRc,            // decimal
  570.            pTxmi->apiretRc,            // hex
  571.            pTxmi->szErrBuff2,          // Kernel
  572.            pTxmi->szErrBuff1,          // PM
  573.            pTxmi->szErrBuff3 );        // CRT
  574.  
  575.   FncExit( fRc );
  576.   }
  577.  
  578. /************************************************************************/
  579. /*                                                                      */
  580. /* Function name      : RegisterExceptionHandler                        */
  581. /*                                                                      */
  582. /* Description        :                                                 */
  583. /*                                                                      */
  584. /* Parameters         :                                                 */
  585. /*                                                                      */
  586. /* Return value       :                                                 */
  587. /*                                                                      */
  588. /************************************************************************/
  589.  
  590. static VOID  RegisterExceptionHandler( _REGREC     *pstRegRec,
  591.                                        _UserExcRec *pstUserExcRec )
  592.   {
  593.   FncEntry();
  594.  
  595.   pstRegRec->pstUserExRec = pstUserExcRec;
  596.   pstRegRec->pnext        = NULL;
  597.   pstRegRec->pfnHandler   = ExHandler;
  598.  
  599.   DosSetExceptionHandler((PEXCEPTIONREGISTRATIONRECORD)pstRegRec );
  600.  
  601.   FncExitVoid();
  602.   }                                    // END(RegisterExceptionHandler)
  603.  
  604. /*************************************************************************/
  605. /* Function name      : ExHandler                                        */
  606. /*                                                                       */
  607. /* Description        : handles exceptions                               */
  608. /*                                                                       */
  609. /* Parameters         : pointer to EXCEPTIONREPORTRECORD                 */
  610. /*                      pointer to EXCEPTIONREGISTRATIONRECORD           */
  611. /*                      pointer to CONTEXTRECORD                         */
  612. /*                      pointer to VOID                                  */
  613. /*                                                                       */
  614. /* Return value       : XCPT_CONTINUE_SEARCH                             */
  615. /*                      XCPT_CONTINUE_EXECUTION                          */
  616. /*                                                                       */
  617. /*************************************************************************/
  618. #ifdef __IBMC__
  619. ULONG _System ExHandler( EXCEPTIONREPORTRECORD       *pExRep,
  620. #else
  621. ULONG _syscall ExHandler( EXCEPTIONREPORTRECORD       *pExRep,
  622. #endif
  623.                           EXCEPTIONREGISTRATIONRECORD *pExReg,
  624.                           CONTEXTRECORD               *pConRec,
  625.                           VOID                        *pDspCon )
  626.   {
  627.   PTIB     ptib;
  628.   PPIB     ppib;
  629.   PREGREC  pstRegRec = (PREGREC)pExReg;
  630.  
  631.   if ( pExRep->fHandlerFlags & EH_NESTED_CALL )
  632.     {
  633.     /*----------------------------------------------------------------*/
  634.     /* an exception is already in progress - don't do anything        */
  635.     /*----------------------------------------------------------------*/
  636.     goto FnExit;
  637.     }
  638.  
  639.   DosGetInfoBlocks(&ptib, &ppib);
  640.  
  641.   /*-------------------------------------------------------------------*/
  642.   /* identify the exception                                            */
  643.   /*-------------------------------------------------------------------*/
  644.   switch (pExRep-> ExceptionNum)
  645.     {
  646.     case XCPT_ACCESS_VIOLATION:
  647.     case XCPT_INTEGER_DIVIDE_BY_ZERO:
  648.     case XCPT_INTEGER_OVERFLOW:
  649.        /*--------------------------------------------------------------*/
  650.        /* unexpected Trap has occurred                                 */
  651.        /*--------------------------------------------------------------*/
  652.        longjmp(pstRegRec->pstUserExRec->jmp, pExRep->ExceptionNum);
  653.        break;
  654.  
  655.     default:
  656.        /*-------------------------------------------------------------*/
  657.        /* default handles rest                                        */
  658.        /*-------------------------------------------------------------*/
  659.        break;
  660.     }                                  // END(SWITCH)
  661.  
  662. FnExit:
  663.   return( XCPT_CONTINUE_SEARCH );
  664.   }                                    // ExHandler
  665.  
  666. /*----------------------------------------------------------------------*/
  667. /*                       Dialog - Procedures                            */
  668. /*----------------------------------------------------------------------*/
  669.  
  670. /************************************************************************/
  671. /* FUNCTION-NAME       : dlgpTest                                       */
  672. /*                                                                      */
  673. /* DESCRIPTION         : dialog procedure for test dialog.              */
  674. /*                       Gets the number of threads to start.           */
  675. /*                                                                      */
  676. /* PARAMETERS          : HWND of dialog                                 */
  677. /*                       ULONG message id                               */
  678. /*                       MPARAM parameter 1                             */
  679. /*                       MPARAM parameter 2                             */
  680. /*                                                                      */
  681. /* RETURN-VALUE        :                                                */
  682. /*                                                                      */
  683. /************************************************************************/
  684. static MRESULT EXPENTRY dlgpTest ( HWND    dialog,
  685.                                    ULONG   msg,
  686.                                    MPARAM  mp1,
  687.                                    MPARAM  mp2 )
  688.   {
  689.   switch(msg)
  690.     {
  691.     case WM_INITDLG:
  692.          SetText( dialog, FID_TITLEBAR, TEST_DLG_TITLE);
  693.          SetText( dialog, IDD_TESTDLG_ENTRY, "2" );
  694.          TX ( !WinSetWindowULong( dialog,
  695.                                   QWL_USER,
  696.                                   (ULONG) mp2 ) );
  697.          MiscCenterDialog(HWND_DESKTOP, dialog);
  698.          break;
  699.  
  700.     case WM_COMMAND:
  701.           switch (SHORT1FROMMP (mp1))
  702.             {
  703.             PSHORT   psNumThreads;
  704.  
  705.             case DID_OK:
  706.                 {
  707.                 psNumThreads = (PSHORT)WinQueryWindowULong( dialog,
  708.                                                             QWL_USER );
  709.                 TX( !WinQueryDlgItemShort( dialog,
  710.                                            IDD_TESTDLG_ENTRY,
  711.                                            psNumThreads,
  712.                                            FALSE ) );
  713.  
  714.                 TX(! WinDismissDlg (dialog, TRUE) );
  715.                 return ( (MRESULT) FALSE );
  716.                 break ;
  717.                 }
  718.  
  719.             case DID_CANCEL:
  720.                 psNumThreads = (PSHORT)WinQueryWindowULong( dialog,
  721.                                                             QWL_USER );
  722.                 *psNumThreads = 0;
  723.                 TX(! WinDismissDlg (dialog, FALSE) );
  724.                 return ( (MRESULT) FALSE );
  725.                 break ;
  726.             }
  727.           break ;
  728.  
  729.     default:
  730.        return ( WinDefDlgProc (dialog, msg, mp1, mp2) );
  731.     }
  732.  
  733.   return ( (MRESULT) 0 );
  734.  
  735.   } /* dlgpTest             */
  736.  
  737. /************************************************************************/
  738. /* FUNCTION-NAME       : dlgpAbout                                      */
  739. /*                                                                      */
  740. /* DESCRIPTION         : dialog procedure for about box                 */
  741. /*                                                                      */
  742. /* PARAMETERS          : HWND of dialog                                 */
  743. /*                       ULONG message id                               */
  744. /*                       MPARAM parameter 1                             */
  745. /*                       MPARAM parameter 2                             */
  746. /*                                                                      */
  747. /* RETURN-VALUE        :                                                */
  748. /*                                                                      */
  749. /************************************************************************/
  750. static MRESULT EXPENTRY dlgpAbout( HWND     hwnd,
  751.                                    ULONG    msg,
  752.                                    MPARAM   mp1,
  753.                                    MPARAM   mp2 )
  754.   {
  755.   switch(msg)
  756.     {
  757.     case WM_INITDLG:
  758.          MiscCenterDialog(HWND_DESKTOP,hwnd) ;
  759.          break;
  760.  
  761.     case WM_COMMAND:
  762.  
  763.           if (SHORT1FROMMP (mp1) == DID_OK)
  764.              {
  765.              TX(! WinDismissDlg (hwnd, TRUE) );
  766.              return (FALSE);
  767.              }
  768.           break ;
  769.  
  770.     default:
  771.        return WinDefDlgProc (hwnd, msg, mp1, mp2);
  772.     }
  773.  
  774.   return (FALSE);
  775.   }                                    /* END(dlgpAbout)        */
  776.  
  777. /************************************************************************/
  778. /*** EOF mtestpm.c                                                    ***/
  779. /************************************************************************/
  780.