Ticket #6: getrusage.c

File getrusage.c, 2.5 KB (added by Yuri Dario, 19 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