Various code cleanups.
[aesalon.git] / module / modules / cpuTime / collector / collector.c
blob2329bf3f8fca0f1dcb721a521a629b0436bc6aef
1 #include <stdio.h>
2 #include <time.h>
3 #include <signal.h>
4 #include <stdlib.h>
5 #include <sys/time.h>
6 #include <sys/times.h>
7 #include <sys/resource.h>
8 #include <sys/timerfd.h>
9 #include <pthread.h>
10 #include <unistd.h>
11 #include "collector/Interface.h"
13 AC_moduleDefinition;
15 int ACM_timerFd;
16 pthread_t ACM_threadID;
17 int ACM_running;
19 static void *ACM_sendTime(void *unused) {
20 ACM_running = 1;
21 while(ACM_running) {
22 uint64_t exp;
23 read(ACM_timerFd, &exp, sizeof(exp));
24 if(!AC_hasCollectionBegun()) continue;
26 AC_DataPacket packet;
27 struct rusage ru;
28 getrusage(RUSAGE_SELF, &ru);
30 uint64_t value = (ru.ru_utime.tv_sec * 1000000000) + (ru.ru_utime.tv_usec * 1000);
32 /*struct tms times_value;
33 times(&times_value);
35 uint64_t value = times_value.tms_utime + times_value.tms_stime;
36 value *= 10000000;
38 printf("value: %lu\n", value);*/
40 packet.dataSource.timestamp = AC_timestamp();
41 packet.dataSource.moduleID = AC_moduleID();
42 packet.data = &value;
43 packet.dataSize = sizeof(value);
44 /*printf("Packet: timestamp=%lu, value=%lu\n", packet.dataSource.timestamp, value);*/
45 AC_writePacket(&packet);
47 return NULL;
50 void __attribute__((constructor)) AC_constructor() {
51 /* NOTE: TFD_CLOEXEC was introduced in Linux 2.6.27; timerfd_create() is Linux-specific. */
52 if((ACM_timerFd = timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC)) == -1) {
53 printf("Failed to create timer . . .\n");
54 return;
57 struct itimerspec its;
59 int interval = AC_configurationInt("cpuTime", "interval");
60 if(interval == 0) {
61 /* The default interval is 10 times per second, or every 100 ms. */
62 interval = 100000;
64 interval *= 1000;
65 printf("interval: %i\n", interval);
67 its.it_interval.tv_sec = interval / 1000000000;
68 its.it_interval.tv_nsec = interval % 1000000000;
70 its.it_value.tv_sec = interval / 1000000000;
71 its.it_value.tv_nsec = interval % 1000000000;
73 timerfd_settime(ACM_timerFd, 0, &its, NULL);
75 pthread_create(&ACM_threadID, NULL, ACM_sendTime, NULL);
77 AC_registerModule("cpuTime");
80 void __attribute__((destructor)) AC_destructor() {
81 ACM_running = 0;
82 pthread_join(ACM_threadID, NULL);