]> arthur.barton.de Git - netatalk.git/blob - libevent/test/test-changelist.c
Merge master
[netatalk.git] / libevent / test / test-changelist.c
1 /*
2  *  based on test-eof.c
3  */
4
5 #include "event2/event-config.h"
6
7 #ifdef WIN32
8 #include <winsock2.h>
9 #include <windows.h>
10 #else
11 #include <unistd.h>
12 #endif
13 #include <sys/types.h>
14 #include <sys/stat.h>
15 #ifdef _EVENT_HAVE_SYS_TIME_H
16 #include <sys/time.h>
17 #endif
18
19 #ifdef _EVENT_HAVE_SYS_SOCKET_H
20 #include <sys/socket.h>
21 #endif
22 #include <fcntl.h>
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include <string.h>
26 #include <errno.h>
27
28 #include "event2/event.h"
29 #include "event2/util.h"
30 #include <time.h>
31
32 struct cpu_usage_timer {
33 #ifdef WIN32
34         HANDLE thread;
35         FILETIME usertimeBegin;
36         FILETIME kerneltimeBegin;
37 #else
38         clock_t ticksBegin;
39 #endif
40         struct timeval timeBegin;
41 };
42 static void
43 start_cpu_usage_timer(struct cpu_usage_timer *timer)
44 {
45 #ifdef WIN32
46         int r;
47         FILETIME createtime, exittime;
48         timer->thread = GetCurrentThread();
49         r = GetThreadTimes(timer->thread, &createtime, &exittime,
50             &timer->usertimeBegin, &timer->kerneltimeBegin);
51         if (r==0) printf("GetThreadTimes failed.");
52 #else
53         timer->ticksBegin = clock();
54 #endif
55
56         evutil_gettimeofday(&timer->timeBegin, NULL);
57 }
58 #ifdef WIN32
59 static ev_int64_t
60 filetime_to_100nsec(const FILETIME *ft)
61 {
62         /* Number of 100-nanosecond units */
63         ev_int64_t n = ft->dwHighDateTime;
64         n <<= 32;
65         n += ft->dwLowDateTime;
66         return n;
67 }
68 static double
69 filetime_diff(const FILETIME *ftStart, const FILETIME *ftEnd)
70 {
71         ev_int64_t s, e, diff;
72         double r;
73         s = filetime_to_100nsec(ftStart);
74         e = filetime_to_100nsec(ftEnd);
75         diff = e - s;
76         r = (double) diff;
77         return r / 1.0e7;
78 }
79 #endif
80
81 static void
82 get_cpu_usage(struct cpu_usage_timer *timer, double *secElapsedOut,
83     double *secUsedOut, double *usageOut)
84 {
85 #ifdef WIN32
86         double usertime_seconds, kerneltime_seconds;
87         FILETIME createtime, exittime, usertimeEnd, kerneltimeEnd;
88         int r;
89 #else
90         clock_t ticksEnd;
91 #endif
92         struct timeval timeEnd, timeDiff;
93         double secondsPassed, secondsUsed;
94
95 #ifdef WIN32
96         r = GetThreadTimes(timer->thread, &createtime, &exittime,
97             &usertimeEnd, &kerneltimeEnd);
98         if (r==0) printf("GetThreadTimes failed.");
99         usertime_seconds = filetime_diff(&timer->usertimeBegin, &usertimeEnd);
100         kerneltime_seconds = filetime_diff(&timer->kerneltimeBegin, &kerneltimeEnd);
101         secondsUsed = kerneltime_seconds + usertime_seconds;
102 #else
103         ticksEnd = clock();
104         secondsUsed = (ticksEnd - timer->ticksBegin) / (double)CLOCKS_PER_SEC;
105 #endif
106         evutil_gettimeofday(&timeEnd, NULL);
107         evutil_timersub(&timeEnd, &timer->timeBegin, &timeDiff);
108         secondsPassed = timeDiff.tv_sec + (timeDiff.tv_usec / 1.0e6);
109
110         *secElapsedOut = secondsPassed;
111         *secUsedOut = secondsUsed;
112         *usageOut = secondsUsed / secondsPassed;
113 }
114
115 static void
116 write_cb(evutil_socket_t fd, short event, void *arg)
117 {
118         printf("write callback. should only see this once\n");
119
120         /* got what we want remove the event */
121         event_del(*(struct event**)arg);
122
123         /* opps changed my mind add it back again */
124         event_add(*(struct event**)arg,NULL);
125
126         /* not a good day for decisiveness, I really didn't want it after all */
127         event_del(*(struct event**)arg);
128
129 }
130
131 static void
132 timeout_cb(evutil_socket_t fd, short event, void *arg)
133 {
134         printf("timeout fired, time to end test\n");
135         event_del(*(struct event**)arg);
136         return;
137 }
138
139 int
140 main(int argc, char **argv)
141 {
142         struct event* ev;
143         struct event* timeout;
144         struct event_base* base;
145
146         evutil_socket_t pair[2];
147         struct timeval tv;
148         struct cpu_usage_timer timer;
149
150         double usage, secPassed, secUsed;
151
152 #ifdef WIN32
153         WORD wVersionRequested;
154         WSADATA wsaData;
155         int     err;
156
157         wVersionRequested = MAKEWORD(2, 2);
158
159         err = WSAStartup(wVersionRequested, &wsaData);
160 #endif
161         if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1)
162                 return (1);
163
164         /* Initalize the event library */
165         base = event_base_new();
166
167         /* Initalize a timeout to terminate the test */
168         timeout = evtimer_new(base,timeout_cb,&timeout);
169         /* and watch for writability on one end of the pipe */
170         ev = event_new(base,pair[1],EV_WRITE | EV_PERSIST, write_cb, &ev);
171
172         tv.tv_sec  = 5;
173         tv.tv_usec = 0;
174
175         evtimer_add(timeout, &tv);
176
177         event_add(ev, NULL);
178
179         start_cpu_usage_timer(&timer);
180
181         event_base_dispatch(base);
182
183         get_cpu_usage(&timer, &secPassed, &secUsed, &usage);
184
185         /* attempt to calculate our cpu usage over the test should be
186            virtually nil */
187
188         printf("usec used=%d, usec passed=%d, cpu usage=%.2f%%\n",
189             (int)(secUsed*1e6),
190             (int)(secPassed*1e6),
191             usage*100);
192
193         if (usage > 50.0) /* way too high */
194           return 1;
195
196         return 0;
197 }
198