home *** CD-ROM | disk | FTP | other *** search
/ Inside Multimedia 1995 July / IMM0795.ISO / share / os2 / sysbench / src / pmb_main.c < prev    next >
C/C++ Source or Header  |  1994-11-05  |  33KB  |  1,084 lines

  1. // Sysbench main file
  2.  
  3. #define INCL_WIN
  4. #define INCL_GPI
  5. #include <os2.h>
  6. #include <time.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "types.h"
  11. #include "pmb.h"
  12. #include "pmb_bench.h"
  13. #include "pmb_datatype.h"
  14.  
  15. #define CLS_CLIENT   "SysBenchWindowClass"
  16. #define SYSB_VER     "0.9.0"
  17. #define THR_DONE     (WM_USER + 1)
  18. #define THR_UPDATE   (WM_USER + 2)
  19. #define START_STACKSIZE 65536
  20. #define DISP_LINES (56+19)
  21. #define MB           (1048576)
  22. #define KB            1024
  23. #define MN            1000000
  24.  
  25. // ********** IMPORTED FUNCTIONS
  26. extern int pmb_diskio_disksize(int nr);
  27. extern int pmb_diskio_nrdisks(void);
  28. extern void log(char* s);
  29.  
  30. // ********** EXPORTED FUNCTIONS
  31. void err(char* s);
  32. void InfoBox(char* s);
  33. void WarnBox(char* s);
  34. void ErrorBox(char* s);
  35.  
  36. // ********** LOCAL FUNCTIONS
  37. static void SetTitle(char* s);
  38. static void  UpdateWindow(HPS hpsPaint, PRECTL pRect, s32 scrollValue);
  39. static void Print(s32 row, s32 col, char* string, PRECTL pRect, 
  40.                   s32 scrollValue, HPS hpsPaint, s32 color);
  41. static void SetMenuState(bool active);
  42. static void UpdateAll(void);
  43. static void SaveResults(void);
  44. static void PrintFile(s32 newlines, s32 col, char* string, FILE* fp);
  45.  
  46. MRESULT EXPENTRY ClientWndProc ( HWND hwndWnd,
  47.    ULONG ulMsg,
  48.    MPARAM mpParm1,
  49.    MPARAM mpParm2 );
  50.  
  51. // ********** EXPORTED DATA
  52. double test_time;
  53. HWND   hwndFrame;
  54. HWND   hwndClient;
  55. HWND   hwndVertScroll;
  56. HWND   hwndMenu;
  57.  
  58. // ********** LOCAL DATA
  59. static bool thread_running;
  60. static s32  fontW;
  61. static s32  fontH;
  62. static HPS  mainHps;
  63. static HAB         habAnchor;
  64. static s32 scroll = 0;
  65. static s32 oldscroll = 0;
  66.  
  67. struct glob_data data = {
  68.   1,
  69.   1,
  70.   { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 },
  71.   {
  72.     { 
  73.       "Graphics", 
  74.       8,
  75.       {
  76.         { "BitBlt S->S cpy",  -1.0, MN, "Mpixels/s" },
  77.         { "BitBlt M->S cpy",  -1.0, MN, "Mpixels/s" },
  78.         { "Filled Rectangle", -1.0, MN, "Mpixels/s" },
  79.         { "Pattern Fill",     -1.0, MN, "Mpixels/s" },
  80.         { "Vertical Lines",   -1.0, MN, "Mpixels/s" },
  81.         { "Horizontal Lines", -1.0, MN, "Mpixels/s" },
  82.         { "Diagonal Lines",   -1.0, MN, "Mpixels/s" },
  83.         { "Text Render",      -1.0, MN, "Mpixels/s" }
  84.       },
  85.       -1.0,
  86.       "PM-marks"
  87.     },
  88.     {
  89.       "CPU integer",
  90.       4,
  91.       {
  92.         { "Dhrystone",      -1.0, MN, "VAX 11/780 MIPS" },
  93.         { "Hanoi",          -1.0, 1, "moves/25 usec" },
  94.         { "Heapsort",       -1.0, MN, "MIPS" },
  95.         { "Sieve",          -1.0, MN, "MIPS" }
  96.       },
  97.       -1.0,
  98.       "CPUint-marks"
  99.     },
  100.     {
  101.       "CPU float",
  102.       3,
  103.       {
  104.         { "Linpack",            -1.0, 1000, "MFLOPS" },
  105.         { "Flops",              -1.0, MN, "MFLOPS" },
  106.         { "Fast Fourier Tr.",   -1.0, 1, "VAX FFT's" }
  107.       },
  108.       -1.0,
  109.       "CPUfloat-marks"
  110.     },
  111.     {
  112.       "Direct Interface to video extensions - DIVE",
  113.       5,
  114.       {
  115.         { "Video bus bandw.",    -1.0, MB, "MB/s" },
  116.         { "DIVE fun",            -1.0, 1, "fps"  },
  117.         { "M->S, DD,   1.00:1",  -1.0, 1, "fps"  },
  118.         { "M->S, DD,   2.00:1",  -1.0, 1, "fps" },
  119.         { "M->S, DD,   2.43:1",  -1.0, 1, "fps" }
  120.       },
  121.       -1.0,
  122.       "DIVE-marks"
  123.     },
  124.     {
  125.       "Disk I/O",
  126.       2,
  127.       {
  128.         { "Average seek time",   -1.0, 1.0e-3, "ms" },
  129.         { "Transfer speed",      -1.0, MB, "MB/s" }
  130.       },
  131.       -1.0,
  132.       "DiskIO-marks"
  133.     },
  134.     {
  135.       "Memory",
  136.       27,
  137.       {
  138.         { "5    kB copy", -1.0, MB, "MB/s" },
  139.         { "10   kB copy", -1.0, MB, "MB/s" },
  140.         { "20   kB copy", -1.0, MB, "MB/s" },
  141.         { "40   kB copy", -1.0, MB, "MB/s" },
  142.         { "80   kB copy", -1.0, MB, "MB/s" },
  143.         { "160  kB copy", -1.0, MB, "MB/s" },
  144.         { "320  kB copy", -1.0, MB, "MB/s" },
  145.         { "640  kB copy", -1.0, MB, "MB/s" },
  146.         { "1280 kB copy", -1.0, MB, "MB/s" },
  147.         { "5    kB read", -1.0, MB, "MB/s" },
  148.         { "10   kB read", -1.0, MB, "MB/s" },
  149.         { "20   kB read", -1.0, MB, "MB/s" },
  150.         { "40   kB read", -1.0, MB, "MB/s" },
  151.         { "80   kB read", -1.0, MB, "MB/s" },
  152.         { "160  kB read", -1.0, MB, "MB/s" },
  153.         { "320  kB read", -1.0, MB, "MB/s" },
  154.         { "640  kB read", -1.0, MB, "MB/s" },
  155.         { "1280 kB read", -1.0, MB, "MB/s" },
  156.         { "5    kB write", -1.0, MB, "MB/s" },
  157.         { "10   kB write", -1.0, MB, "MB/s" },
  158.         { "20   kB write", -1.0, MB, "MB/s" },
  159.         { "40   kB write", -1.0, MB, "MB/s" },
  160.         { "80   kB write", -1.0, MB, "MB/s" },
  161.         { "160  kB write", -1.0, MB, "MB/s" },
  162.         { "320  kB write", -1.0, MB, "MB/s" },
  163.         { "640  kB write", -1.0, MB, "MB/s" },
  164.         { "1280 kB write", -1.0, MB, "MB/s" },
  165.       },
  166.       -1.0,
  167.       "Mem-marks"
  168.     }
  169.   }
  170. };
  171.  
  172.  
  173. INT main ( VOID )
  174. {
  175.       FATTRS      fat;
  176.       LONG        match;
  177.       FONTMETRICS fmMetrics ;
  178.   HMQ         hmqQueue;
  179.   ULONG       ulFlags;
  180.   BOOL        bLoop;
  181.   QMSG        qmMsg;
  182.   RECTL       rect;
  183.   s32         x,y,w,h, i;
  184.   MENUITEM    mi;
  185.   HWND        hwndPullDown;
  186.   CHAR        tmp[256];
  187.  
  188.   habAnchor = WinInitialize ( 0 );
  189.   hmqQueue = WinCreateMsgQueue ( habAnchor, 0 );
  190.  
  191.   WinRegisterClass ( habAnchor,
  192.                      CLS_CLIENT,
  193.                      ClientWndProc,
  194.                      CS_SYNCPAINT | CS_SIZEREDRAW,
  195.                      0 );
  196.  
  197.   ulFlags = FCF_TITLEBAR | FCF_SYSMENU | FCF_SIZEBORDER | FCF_MENU |
  198.             FCF_MINMAX | FCF_TASKLIST | FCF_NOBYTEALIGN | FCF_VERTSCROLL;
  199.  
  200.   hwndFrame = WinCreateStdWindow ( HWND_DESKTOP,
  201.                                    WS_VISIBLE,
  202.                                    &ulFlags,
  203.                                    CLS_CLIENT,
  204.                                    "SysBench " SYSB_VER,
  205.                                    0,
  206.                                    NULLHANDLE,
  207.                                    WND_MAIN,
  208.                                    &hwndClient );
  209.  
  210.   mainHps = WinGetPS(hwndClient);
  211.  
  212.   fat.usRecordLength = sizeof(FATTRS); /* sets size of structure   */
  213.   fat.fsSelection = 0;         /* uses default selection           */
  214.   fat.lMatch = 0L;             /* does not force match             */
  215.   fat.idRegistry = 0;          /* uses default registry            */
  216.   fat.usCodePage = 850;        /* code-page 850                    */
  217.   fat.lMaxBaselineExt = 12L;   /* requested font height is 12 pels */
  218.   fat.lAveCharWidth = 8L;     /* requested font width is 12 pels  */
  219.   fat.fsType = 0;              /* uses default type                */
  220.   fat.fsFontUse = FATTR_FONTUSE_NOMIX;/* doesn't mix with graphics */
  221.  
  222.   strcpy(fat.szFacename ,"System VIO");
  223.  
  224.   match = GpiCreateLogFont(mainHps,        /* presentation space               */
  225.                            NULL,       /* does not use logical font name   */
  226.                            1L,         /* local identifier                 */
  227.                            &fat);      /* structure with font attributes   */
  228.  
  229.   // match should now be 2 == FONT_MATCH */
  230.  
  231.   if (match != 2) {
  232.     log("Can't get the right font");
  233.     exit(1);
  234.   }
  235.  
  236.   GpiSetCharSet(mainHps, 1L);      /* sets font for presentation space */
  237.  
  238.   GpiQueryFontMetrics ( mainHps,
  239.                         sizeof ( fmMetrics ) ,
  240.                         &fmMetrics ) ;
  241.  
  242.   fontH = (14 * fmMetrics.lMaxBaselineExt)/10;
  243.   fontW = fmMetrics.lMaxCharInc;
  244.  
  245.   GpiSetBackMix( mainHps, BM_OVERPAINT );  // how it mixes,         
  246.   GpiSetMix( mainHps, FM_OVERPAINT );  // how it mixes,         
  247.  
  248.   hwndVertScroll = WinWindowFromID( hwndFrame, FID_VERTSCROLL);
  249.  
  250.   WinQueryWindowRect(HWND_DESKTOP, &rect);
  251.   w = 636;
  252.   h = (rect.yTop-rect.yBottom) - 40;
  253.   x = (rect.xRight-rect.xLeft)/2 - w/2;
  254.   y = 40;
  255.   WinSetWindowPos(hwndFrame, false, x, y, w, h, SWP_SIZE | SWP_MOVE | SWP_ACTIVATE);
  256.  
  257.   WinQueryWindowRect(hwndClient, &rect);
  258.  
  259.   WinSendMsg( hwndVertScroll,
  260.               SBM_SETSCROLLBAR,
  261.               MPFROMSHORT(0),
  262.               MPFROM2SHORT(0, (DISP_LINES * fontH) - (rect.yTop - rect.yBottom)));
  263.  
  264.   WinSendMsg( hwndVertScroll,
  265.               SBM_SETTHUMBSIZE,
  266.               MPFROM2SHORT(rect.yTop - rect.yBottom, DISP_LINES * fontH),
  267.               NULL);
  268.  
  269.   SetTitle("Ready");
  270.  
  271.   thread_running = false;
  272.  
  273.  
  274.   data.nr_fixed_disks = pmb_diskio_nrdisks();
  275.   if (data.nr_fixed_disks > MAX_FIXED_DISKS) {
  276.     log("Number of fixed disks is too high");
  277.     exit(1);
  278.   }
  279.  
  280.   for (i = 0; i < data.nr_fixed_disks; i++) {
  281.     data.fixed_disk_size[i] = pmb_diskio_disksize(i);
  282.     sprintf(tmp, "Disk %d: %d MB", i+1, data.fixed_disk_size[i]/(1000*1000));
  283.     hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
  284.     WinSendMsg(hwndMenu, MM_QUERYITEM, MPFROM2SHORT(MI_MENU_DISKIO_SELECT, TRUE), 
  285.                (MPARAM) &mi);  
  286.     hwndPullDown = mi.hwndSubMenu;
  287.     mi.iPosition = MIT_END;
  288.     mi.afStyle = MIS_TEXT;
  289.     mi.afAttribute = 0;
  290.     mi.id = MI_MENU_DISKIO_SELECT+1+i;
  291.     mi.hwndSubMenu = null;
  292.     mi.hItem = 0;
  293.     WinSendMsg(hwndPullDown, MM_INSERTITEM, (MPARAM) &mi,
  294.                (MPARAM)tmp);
  295.   }
  296.  
  297.   if (!data.nr_fixed_disks) {
  298.     hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
  299.     WinSendMsg(hwndMenu, MM_QUERYITEM, MPFROM2SHORT(MI_MENU_DISKIO_SELECT, TRUE), 
  300.                (MPARAM) &mi);  
  301.     hwndPullDown = mi.hwndSubMenu;
  302.     mi.iPosition = MIT_END;
  303.     mi.afStyle = MIS_TEXT;
  304.     mi.afAttribute = 0;
  305.     mi.id = MI_MENU_DISKIO_SELECT+1;
  306.     mi.hwndSubMenu = null;
  307.     mi.hItem = 0;
  308.     WinSendMsg(hwndPullDown, MM_INSERTITEM, (MPARAM) &mi,
  309.                (MPARAM)"No fixed disks found");
  310.  
  311.     WinEnableMenuItem(hwndMenu, MI_MENU_DISKIO, false);
  312.   } else {
  313.     hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
  314.     WinCheckMenuItem(hwndMenu, MI_MENU_DISKIO_SELECT + 1, true);
  315.     data.selected_disk = 0;
  316.     sprintf(data.c[comp_disk].title, "Disk I/O - disk %d: %d MB", data.selected_disk+1, data.fixed_disk_size[data.selected_disk]/(1000*1000));
  317.   }
  318.  
  319.   WinEnableMenuItem(hwndMenu, MI_MENU_DIVE, false);
  320.  
  321.   UpdateAll();
  322.  
  323.   if ( hwndFrame != NULLHANDLE ) {
  324.     bLoop = WinGetMsg ( habAnchor,
  325.                         &qmMsg,
  326.                         NULLHANDLE,
  327.                         0,
  328.                         0 );
  329.     while ( bLoop ) {
  330.        WinDispatchMsg ( habAnchor, &qmMsg );
  331.        bLoop = WinGetMsg ( habAnchor,
  332.                            &qmMsg,
  333.                            NULLHANDLE,
  334.                            0,
  335.                            0 );
  336.     }
  337.  
  338.     WinReleasePS(mainHps);
  339.     WinDestroyWindow ( hwndFrame );
  340.   }
  341.  
  342.   WinDestroyMsgQueue ( hmqQueue );
  343.   WinTerminate ( habAnchor );
  344.   return 0;
  345. }
  346.  
  347. MRESULT EXPENTRY ClientWndProc ( HWND hwndWnd,
  348.                                  ULONG ulMsg,
  349.                                  MPARAM mpParm1,
  350.                                  MPARAM mpParm2 )
  351. {
  352.   void *pv = null;
  353.   static bool initialized = false;
  354.   RECTL rect;
  355.   s32 tmp;
  356.   bool updateScroll;
  357.   QMSG qmsgPeek;
  358.   bool fDone;
  359.   char tmps[256];
  360.  
  361.   switch ( ulMsg ) {
  362.  
  363.   case WM_COMMAND:
  364.  
  365.     if (thread_running) {
  366.       switch (SHORT1FROMMP(mpParm1)) {
  367.       case MI_PROJ_QUIT:
  368.         WinPostMsg(hwndWnd, WM_CLOSE, NULL, NULL);
  369.         break;
  370.       case MI_PROJ_ABOUT:
  371.         InfoBox("SysBench "SYSB_VER" by Henrik Harmsen 1994-10-01.\nEmail: harmsen@eritel.se\n"
  372.                 "Thanks to Kai Uwe Rommel for the disk IO tests, and Al Aburto for the CPU tests.");
  373.         break;
  374.       }
  375.       return false;
  376.     }
  377.  
  378.     if ((SHORT1FROMMP(mpParm1) > MI_MENU_DISKIO_SELECT) && 
  379.         (SHORT1FROMMP(mpParm1) <= (data.nr_fixed_disks + MI_MENU_DISKIO_SELECT))) {
  380.       s32 i, disk;
  381.       disk = SHORT1FROMMP(mpParm1) - (MI_MENU_DISKIO_SELECT + 1);
  382.       if (disk == data.selected_disk) 
  383.         return false;
  384.       data.selected_disk = disk;
  385.       for (i = 0; i < data.nr_fixed_disks; i++) {
  386.         WinCheckMenuItem(hwndMenu, MI_MENU_DISKIO_SELECT + i + 1, false);
  387.       }
  388.       WinCheckMenuItem(hwndMenu, MI_MENU_DISKIO_SELECT + data.selected_disk + 1, true);
  389.       sprintf(data.c[comp_disk].title, "Disk I/O - disk %d: %d MB", data.selected_disk+1, data.fixed_disk_size[data.selected_disk]/(1000*1000));
  390.       data.c[comp_disk].datalines[disk_avseek].value = -1.0;
  391.       data.c[comp_disk].datalines[disk_transf].value = -1.0;
  392.       data.c[comp_disk].total = -1.0;
  393.       UpdateAll();
  394.       return false;
  395.     }
  396.  
  397.     switch (SHORT1FROMMP(mpParm1)) {
  398.     case MI_PROJ_QUIT:
  399.       WinPostMsg(hwndWnd, WM_CLOSE, NULL, NULL);
  400.       break;
  401.     case MI_PROJ_ABOUT:
  402.         InfoBox("SysBench "SYSB_VER" by Henrik Harmsen 1994-10-01.\nEmail: harmsen@eritel.se\n"
  403.                 "\nThanks to Kai Uwe Rommel for the disk IO tests, and Al Aburto for the CPU tests.");
  404.       break;
  405.     case MI_PROJ_SAVE:
  406.       SaveResults();
  407.       break;
  408.     case MI_PROJ_ALL:
  409.       SetTitle("Running All tests");
  410.       SetMenuState(false);
  411.       _beginthread(DoAll, null, START_STACKSIZE, pv);
  412.       break;
  413.     case MI_GFX_BITBLIT_SS:
  414.       SetTitle("Running BitBlit S->S");
  415.       SetMenuState(false);
  416.       _beginthread(DoGfxBlitBlitSS, null, START_STACKSIZE, pv);
  417.       break;
  418.     case MI_GFX_BITBLIT_MS:
  419.       SetTitle("Running BitBlit M->S");
  420.       SetMenuState(false);
  421.       _beginthread(DoGfxBlitBlitMS, null, START_STACKSIZE, pv);
  422.       break;
  423.     case MI_GFX_FILLRECT:
  424.       SetTitle("Running Filled Rectangle");
  425.       SetMenuState(false);
  426.       _beginthread(DoGfxFillRect, null, START_STACKSIZE, pv);
  427.       break;
  428.     case MI_GFX_PATFIL:
  429.       SetTitle("Running Pattern Fill");
  430.       SetMenuState(false);
  431.       _beginthread(DoGfxPatFil, null, START_STACKSIZE, pv);
  432.       break;
  433.     case MI_GFX_VLINES:
  434.       SetTitle("Running VerticalLines");
  435.       SetMenuState(false);
  436.       _beginthread(DoGfxVLines, null, START_STACKSIZE, pv);
  437.       break;
  438.     case MI_GFX_HLINES:
  439.       SetTitle("Running HorizontalLines");
  440.       SetMenuState(false);
  441.       _beginthread(DoGfxHLines, null, START_STACKSIZE, pv);
  442.       break;
  443.     case MI_GFX_DLINES:
  444.       SetTitle("Running DiagonalLines");
  445.       SetMenuState(false);
  446.       _beginthread(DoGfxDLines, null, START_STACKSIZE, pv);
  447.       break;
  448.     case MI_GFX_TEXTRENDER:
  449.       SetTitle("Running TextRender");
  450.       SetMenuState(false);
  451.       _beginthread(DoGfxTextRender, null, START_STACKSIZE, pv);
  452.       break;
  453.     case MI_GFX_ALL:
  454.       SetTitle("Running All Graphics tests");
  455.       SetMenuState(false);
  456.       _beginthread(DoAllGraphics, null, START_STACKSIZE, pv);
  457.       break;
  458.     case MI_CPUINT_DHRY:
  459.       SetTitle("Running Dhrystone");
  460.       SetMenuState(false);
  461.       _beginthread(DoCPUIntDhry, null, START_STACKSIZE, pv);
  462.       break;
  463.     case MI_CPUINT_HANOI:
  464.       SetTitle("Running Hanoi");
  465.       SetMenuState(false);
  466.       _beginthread(DoCPUIntHanoi, null, START_STACKSIZE, pv);
  467.       break;
  468.     case MI_CPUINT_HEAPS:
  469.       SetTitle("Running Heapsort");
  470.       SetMenuState(false);
  471.       _beginthread(DoCPUIntHeaps, null, START_STACKSIZE, pv);
  472.       break;
  473.     case MI_CPUINT_SIEVE:
  474.       SetTitle("Running Sieve");
  475.       SetMenuState(false);
  476.       _beginthread(DoCPUIntSieve, null, START_STACKSIZE, pv);
  477.       break;
  478.     case MI_CPUINT_ALL:
  479.       SetTitle("Running All CPU integer tests");
  480.       SetMenuState(false);
  481.       _beginthread(DoAllCPUInt, null, START_STACKSIZE, pv);
  482.       break;
  483.     case MI_CPUFLOAT_LINPACK:
  484.       SetTitle("Running Linpack");
  485.       SetMenuState(false);
  486.       _beginthread(DoCPUFloatLinpack, null, START_STACKSIZE, pv);
  487.       break;
  488.     case MI_CPUFLOAT_FLOPS:
  489.       SetTitle("Running FLOPS");
  490.       SetMenuState(false);
  491.       _beginthread(DoCPUFloatFlops, null, START_STACKSIZE, pv);
  492.       break;
  493.     case MI_CPUFLOAT_FFT:
  494.       SetTitle("Running FFT");
  495.       SetMenuState(false);
  496.       _beginthread(DoCPUFloatFFT, null, START_STACKSIZE, pv);
  497.       break;
  498.     case MI_CPUFLOAT_ALL:
  499.       SetTitle("Running All CPU float tests");
  500.       SetMenuState(false);
  501.       _beginthread(DoAllCPUFloat, null, START_STACKSIZE, pv);
  502.       break;
  503.     case MI_MEM_5:
  504.       SetTitle("Running Memcopy 5kB");
  505.       SetMenuState(false);
  506.       _beginthread(DoMem5, null, START_STACKSIZE, pv);
  507.       break;
  508.     case MI_MEM_10:
  509.       SetTitle("Running Memcopy 10kB");
  510.       SetMenuState(false);
  511.       _beginthread(DoMem10, null, START_STACKSIZE, pv);
  512.       break;
  513.     case MI_MEM_20:
  514.       SetTitle("Running Memcopy 20kB");
  515.       SetMenuState(false);
  516.       _beginthread(DoMem20, null, START_STACKSIZE, pv);
  517.       break;
  518.     case MI_MEM_40:
  519.       SetTitle("Running Memcopy 40kB");
  520.       SetMenuState(false);
  521.       _beginthread(DoMem40, null, START_STACKSIZE, pv);
  522.       break;
  523.     case MI_MEM_80:
  524.       SetTitle("Running Memcopy 80kB");
  525.       SetMenuState(false);
  526.       _beginthread(DoMem80, null, START_STACKSIZE, pv);
  527.       break;
  528.     case MI_MEM_160:
  529.       SetTitle("Running Memcopy 160kB");
  530.       SetMenuState(false);
  531.       _beginthread(DoMem160, null, START_STACKSIZE, pv);
  532.       break;
  533.     case MI_MEM_320:
  534.       SetTitle("Running Memcopy 320kB");
  535.       SetMenuState(false);
  536.       _beginthread(DoMem320, null, START_STACKSIZE, pv);
  537.       break;
  538.     case MI_MEM_640:
  539.       SetTitle("Running Memcopy 640kB");
  540.       SetMenuState(false);
  541.       _beginthread(DoMem640, null, START_STACKSIZE, pv);
  542.       break;
  543.     case MI_MEM_1280:
  544.       SetTitle("Running Memcopy 1280kB");
  545.       SetMenuState(false);
  546.       _beginthread(DoMem1280, null, START_STACKSIZE, pv);
  547.       break;
  548.     case MI_MEMR_5:
  549.       SetTitle("Running Memory Read 5kB");
  550.       SetMenuState(false);
  551.       _beginthread(DoMemR5, null, START_STACKSIZE, pv);
  552.       break;
  553.     case MI_MEMR_10:
  554.       SetTitle("Running Memory Read 10kB");
  555.       SetMenuState(false);
  556.       _beginthread(DoMemR10, null, START_STACKSIZE, pv);
  557.       break;
  558.     case MI_MEMR_20:
  559.       SetTitle("Running Memory Read 20kB");
  560.       SetMenuState(false);
  561.       _beginthread(DoMemR20, null, START_STACKSIZE, pv);
  562.       break;
  563.     case MI_MEMR_40:
  564.       SetTitle("Running Memory Read 40kB");
  565.       SetMenuState(false);
  566.       _beginthread(DoMemR40, null, START_STACKSIZE, pv);
  567.       break;
  568.     case MI_MEMR_80:
  569.       SetTitle("Running Memory Read 80kB");
  570.       SetMenuState(false);
  571.       _beginthread(DoMemR80, null, START_STACKSIZE, pv);
  572.       break;
  573.     case MI_MEMR_160:
  574.       SetTitle("Running Memory Read 160kB");
  575.       SetMenuState(false);
  576.       _beginthread(DoMemR160, null, START_STACKSIZE, pv);
  577.       break;
  578.     case MI_MEMR_320:
  579.       SetTitle("Running Memory Read 320kB");
  580.       SetMenuState(false);
  581.       _beginthread(DoMemR320, null, START_STACKSIZE, pv);
  582.       break;
  583.     case MI_MEMR_640:
  584.       SetTitle("Running Memory Read 640kB");
  585.       SetMenuState(false);
  586.       _beginthread(DoMemR640, null, START_STACKSIZE, pv);
  587.       break;
  588.     case MI_MEMR_1280:
  589.       SetTitle("Running Memory Read 1280kB");
  590.       SetMenuState(false);
  591.       _beginthread(DoMemR1280, null, START_STACKSIZE, pv);
  592.       break;
  593.     case MI_MEMW_5:
  594.       SetTitle("Running Memory Write 5kB");
  595.       SetMenuState(false);
  596.       _beginthread(DoMemW5, null, START_STACKSIZE, pv);
  597.       break;
  598.     case MI_MEMW_10:
  599.       SetTitle("Running Memory Write 10kB");
  600.       SetMenuState(false);
  601.       _beginthread(DoMemW10, null, START_STACKSIZE, pv);
  602.       break;
  603.     case MI_MEMW_20:
  604.       SetTitle("Running Memory Write 20kB");
  605.       SetMenuState(false);
  606.       _beginthread(DoMemW20, null, START_STACKSIZE, pv);
  607.       break;
  608.     case MI_MEMW_40:
  609.       SetTitle("Running Memory Write 40kB");
  610.       SetMenuState(false);
  611.       _beginthread(DoMemW40, null, START_STACKSIZE, pv);
  612.       break;
  613.     case MI_MEMW_80:
  614.       SetTitle("Running Memory Write 80kB");
  615.       SetMenuState(false);
  616.       _beginthread(DoMemW80, null, START_STACKSIZE, pv);
  617.       break;
  618.     case MI_MEMW_160:
  619.       SetTitle("Running Memory Write 160kB");
  620.       SetMenuState(false);
  621.       _beginthread(DoMemW160, null, START_STACKSIZE, pv);
  622.       break;
  623.     case MI_MEMW_320:
  624.       SetTitle("Running Memory Write 320kB");
  625.       SetMenuState(false);
  626.       _beginthread(DoMemW320, null, START_STACKSIZE, pv);
  627.       break;
  628.     case MI_MEMW_640:
  629.       SetTitle("Running Memory Write 640kB");
  630.       SetMenuState(false);
  631.       _beginthread(DoMemW640, null, START_STACKSIZE, pv);
  632.       break;
  633.     case MI_MEMW_1280:
  634.       SetTitle("Running Memory Write 1280kB");
  635.       SetMenuState(false);
  636.       _beginthread(DoMemW1280, null, START_STACKSIZE, pv);
  637.       break;
  638.     case MI_MEM_ALL:
  639.       SetTitle("Running All Memory tests");
  640.       SetMenuState(false);
  641.       _beginthread(DoAllMem, null, START_STACKSIZE, pv);
  642.       break;
  643.     case MI_DIVE_VIDEO_BW:
  644.       SetTitle("Running Video Bandwidth");
  645.       SetMenuState(false);
  646.       _beginthread(DoDiveVBW, null, START_STACKSIZE, pv);
  647.       break;
  648.     case MI_DIVE_ROTATE_SCREEN:
  649.       SetTitle("Running DIVE fun");
  650.       SetMenuState(false);
  651.       _beginthread(DoDiveRot, null, START_STACKSIZE, pv);
  652.       break;
  653.     case MI_DIVE_MS_11:
  654.       SetTitle("Running DIVE M->S 1:1");
  655.       SetMenuState(false);
  656.       _beginthread(DoDiveMS11, null, START_STACKSIZE, pv);
  657.       break;
  658.     case MI_DIVE_MS_12:
  659.       SetTitle("Running DIVE M->S 2:1");
  660.       SetMenuState(false);
  661.       _beginthread(DoDiveMS12, null, START_STACKSIZE, pv);
  662.       break;
  663.     case MI_DIVE_MS_125:
  664.       SetTitle("Running DIVE M->S 2.43:1");
  665.       SetMenuState(false);
  666.       _beginthread(DoDiveMS125, null, START_STACKSIZE, pv);
  667.       break;
  668.     case MI_DIVE_ALL:
  669.       SetTitle("Running All DIVE tests");
  670.       SetMenuState(false);
  671.       _beginthread(DoAllDIVE, null, START_STACKSIZE, pv);
  672.       break;
  673.     case MI_DISKIO_AVSEEK:
  674.       SetTitle("Running Average Seek Time");
  675.       SetMenuState(false);
  676.       _beginthread(DoDiskIOAvSeek, null, START_STACKSIZE, pv);
  677.       break;
  678.     case MI_DISKIO_TRANS_SPEED:
  679.       SetTitle("Running Max. transfer speed");
  680.       SetMenuState(false);
  681.       _beginthread(DoDiskIOTransSpeed, null, START_STACKSIZE, pv);
  682.       break;
  683.     case MI_DISKIO_ALL:
  684.       SetTitle("Running All disk IO tests");
  685.       SetMenuState(false);
  686.       _beginthread(DoAllDiskIO, null, START_STACKSIZE, pv);
  687.       break;
  688.     }
  689.     break;
  690.  
  691.   case WM_PAINT:
  692.     {
  693.       FATTRS      fat;
  694.       LONG        match;
  695.       FONTMETRICS fmMetrics ;
  696.       HPS               hpsPaint ;
  697.       RECTL             rclRect ;
  698.       RECTL             rclWindow ;
  699.       ULONG             ulCharHeight ;
  700.       HWND              hwndEnum ;
  701.       HWND              hwndFrame ;
  702.       HENUM             heEnum ;
  703.       POINTL            point;
  704.       HRGN              newHrgn, oldHrgn, dummy;
  705.       s32               complexity;
  706.       RECTL             clipRect;
  707.  
  708.       if (!initialized) {
  709.         initialized = true;
  710.       }
  711.  
  712.       hpsPaint = WinBeginPaint ( hwndWnd,
  713.                                  NULLHANDLE,
  714.                                  &rclRect ) ;
  715.  
  716. // This should work, but there was a bug in Warp II
  717. //      newHrgn = GpiQueryClipRegion(hpsPaint);
  718. //      complexity = GpiSetClipRegion(mainHps, newHrgn, &oldHrgn);
  719. //      WinEndPaint(hpsPaint);
  720.  
  721.       GpiQueryClipBox(hpsPaint, &clipRect);
  722.       clipRect.xRight++;
  723.       clipRect.yTop++;
  724.       newHrgn = GpiCreateRegion(mainHps, 1, &clipRect);
  725.       GpiSetClipRegion(mainHps, newHrgn, &oldHrgn);
  726.       if (NULLHANDLE != oldHrgn) {
  727.         GpiDestroyRegion(mainHps, oldHrgn);
  728.       }
  729.  
  730.       WinFillRect(mainHps, &rclRect, CLR_BLACK);
  731.  
  732.       WinQueryWindowRect ( hwndWnd, &rclWindow );
  733.       UpdateWindow(mainHps,
  734.                    &rclWindow,
  735.                    scroll);
  736.  
  737.       oldscroll = scroll;
  738.       WinEndPaint(hpsPaint);
  739.     }
  740.     break;
  741.  
  742.   case THR_DONE:
  743.     SetTitle("Ready");
  744.     SetMenuState(true);
  745.     thread_running = false;
  746.     break;
  747.  
  748.   case THR_UPDATE:
  749.     UpdateAll();
  750.     break;
  751.  
  752.   case WM_SIZE:
  753.     { 
  754.       s32 tmp;
  755.  
  756.       WinQueryWindowRect(hwndClient, &rect);
  757.  
  758.       tmp = DISP_LINES * fontH - (rect.yTop - rect.yBottom);
  759.  
  760.       if (tmp < 0) tmp = 0;
  761.       if (scroll > tmp) scroll = tmp;
  762.  
  763.       WinSendMsg( hwndVertScroll,
  764.                   SBM_SETSCROLLBAR,
  765.                   MPFROMSHORT(scroll),
  766.                   MPFROM2SHORT(0, tmp));
  767.  
  768.       WinSendMsg( hwndVertScroll,
  769.                   SBM_SETTHUMBSIZE,
  770.                   MPFROM2SHORT(rect.yTop - rect.yBottom, DISP_LINES * fontH),
  771.                   NULL);
  772.  
  773.     }
  774.     break;
  775.  
  776.   case WM_VSCROLL:
  777.     updateScroll = false;
  778.     WinQueryWindowRect(hwndClient, &rect);
  779.     switch( SHORT2FROMMP( mpParm2) )
  780.     {
  781.     case SB_LINEUP:
  782.       scroll -= fontH;
  783.       updateScroll = true;;
  784.       break;
  785.     case SB_LINEDOWN:
  786.       scroll += fontH;
  787.       updateScroll = true;;
  788.       break;
  789.     case SB_PAGEUP:
  790.       scroll -= rect.yTop-rect.yBottom;
  791.       updateScroll = true;;
  792.       break;
  793.     case SB_PAGEDOWN:
  794.       scroll += rect.yTop-rect.yBottom;
  795.       updateScroll = true;;
  796.       break;
  797.     case SB_SLIDERTRACK:
  798.     case SB_SLIDERPOSITION:
  799.       scroll = SHORT1FROMMP( mpParm2);
  800.                /*(USHORT) WinSendMsg(hwndVertScroll,
  801.                 SBM_QUERYPOS, (MPARAM) NULL, (MPARAM) NULL);*/
  802.       break;
  803.     case SB_ENDSCROLL:
  804.       break;
  805.     default:
  806.       break;
  807.     }
  808.  
  809.     if (updateScroll) {
  810.       WinQueryWindowRect(hwndClient, &rect);
  811.       tmp = DISP_LINES * fontH - (rect.yTop - rect.yBottom);
  812.       if (tmp < 0) tmp = 0;
  813.       if (scroll > tmp) scroll = tmp;
  814.       WinSendMsg( hwndVertScroll,
  815.                   SBM_SETSCROLLBAR,
  816.                   MPFROMSHORT(scroll),
  817.                   MPFROM2SHORT(0, tmp));
  818.       WinSendMsg( hwndVertScroll,
  819.                   SBM_SETTHUMBSIZE,
  820.                   MPFROM2SHORT(rect.yTop - rect.yBottom, DISP_LINES * fontH),
  821.                   NULL);
  822.     }
  823.  
  824.     tmp = DISP_LINES * fontH - (rect.yTop - rect.yBottom);
  825.     if (scroll > tmp) scroll = tmp;
  826.     if (scroll < 0) scroll = 0;
  827.  
  828.     WinScrollWindow(hwndClient, 0, scroll-oldscroll, NULL, NULL, NULLHANDLE, NULL, SW_INVALIDATERGN);
  829.     break;
  830.  
  831.   case WM_ERASEBACKGROUND:
  832.     return MRFROMSHORT ( false );  // No, we'll do this ourselves
  833.  
  834.   default:
  835.     return WinDefWindowProc ( hwndWnd,
  836.                               ulMsg,
  837.                               mpParm1,
  838.                               mpParm2 );
  839.   }
  840.  
  841.   return MRFROMSHORT ( FALSE );
  842. }
  843.  
  844. void 
  845. PostFin(int onlyupdate) {
  846.   if (onlyupdate) {
  847.     WinPostMsg(hwndClient, THR_UPDATE, NULL, NULL);
  848.   } else {
  849.     WinPostMsg(hwndClient, THR_DONE, NULL, NULL);
  850.   }
  851. }
  852.  
  853. void err(char* s) {
  854.   log(s);
  855.   ErrorBox(s);
  856.   exit(1);
  857. }
  858.  
  859. void warn(char* s) {
  860.   WarnBox(s);
  861. }
  862.  
  863. static void 
  864. SetTitle(char* s) {
  865.   char tmp[100];
  866.   sprintf(tmp, "SysBench %s - %s", SYSB_VER, s);
  867.   WinSetWindowText(hwndFrame, tmp);
  868. }
  869.  
  870. static void 
  871. UpdateWindow(HPS hpsPaint, PRECTL pRect, s32 scrollValue) {
  872.   static char tmp[256];
  873.   s32 i, comp;
  874.   s32 line = 0;
  875.  
  876.   // print header
  877.  
  878.   line++;
  879. //  line++;
  880.  
  881.   for (comp = 0; comp < NUM_COMPONENTS; comp++) {
  882.     // print title
  883.     Print(line, 1, data.c[comp].title, pRect, scrollValue, hpsPaint, CLR_GREEN);
  884.     line++;
  885.     // print lines of data
  886.     for (i = 0; i < data.c[comp].ndatalines; i++) {
  887.       if (data.c[comp].datalines[i].value < 0.0)
  888.         sprintf(tmp, "%-21s :       --.---    %s", data.c[comp].datalines[i].entry, 
  889.                 data.c[comp].datalines[i].unit);
  890.       else
  891.         sprintf(tmp, "%-21s : %12.3f    %s", data.c[comp].datalines[i].entry, 
  892.                 data.c[comp].datalines[i].value / data.c[comp].datalines[i].unit_val, 
  893.                 data.c[comp].datalines[i].unit);
  894.       Print(line, 3, tmp, pRect, scrollValue, hpsPaint, CLR_WHITE);
  895.       line++;
  896.     }
  897.     Print(line, 3, "────────────────────────────────────────────────────────────", pRect, scrollValue, hpsPaint, CLR_PALEGRAY);
  898.     line++;
  899.     if (data.c[comp].total < 0.0)
  900.       sprintf(tmp, "Total                 :       --.---    %s", 
  901.               data.c[comp].unit_total);
  902.     else
  903.       sprintf(tmp, "Total                 : %12.3f    %s", data.c[comp].total, 
  904.               data.c[comp].unit_total);
  905.     Print(line, 3, tmp, pRect, scrollValue, hpsPaint, CLR_YELLOW);
  906.     line++;
  907.     line++;
  908.   }
  909. }
  910.  
  911. static void
  912. Print(s32 row, s32 col, char* string, PRECTL pRect, s32 scrollValue, HPS hpsPaint, s32 color) {
  913.   RECTL printRect;
  914.  
  915.   printRect.xLeft = col * fontW;
  916.   printRect.xRight = pRect->xRight;
  917.   printRect.yTop = pRect->yTop - row * fontH + scrollValue;
  918.   printRect.yBottom = printRect.yTop - fontH;
  919.  
  920.   WinDrawText(hpsPaint, -1, (PCH)string, &printRect, color, CLR_BLACK, DT_TOP | DT_LEFT);
  921. }
  922.  
  923. static void
  924. PrintFile(s32 newlines, s32 col, char* string, FILE* fp) {
  925.   s32 i;
  926.   for (i = 0; i < col; i++)
  927.     fprintf(fp, " ");
  928.  
  929.   fprintf(fp, "%s", string);
  930.  
  931.   for (i = 0; i < newlines; i++)
  932.     fprintf(fp, "\n");
  933. }
  934.  
  935. void
  936. InfoBox(char* s) {
  937.   WinMessageBox(HWND_DESKTOP,
  938.                 hwndFrame,
  939.                 s,
  940.                 "Info",
  941.                 WND_MESSAGEB,
  942.                 MB_OK | MB_INFORMATION | MB_APPLMODAL | MB_MOVEABLE);
  943. }
  944.  
  945.  
  946. void
  947. ErrorBox(char* s) {
  948.   WinMessageBox(HWND_DESKTOP,
  949.                 hwndFrame,
  950.                 s,
  951.                 "Error !",
  952.                 WND_MESSAGEB,
  953.                 MB_OK | MB_ERROR | MB_APPLMODAL | MB_MOVEABLE);
  954. }
  955.  
  956.  
  957. void
  958. WarnBox(char* s) {
  959.   WinMessageBox(HWND_DESKTOP,
  960.                 hwndFrame,
  961.                 s,
  962.                 "Warning !",
  963.                 WND_MESSAGEB,
  964.                 MB_OK | MB_WARNING | MB_APPLMODAL | MB_MOVEABLE);
  965. }
  966.  
  967. void
  968. UpdateAll(void) {
  969.   RECTL rclWindow, cliprect;
  970.   HRGN  newHrgn, oldHrgn, dummy;
  971.   s32 i, comp;
  972.   bool calcav = true;
  973.  
  974.  
  975.   // calculate averages
  976.   for (comp = 0; comp < NUM_COMPONENTS; comp++) {
  977.     calcav = true;
  978.     for (i = 0; i < data.c[comp].ndatalines; i++) {
  979.       calcav = calcav && (data.c[comp].datalines[i].value >= 0.0);
  980.     }
  981.     if (!calcav)
  982.       continue;
  983.     switch (comp) {
  984.     case comp_gfx:
  985.       data.c[comp_gfx].total = CalcGfxAv();
  986.       break;
  987.     case comp_cpuint:
  988.       data.c[comp_cpuint].total = CalcCPUIntAv();
  989.       break;
  990.     case comp_cpufloat:
  991.       data.c[comp_cpufloat].total = CalcCPUFloatAv();
  992.       break;
  993.     case comp_mem:
  994.       data.c[comp_mem].total = CalcMemAv();
  995.       break;
  996.     case comp_dive:
  997.       data.c[comp_dive].total = CalcDIVEAv();
  998.       break;
  999.     case comp_disk:
  1000.       data.c[comp_disk].total = CalcDiskIOAv();
  1001.       break;
  1002.     }
  1003.   }
  1004.  
  1005.   // update screen
  1006.   WinQueryWindowRect ( hwndClient, &rclWindow ); // update whole window
  1007.   cliprect.xLeft = rclWindow.xLeft;
  1008.   cliprect.xRight = rclWindow.xRight+1;
  1009.   cliprect.yBottom = rclWindow.yBottom;
  1010.   cliprect.yTop = rclWindow.yTop+1;
  1011.   newHrgn = GpiCreateRegion(mainHps, 1, &cliprect);
  1012.   GpiSetClipRegion(mainHps, newHrgn, &oldHrgn);
  1013.   if (NULLHANDLE != oldHrgn)
  1014.     GpiDestroyRegion(mainHps, oldHrgn);
  1015.   UpdateWindow(mainHps, &rclWindow, scroll);
  1016.   oldscroll = scroll;
  1017. }
  1018.  
  1019. static void SetMenuState(bool active) { // if active == true => all items enabled
  1020.                                         // otherw. all items but the about and close are disabled
  1021.   WinEnableMenuItem(hwndMenu, MI_PROJ_SAVE, active);
  1022.   WinEnableMenuItem(hwndMenu, MI_PROJ_ALL, active);
  1023.   WinEnableMenuItem(hwndMenu, MI_MENU_GFX, active);
  1024.   WinEnableMenuItem(hwndMenu, MI_MENU_CPUINT, active);
  1025.   WinEnableMenuItem(hwndMenu, MI_MENU_CPUFLOAT, active);
  1026.   WinEnableMenuItem(hwndMenu, MI_MENU_MEM, active);
  1027.   WinEnableMenuItem(hwndMenu, MI_MENU_DIVE, false);
  1028.   if (data.nr_fixed_disks)
  1029.     WinEnableMenuItem(hwndMenu, MI_MENU_DISKIO, active);
  1030. }
  1031.  
  1032.  
  1033. static void SaveResults(void) {
  1034.   FILE* fp;
  1035.   static char tmp[256];
  1036.   s32 i, comp;
  1037.   struct tm *newtime;
  1038.   time_t ltime;
  1039.  
  1040.  
  1041.  
  1042.   // print header
  1043.  
  1044.   fp = fopen("result.txt", "wb");
  1045.   if (!fp) {
  1046.     WarnBox("Cannot open file result.txt for output");
  1047.     return;
  1048.   }
  1049.  
  1050.   time(<ime);
  1051.   newtime = localtime(<ime);
  1052.   fprintf(fp, "\n\nSysbench " SYSB_VER " result file created %s\n\n", asctime(newtime));
  1053.  
  1054.   for (comp = 0; comp < NUM_COMPONENTS; comp++) {
  1055.     // print title
  1056.     PrintFile(1, 1, data.c[comp].title, fp);
  1057.     // print lines of data
  1058.     for (i = 0; i < data.c[comp].ndatalines; i++) {
  1059.       if (data.c[comp].datalines[i].value < 0.0)
  1060.         sprintf(tmp, "%-21s :       --.---    %s", data.c[comp].datalines[i].entry, 
  1061.                 data.c[comp].datalines[i].unit);
  1062.       else
  1063.         sprintf(tmp, "%-21s : %12.3f    %s", data.c[comp].datalines[i].entry, 
  1064.                 data.c[comp].datalines[i].value / data.c[comp].datalines[i].unit_val, 
  1065.                 data.c[comp].datalines[i].unit);
  1066.       PrintFile(1, 3, tmp, fp);
  1067.     }
  1068. //  PrintFile(1, 3, "────────────────────────────────────────────────────────────", fp);
  1069.     PrintFile(1, 3, "------------------------------------------------------------", fp);
  1070.     if (data.c[comp].total < 0.0)
  1071.       sprintf(tmp, "Total                 :       --.---    %s", 
  1072.               data.c[comp].unit_total);
  1073.     else
  1074.       sprintf(tmp, "Total                 : %12.3f    %s", data.c[comp].total, 
  1075.               data.c[comp].unit_total);
  1076.     PrintFile(2, 3, tmp, fp);
  1077.   }
  1078.  
  1079.   fclose(fp);
  1080.   InfoBox("Result file saved as result.txt");
  1081. }
  1082.  
  1083.  
  1084.