| [1360] | 1 | /** @file
 | 
|---|
 | 2 |  *
 | 
|---|
 | 3 |  * Testcase for bug #1023 autoincrement of file handles.
 | 
|---|
 | 4 |  *
 | 
|---|
 | 5 |  * InnoTek Systemberatung GmbH confidential
 | 
|---|
 | 6 |  *
 | 
|---|
 | 7 |  * Copyright (c) 2004 InnoTek Systemberatung GmbH
 | 
|---|
 | 8 |  * Author: knut st. osmundsen <bird-srcspam@anduin.net>
 | 
|---|
 | 9 |  *
 | 
|---|
 | 10 |  * All Rights Reserved
 | 
|---|
 | 11 |  *
 | 
|---|
 | 12 |  */
 | 
|---|
 | 13 | 
 | 
|---|
 | 14 | /*******************************************************************************
 | 
|---|
 | 15 | *   Header Files                                                               *
 | 
|---|
 | 16 | *******************************************************************************/
 | 
|---|
 | 17 | #define INCL_DOS
 | 
|---|
 | 18 | #define INCL_DOSINFOSEG
 | 
|---|
 | 19 | #ifdef __IBMC__
 | 
|---|
 | 20 | #include "../src/emx/include/os2emx.h"
 | 
|---|
 | 21 | #else
 | 
|---|
 | 22 | #include <os2.h>
 | 
|---|
 | 23 | #endif
 | 
|---|
 | 24 | #include <stdio.h>
 | 
|---|
| [1362] | 25 | #include <io.h>
 | 
|---|
 | 26 | #include <fcntl.h>
 | 
|---|
| [1360] | 27 | #include <string.h>
 | 
|---|
 | 28 | 
 | 
|---|
 | 29 | 
 | 
|---|
 | 30 | 
 | 
|---|
 | 31 | int main(int argc, const char **argv)
 | 
|---|
 | 32 | {
 | 
|---|
| [1361] | 33 |     int             i,j;
 | 
|---|
| [1360] | 34 |     LONG            lFHDelta = 0;
 | 
|---|
 | 35 |     ULONG           cFHs = 0;
 | 
|---|
 | 36 |     ULONG           cFHLast;
 | 
|---|
 | 37 |     unsigned        msLastInc;
 | 
|---|
| [1361] | 38 |     unsigned        msEnd;
 | 
|---|
 | 39 |     unsigned        msStart;
 | 
|---|
| [1363] | 40 |     unsigned        msTotal = 0;
 | 
|---|
 | 41 |     unsigned        cFiles = 0;
 | 
|---|
 | 42 |     unsigned        cIncrements = 0;
 | 
|---|
 | 43 |     int             fStreams;
 | 
|---|
| [1360] | 44 |     PGINFOSEG       pGIS = GETGINFOSEG();
 | 
|---|
| [1362] | 45 | #define MAX_FHS 10000
 | 
|---|
| [1360] | 46 |     static FILE    *apFiles[MAX_FHS];
 | 
|---|
| [1362] | 47 |     static int      aiFiles[MAX_FHS];
 | 
|---|
| [1360] | 48 | 
 | 
|---|
| [1364] | 49 |     /*
 | 
|---|
 | 50 |      * Init
 | 
|---|
 | 51 |      */
 | 
|---|
 | 52 |     fStreams = argc >= 2;
 | 
|---|
 | 53 | 
 | 
|---|
| [1360] | 54 |     DosSetRelMaxFH(&lFHDelta, &cFHs);
 | 
|---|
| [1364] | 55 |     printf("1023-maxfilehandles: starting at cFHs=%d; testing %s.\n", cFHs, fStreams ? "streams" : "io");
 | 
|---|
| [1360] | 56 | 
 | 
|---|
| [1364] | 57 |     /*
 | 
|---|
 | 58 |      * Open files.
 | 
|---|
 | 59 |      */
 | 
|---|
| [1360] | 60 |     cFHLast = cFHs;
 | 
|---|
 | 61 |     msLastInc = pGIS->msecs;
 | 
|---|
 | 62 |     for (i = 0; i < MAX_FHS; i++)
 | 
|---|
 | 63 |     {
 | 
|---|
| [1361] | 64 |         msStart = pGIS->msecs;
 | 
|---|
| [1363] | 65 |         if (fStreams)
 | 
|---|
 | 66 |             apFiles[i] = fopen(argv[argc - 1], "rb");
 | 
|---|
 | 67 |         else
 | 
|---|
 | 68 |             aiFiles[i] = open(argv[argc - 1], O_BINARY | O_RDONLY);
 | 
|---|
| [1360] | 69 |         msEnd = pGIS->msecs;
 | 
|---|
| [1363] | 70 |         if (fStreams ? apFiles[i] == NULL : aiFiles[i] < 0)
 | 
|---|
| [1360] | 71 |         {
 | 
|---|
 | 72 |             printf("error %d!\n", i + 1);
 | 
|---|
 | 73 |             break;
 | 
|---|
 | 74 |         }
 | 
|---|
 | 75 | 
 | 
|---|
 | 76 |         lFHDelta = cFHs = 0;
 | 
|---|
 | 77 |         DosSetRelMaxFH(&lFHDelta, &cFHs);
 | 
|---|
 | 78 |         lFHDelta = cFHs = 0;
 | 
|---|
 | 79 |         DosSetRelMaxFH(&lFHDelta, &cFHs);
 | 
|---|
 | 80 |         if (cFHs != cFHLast)
 | 
|---|
 | 81 |         {
 | 
|---|
| [1362] | 82 |             printf("Max FH change %i (fh=%d): %d -> %d (inc: %d ms  since last: %d ms)\n",
 | 
|---|
| [1363] | 83 |                    i + 1, fStreams ? fileno(apFiles[i]) : aiFiles[i],
 | 
|---|
 | 84 |                    cFHLast, cFHs, msEnd - msStart, msStart - msLastInc);
 | 
|---|
 | 85 |             /* stats */
 | 
|---|
 | 86 |             cIncrements++;
 | 
|---|
 | 87 |             msTotal += msEnd - msLastInc;
 | 
|---|
 | 88 |             msEnd = msLastInc = pGIS->msecs;
 | 
|---|
| [1360] | 89 |         }
 | 
|---|
 | 90 |         cFHLast = cFHs;
 | 
|---|
 | 91 |     }
 | 
|---|
 | 92 | 
 | 
|---|
| [1363] | 93 |     msTotal += msEnd - msLastInc;
 | 
|---|
| [1364] | 94 |     if (!msTotal)
 | 
|---|
 | 95 |         msTotal++;
 | 
|---|
| [1363] | 96 |     cFiles = i;
 | 
|---|
 | 97 | 
 | 
|---|
| [1360] | 98 |     lFHDelta = cFHs = 0;
 | 
|---|
 | 99 |     DosSetRelMaxFH(&lFHDelta, &cFHs);
 | 
|---|
 | 100 |     printf("cFHs=%d\n", cFHs);
 | 
|---|
| [1364] | 101 |     printf("msTotal=%d  cIncrements=%d  cFiles=%d  i.e. %d handles per second (%s)\n",
 | 
|---|
 | 102 |            msTotal, cIncrements, cFiles, cFiles * 1000 / msTotal, fStreams ? "streams" : "io");
 | 
|---|
| [1361] | 103 | 
 | 
|---|
 | 104 |     /*
 | 
|---|
 | 105 |      * Free the files.
 | 
|---|
 | 106 |      */
 | 
|---|
 | 107 |     msStart = pGIS->msecs;
 | 
|---|
| [1363] | 108 |     if (fStreams)
 | 
|---|
 | 109 |     {
 | 
|---|
 | 110 |         for (j = 0; j < i; j++)
 | 
|---|
 | 111 |             fclose(apFiles[j]);
 | 
|---|
 | 112 |     }
 | 
|---|
 | 113 |     else
 | 
|---|
 | 114 |     {
 | 
|---|
 | 115 |         for (j = 0; j < i; j++)
 | 
|---|
 | 116 |             close(aiFiles[j]);
 | 
|---|
 | 117 |     }
 | 
|---|
| [1361] | 118 |     msEnd = pGIS->msecs;
 | 
|---|
| [1364] | 119 |     msTotal = msEnd - msStart;
 | 
|---|
 | 120 |     if (!msTotal)
 | 
|---|
 | 121 |         msTotal++;
 | 
|---|
 | 122 |     printf("close of %d files took %d ms  i.e. %d handles per seconds\n",
 | 
|---|
 | 123 |            j, msTotal, cFiles * 1000 / msTotal);
 | 
|---|
| [1361] | 124 | 
 | 
|---|
 | 125 |     /*
 | 
|---|
 | 126 |      * Report the result.
 | 
|---|
 | 127 |      */
 | 
|---|
| [1360] | 128 |     if (i < 9900)
 | 
|---|
 | 129 |     {
 | 
|---|
 | 130 |         printf("1023-maxfilehandles: failed, could only open %d handles, expected > 9900\n", i);
 | 
|---|
 | 131 |         return 1;
 | 
|---|
 | 132 |     }
 | 
|---|
 | 133 | 
 | 
|---|
 | 134 |     printf("1023-maxfilehandles: succeeded opening %d handles.\n", i);
 | 
|---|
 | 135 |     return 0;
 | 
|---|
 | 136 | }
 | 
|---|