This source file includes following definitions.
- start_cpu_usage_timer
- filetime_to_100nsec
- filetime_diff
- get_cpu_usage
- write_cb
- timeout_cb
- main
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 #include "event2/event-config.h"
  28 
  29 #ifdef WIN32
  30 #include <winsock2.h>
  31 #include <windows.h>
  32 #else
  33 #include <unistd.h>
  34 #endif
  35 #include <sys/types.h>
  36 #include <sys/stat.h>
  37 #ifdef _EVENT_HAVE_SYS_TIME_H
  38 #include <sys/time.h>
  39 #endif
  40 
  41 #ifdef _EVENT_HAVE_SYS_SOCKET_H
  42 #include <sys/socket.h>
  43 #endif
  44 #include <fcntl.h>
  45 #include <stdlib.h>
  46 #include <stdio.h>
  47 #include <string.h>
  48 #include <errno.h>
  49 
  50 #include "event2/event.h"
  51 #include "event2/util.h"
  52 #include <time.h>
  53 
  54 struct cpu_usage_timer {
  55 #ifdef WIN32
  56         HANDLE thread;
  57         FILETIME usertimeBegin;
  58         FILETIME kerneltimeBegin;
  59 #else
  60         clock_t ticksBegin;
  61 #endif
  62         struct timeval timeBegin;
  63 };
  64 static void
  65 start_cpu_usage_timer(struct cpu_usage_timer *timer)
  66 {
  67 #ifdef WIN32
  68         int r;
  69         FILETIME createtime, exittime;
  70         timer->thread = GetCurrentThread();
  71         r = GetThreadTimes(timer->thread, &createtime, &exittime,
  72             &timer->usertimeBegin, &timer->kerneltimeBegin);
  73         if (r==0) printf("GetThreadTimes failed.");
  74 #else
  75         timer->ticksBegin = clock();
  76 #endif
  77 
  78         evutil_gettimeofday(&timer->timeBegin, NULL);
  79 }
  80 #ifdef WIN32
  81 static ev_int64_t
  82 filetime_to_100nsec(const FILETIME *ft)
  83 {
  84         
  85         ev_int64_t n = ft->dwHighDateTime;
  86         n <<= 32;
  87         n += ft->dwLowDateTime;
  88         return n;
  89 }
  90 static double
  91 filetime_diff(const FILETIME *ftStart, const FILETIME *ftEnd)
  92 {
  93         ev_int64_t s, e, diff;
  94         double r;
  95         s = filetime_to_100nsec(ftStart);
  96         e = filetime_to_100nsec(ftEnd);
  97         diff = e - s;
  98         r = (double) diff;
  99         return r / 1.0e7;
 100 }
 101 #endif
 102 
 103 static void
 104 get_cpu_usage(struct cpu_usage_timer *timer, double *secElapsedOut,
 105     double *secUsedOut, double *usageOut)
 106 {
 107 #ifdef WIN32
 108         double usertime_seconds, kerneltime_seconds;
 109         FILETIME createtime, exittime, usertimeEnd, kerneltimeEnd;
 110         int r;
 111 #else
 112         clock_t ticksEnd;
 113 #endif
 114         struct timeval timeEnd, timeDiff;
 115         double secondsPassed, secondsUsed;
 116 
 117 #ifdef WIN32
 118         r = GetThreadTimes(timer->thread, &createtime, &exittime,
 119             &usertimeEnd, &kerneltimeEnd);
 120         if (r==0) printf("GetThreadTimes failed.");
 121         usertime_seconds = filetime_diff(&timer->usertimeBegin, &usertimeEnd);
 122         kerneltime_seconds = filetime_diff(&timer->kerneltimeBegin, &kerneltimeEnd);
 123         secondsUsed = kerneltime_seconds + usertime_seconds;
 124 #else
 125         ticksEnd = clock();
 126         secondsUsed = (ticksEnd - timer->ticksBegin) / (double)CLOCKS_PER_SEC;
 127 #endif
 128         evutil_gettimeofday(&timeEnd, NULL);
 129         evutil_timersub(&timeEnd, &timer->timeBegin, &timeDiff);
 130         secondsPassed = timeDiff.tv_sec + (timeDiff.tv_usec / 1.0e6);
 131 
 132         *secElapsedOut = secondsPassed;
 133         *secUsedOut = secondsUsed;
 134         *usageOut = secondsUsed / secondsPassed;
 135 }
 136 
 137 static void
 138 write_cb(evutil_socket_t fd, short event, void *arg)
 139 {
 140         printf("write callback. should only see this once\n");
 141 
 142         
 143         event_del(*(struct event**)arg);
 144 
 145         
 146         event_add(*(struct event**)arg,NULL);
 147 
 148         
 149         event_del(*(struct event**)arg);
 150 
 151 }
 152 
 153 static void
 154 timeout_cb(evutil_socket_t fd, short event, void *arg)
 155 {
 156         printf("timeout fired, time to end test\n");
 157         event_del(*(struct event**)arg);
 158         return;
 159 }
 160 
 161 int
 162 main(int argc, char **argv)
 163 {
 164         struct event* ev;
 165         struct event* timeout;
 166         struct event_base* base;
 167 
 168         evutil_socket_t pair[2];
 169         struct timeval tv;
 170         struct cpu_usage_timer timer;
 171 
 172         double usage, secPassed, secUsed;
 173 
 174 #ifdef WIN32
 175         WORD wVersionRequested;
 176         WSADATA wsaData;
 177 
 178         wVersionRequested = MAKEWORD(2, 2);
 179 
 180         (void) WSAStartup(wVersionRequested, &wsaData);
 181 #endif
 182         if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1)
 183                 return (1);
 184 
 185         
 186         base = event_base_new();
 187 
 188         
 189         timeout = evtimer_new(base,timeout_cb,&timeout);
 190         
 191         ev = event_new(base,pair[1],EV_WRITE | EV_PERSIST, write_cb, &ev);
 192 
 193         tv.tv_sec  = 5;
 194         tv.tv_usec = 0;
 195 
 196         evtimer_add(timeout, &tv);
 197 
 198         event_add(ev, NULL);
 199 
 200         start_cpu_usage_timer(&timer);
 201 
 202         event_base_dispatch(base);
 203 
 204         event_free(ev);
 205         event_free(timeout);
 206         event_base_free(base);
 207 
 208         get_cpu_usage(&timer, &secPassed, &secUsed, &usage);
 209 
 210         
 211 
 212 
 213         printf("usec used=%d, usec passed=%d, cpu usage=%.2f%%\n",
 214             (int)(secUsed*1e6),
 215             (int)(secPassed*1e6),
 216             usage*100);
 217 
 218         if (usage > 50.0) 
 219           return 1;
 220 
 221         return 0;
 222 }
 223