home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / fpdemo.zip / MTFP.C < prev    next >
C/C++ Source or Header  |  1994-02-23  |  8KB  |  202 lines

  1. /*+-------------------------------------------------------------------------
  2.                             MTFP.C
  3.  ----------------------------------------------------------------------------
  4.      This program will register one Footprints process and use trace
  5.      id's 1-64 to register tracing for each of 64 threads.  Trace
  6.      id zero will be used to trace the main process.  To trace the
  7.      threads, the bits 1 to 64 must be turned on from the external
  8.      PM interface.  These may be written to a file so that they are
  9.      automatically on when the program starts up.
  10.  
  11.      Note:  you cannot recompile this file because you do not have
  12.      the headers, libraries, or DLL's required.  Those will come
  13.      when you order the product.
  14.  ------------------------------------------------------------------------*/
  15.  
  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include <string.h>
  19.  
  20. #define INCL_NOPMAPI
  21. #define INCL_BASE
  22. #include <os2.h>
  23.  
  24. #include "footprnt.h"
  25.  
  26. /*---------------
  27.     constants
  28.  ---------------*/
  29. #define MAX_THREADS 64
  30. #define FP_PROC_NAME "ScanT"
  31.  
  32. /*----------------
  33.     global vars
  34.  ----------------*/
  35. HFPHANDLE hfp;
  36.  
  37. /*---------------
  38.     structures
  39.  ---------------*/
  40. typedef struct _THREAD_WA
  41. {
  42.    char      szEyecatcher[16];
  43.    int       iThreadNo;
  44.    HFPHANDLE hfp;
  45.    HEV       hevTerm;
  46.    char      acDataArea[256];
  47. } THREAD_WA;
  48.  
  49. /*---------------
  50.     prototypes
  51.  ---------------*/
  52. void TermGracefully( void );
  53. void ScanThread( void *pV );
  54. void SimTCPIPRead( THREAD_WA *pT );
  55. void DebugLog( int iThread );
  56.  
  57. int main( int argc, char *argv[], char *envp[] )
  58. {
  59.    char szProcName[]="MulTdSim";
  60.    int  i;
  61.    THREAD_WA Twa[MAX_THREADS];
  62.    APIRET apiRC;
  63.    HEV   hevTerm;
  64.    FILE *fp;
  65.  
  66.    /*+-----------------------------------------------------------+
  67.      |  Call HfpInit to establish Footprints session             |
  68.      +-----------------------------------------------------------+*/
  69.    if( apiRC = HfpInit( szProcName, &hfp ))
  70.       printf("Bad return from HfpInit %d\n", apiRC );
  71.  
  72.    /*+--------------------------------------+
  73.      |  delete debug log                    |
  74.      +--------------------------------------+*/
  75.    if( ( fp = fopen( "debug.log", "w" ) ) == NULL )
  76.       printf("couldn't open debug log\n");
  77.    else
  78.       fclose( fp );
  79.  
  80.    if( apiRC = DosCreateEventSem( NULL, &hevTerm, 0L, FALSE))
  81.    {
  82.       printf("Can't create termination sem, rc = %d\n", apiRC );
  83.       return(1);
  84.    }
  85.    if(apiRC = DosExitList( EXLST_ADD, (PFNEXITLIST)TermGracefully ))
  86.       printf("Bad return from DosExitList %d\n", apiRC );
  87.    for( i=0; i<MAX_THREADS && i<99; i++ )
  88.    {
  89.       Twa[i].hevTerm = hevTerm;        /* give each thread sem handle */
  90.       Twa[i].hfp = hfp;                /* put handle in global area */
  91.  
  92.      /* put eyecatcher in data area (nice to look at big buffers this way)*/
  93.       sprintf( Twa[i].szEyecatcher, "ScanData%02d", i+1 );
  94.       Twa[i].iThreadNo = i+1;
  95.       _beginthread( ScanThread, NULL, 8192, (void *)&Twa[i] );
  96.    }
  97.    printf("Press <enter> to quit\n");
  98.    getchar();
  99.  
  100.    DosPostEventSem( hevTerm );
  101.    DosSleep( 500L ); /* give threads a chance to quit */
  102.    DosCloseEventSem( hevTerm );
  103.    DosExit( EXIT_PROCESS, 0 );
  104. } /* end main */
  105.  
  106. /*+---------------------------------------------------------------------+
  107.   |  The scan thread is called MAX_THREAD times.                        |
  108.   +---------------------------------------------------------------------+*/
  109. void ScanThread( void *pV )
  110. {
  111.    THREAD_WA *pT;
  112.    APIRET    apiRC;
  113.  
  114.    pT = (THREAD_WA *)pV;
  115.    /*+--------------------------------------------------------------------+
  116.      |  Call HfpTrace to record the thread work area.  Use 0 for the 5th  |
  117.      |  argument.  This will always get traced, since this is useful info |
  118.      |  Note that while this trace will always get captured, the only     |
  119.      |  way you'll know which thread it is is by looking at the actual    |
  120.      |  buffer contents.                                                  |
  121.      +--------------------------------------------------------------------+*/
  122.    HfpTrace( pT->hfp, pT, 20 , "TBegin", 0 );
  123.    while(1)
  124.    {
  125.       SimTCPIPRead( pT );
  126.       /*+-----------------------------------------------------------------+
  127.         |  Here, we pass the thread id number with the trace, so if you   |
  128.         |  want to isolate your tracing to only one thread, you can turn  |
  129.         |  only that trace id on.                                         |
  130.         +-----------------------------------------------------------------+*/
  131.       HfpTrace( pT->hfp, pT, sizeof(THREAD_WA), "RetBuf", pT->iThreadNo );
  132.       /*+-----------------------------------------------------------------+
  133.         |  Another thing to do, instead of the above command, if you      |
  134.         |  don't like to look at hex dumps, you can use the HfpIsItOn     |
  135.         |  function.  Then write your debugging info to a text file       |
  136.         |  that you or your user can read.  This is a good substitute     |
  137.         |  for the old #ifdef stuff where you have to recompile to get    |
  138.         |  a debugging log                                                |
  139.         +-----------------------------------------------------------------+*/
  140.       if( HfpIsItOn( pT->hfp, pT->iThreadNo ) )
  141.          DebugLog( pT->iThreadNo );
  142.       /*-------------------------------------------------------------
  143.           wait 500ms and continue looping until posted by main guy
  144.        -------------------------------------------------------------*/
  145.       if( (apiRC = DosWaitEventSem( pT->hevTerm, 500L )) == NO_ERROR )
  146.          _endthread();
  147.       else if( apiRC == ERROR_TIMEOUT )
  148.          ;
  149.       else
  150.       {
  151.          HfpTrace( pT->hfp, &apiRC, sizeof(apiRC), "SemErr", 0 );
  152.          _endthread();
  153.       }
  154.    }
  155. } /* end ScanThread */
  156.  
  157. void SimTCPIPRead( THREAD_WA *pT )
  158. {
  159.    char c;
  160.    char szString1[] = "Random Fill 1";
  161.    char szString2[] = "Random Fill 2";
  162.  
  163.    c = (char)rand();
  164.    memmove( pT->acDataArea, szString1, strlen(szString1) );
  165.    memset( &pT->acDataArea[strlen(szString1)], c, 128-strlen(szString1) );
  166.    c = (char)rand();
  167.    memmove( &pT->acDataArea[100], szString2, strlen(szString2) );
  168.    memset( &pT->acDataArea[128+strlen(szString2)], c, 128-strlen(szString2) );
  169.    return;
  170. }
  171.  
  172. /*+----------------------------------------------------------------------+
  173.   |  This is registered with DosExitList. It will terminate Footprints   |
  174.   +----------------------------------------------------------------------+*/
  175. void TermGracefully( void )
  176. {
  177.    int i;
  178.    APIRET apiRC;
  179.  
  180.    printf("Exit routine in control\n");
  181.    /*--------------------------------------------------------------
  182.        terminate Footprints so buffer in memory is flushed
  183.     --------------------------------------------------------------*/
  184.    apiRC = HfpTerm( hfp );
  185.    return;
  186. }
  187.  
  188. /*+-----------------------------------------------------------------------+
  189.   |  This is a debug log that you would use with the HfpIsItOn API call   |
  190.   +-----------------------------------------------------------------------+*/
  191. void DebugLog( int iThread )
  192. {
  193.    FILE *fp;
  194.  
  195.    if( ( fp = fopen( "debug.log", "a" ) ) == NULL )
  196.       return;
  197.    fprintf(fp, "Here's a bunch of debug info for thread %d\n", iThread );
  198.    fprintf(fp, "...debug info...\n" );
  199.    fclose( fp );
  200.    return;
  201. }
  202.