2 * Copyright 2005 Renzo Davoli
3 * Licensed under the GPLv2
15 #include <consmgmt.h> /* just for printlog def */
17 #define QT_ALLOC_STEP 4
21 time_t qt_period
; //timer period
22 time_t qt_nextcall
; //next call time (in secs)
23 unsigned int qt_times
; //number of times to be activated <0 = infinity
24 void (* qt_call
)(); //funct. to call
25 void *qt_arg
; // opt arg to the funct.
28 struct qt_timer
**qth
; // head of the active timer array
29 struct qt_timer
*qtf
; // free list
30 int maxqt
; //size of active timer array
32 static time_t gqtime
; // global time in secs, secs from the epoch
33 static int activeqt
; // number of active timers
34 static int countqt
; // counter for timer ID
36 time_t qtime() // returns global time (faster than time())
41 static sigset_t ss_alarm
, ss_old
;
44 if (sigprocmask(SIG_BLOCK
,&ss_alarm
,&ss_old
) < 0)
45 printlog(LOG_WARNING
,"error qtime_csenter\n");
50 if (sigprocmask(SIG_SETMASK
,&ss_old
,NULL
) < 0)
51 printlog(LOG_WARNING
,"error qtime_csexit\n");
54 unsigned int qtimer_add(time_t period
,int times
,void (*call
)(),void *arg
)
57 if (period
>0 && call
&& times
>=0) {
59 if (activeqt
>= maxqt
) {
60 int newmaxqt
=maxqt
+QT_ALLOC_STEP
;
61 qth
=realloc(qth
,newmaxqt
*sizeof(struct qt_timer
*));
65 /* it is not possible to use unitialized elements */
66 /*memset(qth+maxqt,0,QT_ALLOC_STEP*sizeof(struct qt_timer *));*/
71 qtf
=malloc(sizeof(struct qt_timer
));
75 /*all the fields but qt_arg get initialized */
76 /*memset(qtf,0,sizeof(struct qt_timer));*/
81 qth
[n
]->qt_n
=countqt
++;
82 qth
[n
]->qt_period
=period
;
83 qth
[n
]->qt_nextcall
=gqtime
+period
;
86 qth
[n
]->qt_times
=(times
==0)?-1:times
;
93 void qtimer_del(unsigned int n
)
96 for (i
=0; i
<activeqt
; i
++) {
97 if (n
==qth
[i
]->qt_n
) {
104 static void sig_alarm(int sig
)
109 //printf("%d\n",gqtime);
110 for (i
=0,j
=0; i
<activeqt
; i
++) {
111 if (qth
[i
]->qt_times
== 0)
113 //printf("timer %d eliminated\n",qth[i]->qt_n);
118 if (gqtime
>= qth
[i
]->qt_nextcall
) {
119 //printf("timer %d fires\n",qth[i]->qt_n);
120 qth
[i
]->qt_call(qth
[i
]->qt_arg
);
121 qth
[i
]->qt_nextcall
+=qth
[i
]->qt_period
;
122 if (qth
[i
]->qt_times
> 0 )
123 (qth
[i
]->qt_times
)--;
125 //printf("%d -> %d \n",i,j);
126 if (i
-j
) qth
[j
]=qth
[i
];
138 sa
.sa_handler
= sig_alarm
;
139 sa
.sa_flags
= SA_RESTART
;
140 if(sigaction(SIGALRM
, &sa
, NULL
) < 0){
141 printlog(LOG_WARNING
,"Setting handler for SIGALRM %s", strerror(errno
));
145 sigemptyset(&ss_alarm
);
146 sigaddset(&ss_alarm
,SIGALRM
);
148 it
.it_value
.tv_sec
= 1;
149 it
.it_value
.tv_usec
= 0 ;
150 it
.it_interval
.tv_sec
= 1;
151 it
.it_interval
.tv_usec
= 0 ;
152 setitimer(ITIMER_REAL
, &it
, NULL
);
166 qtimer_add(7,0,fun,NULL);
167 qtimer_add(3,0,fun,NULL);
168 qtimer_add(4,2,fun,NULL);