Ticket #6: getrusage.c

File getrusage.c, 2.5 KB (added by Yuri Dario, 18 years ago)

new getrusage implementation, with 32bit api and LGPL.

Line 
1
2#define INCL_DOS
3#include <os2.h>
4
5#include <errno.h>
6#include <sys/types.h>
7#include <sys/resource.h>
8#include <stdio.h>
9#include <time.h>
10
11//#include "procstat.h"
12
13#define BUFFER_SIZE 64*1024
14
15static ULONG    timer_interval;
16
17//APIRET APIENTRY DosQuerySysState (ULONG EntityList, ULONG EntityLevel,
18//                                                      PID pid, TID tid, PVOID pDataBuf, ULONG cbBuf)
19int get_proc_state( int pid, struct rusage *usage)
20{
21        APIRET          rc;
22        char*           buffer;
23        qsPtrRec_t*     qsPtrRec;
24        qsPrec_t*       qsPrec;
25        qsTrec_t*       qsTrec;
26        ULONG           usertime = 0;
27        ULONG           systime = 0;
28        int                     i;
29        double          u, s;
30
31        // query OS interval timer
32        if (timer_interval == 0)
33                DosQuerySysInfo(QSV_TIMER_INTERVAL, QSV_TIMER_INTERVAL,
34                                           (PVOID)&timer_interval, sizeof(ULONG));
35       
36    // allocate memory
37        buffer = malloc( BUFFER_SIZE);
38        if (buffer == 0)
39                return -1;
40       
41        // get pid process informations (process and threads)
42        rc = DosQuerySysState( QS_PROCESS, 0, pid, 0, buffer, BUFFER_SIZE);
43        if (rc) {
44                free( buffer);
45                return -1;
46        }
47       
48        // evaluate list
49        qsPtrRec = buffer;                              // global structure
50        qsPrec = qsPtrRec->pProcRec;    // process data
51        //printf( "buffer %d\n", buffer);       
52        //printf( "qsPrec.RecType %d\n", qsPrec->RecType);     
53        //printf( "qsPrec.pid %d\n", qsPrec->pid);
54       
55        qsTrec = qsPrec->pThrdRec;              // thread data
56        // sum u/s time for every thread
57        for( i=0; i<qsPrec->cTCB; i++) {
58                //printf( "qsTrec.RecType %d\n", qsTrec[i].RecType);   
59                //printf( "qsTrec.tid %d\n", qsTrec[i].tid);
60                usertime += qsTrec[i].usertime;
61                systime += qsTrec[i].systime;
62        }
63        //printf( "usertime %d\n", usertime);
64        //printf( "systime %d\n", systime);
65
66        // convert timer units into seconds/microseconds
67        u = 10.0 * usertime / timer_interval;
68        s = 10.0 * systime / timer_interval;
69        usage->ru_utime.tv_sec = u;
70        usage->ru_utime.tv_usec = (u - usage->ru_utime.tv_sec) * 1000000;
71        usage->ru_stime.tv_sec = s;
72        usage->ru_stime.tv_usec = (s - usage->ru_stime.tv_sec) * 1000000;
73
74        free(buffer);   
75}
76
77int getrusage(int who, struct rusage *usage)
78{
79
80        // only RUSAGE_SELF is supported!
81        if (who != RUSAGE_SELF) {
82           errno = EINVAL;
83           return -1;
84        }
85
86        // internal query failed
87        if (get_proc_state( getpid(), usage) == -1) {
88           errno = EINVAL;
89           return -1;
90        }
91
92        return 0;
93}
94
95#ifdef MAIN
96
97void main( void)
98{
99        struct rusage ru;
100        clock_t t1, t2;
101       
102        while( 1) {
103                printf( "clock %d\n", clock());
104                getrusage( RUSAGE_SELF, &ru);
105                printf( "ru %d,%d\n", ru.ru_utime.tv_sec, ru.ru_utime.tv_usec); 
106                t1 = clock();
107                while( clock()-t1<CLOCKS_PER_SEC)
108                        ;
109                //DosSleep(1*1000);
110        }
111}
112
113#endif
114