2 * Copyright 2005 Renzo Davoli
3 * Licensed under the GPLv2
15 #include "consmgmt.h" /* just for printlog def */
19 #include <vdecommon.h>
21 #define QT_ALLOC_STEP 4
25 time_t qt_period
; //timer period
26 time_t qt_nextcall
; //next call time (in secs)
27 unsigned int qt_times
; //number of times to be activated <0 = infinity
28 void (* qt_call
)(); //funct. to call
29 void *qt_arg
; // opt arg to the funct.
32 struct qt_timer
**qth
; // head of the active timer array
33 struct qt_timer
*qtf
; // free list
34 int maxqt
; //size of active timer array
36 static time_t gqtime
; // global time in secs, secs from the epoch
37 static int activeqt
; // number of active timers
38 static int countqt
; // counter for timer ID
40 time_t qtime() // returns global time (faster than time())
45 static sigset_t ss_alarm
, ss_old
;
48 if (sigprocmask(SIG_BLOCK
,&ss_alarm
,&ss_old
) < 0)
49 printlog(LOG_WARNING
,"error qtime_csenter\n");
54 if (sigprocmask(SIG_SETMASK
,&ss_old
,NULL
) < 0)
55 printlog(LOG_WARNING
,"error qtime_csexit\n");
58 unsigned int qtimer_add(time_t period
,int times
,void (*call
)(),void *arg
)
61 if (period
>0 && call
&& times
>=0) {
63 if (activeqt
>= maxqt
) {
64 int newmaxqt
=maxqt
+QT_ALLOC_STEP
;
65 qth
=realloc(qth
,newmaxqt
*sizeof(struct qt_timer
*));
69 /* it is not possible to use unitialized elements */
70 /*memset(qth+maxqt,0,QT_ALLOC_STEP*sizeof(struct qt_timer *));*/
75 qtf
=malloc(sizeof(struct qt_timer
));
79 /*all the fields but qt_arg get initialized */
80 /*memset(qtf,0,sizeof(struct qt_timer));*/
85 qth
[n
]->qt_n
=countqt
++;
86 qth
[n
]->qt_period
=period
;
87 qth
[n
]->qt_nextcall
=gqtime
+period
;
90 qth
[n
]->qt_times
=(times
==0)?-1:times
;
97 void qtimer_del(unsigned int n
)
100 for (i
=0; i
<activeqt
; i
++) {
101 if (n
==qth
[i
]->qt_n
) {
108 static void sig_alarm(int sig
)
113 //printf("%d\n",gqtime);
114 for (i
=0,j
=0; i
<activeqt
; i
++) {
115 if (qth
[i
]->qt_times
== 0)
117 //printf("timer %d eliminated\n",qth[i]->qt_n);
122 if (gqtime
>= qth
[i
]->qt_nextcall
) {
123 //printf("timer %d fires\n",qth[i]->qt_n);
124 qth
[i
]->qt_call(qth
[i
]->qt_arg
);
125 qth
[i
]->qt_nextcall
+=qth
[i
]->qt_period
;
126 if (qth
[i
]->qt_times
> 0 )
127 (qth
[i
]->qt_times
)--;
129 //printf("%d -> %d \n",i,j);
130 if (i
-j
) qth
[j
]=qth
[i
];
142 sa
.sa_handler
= sig_alarm
;
143 sa
.sa_flags
= SA_RESTART
;
144 sigemptyset(&sa
.sa_mask
);
146 if(sigaction(SIGALRM
, &sa
, NULL
) < 0){
147 printlog(LOG_WARNING
,"Setting handler for SIGALRM %s", strerror(errno
));
151 sigemptyset(&ss_alarm
);
152 sigaddset(&ss_alarm
, SIGALRM
);
154 it
.it_value
.tv_sec
= 1;
155 it
.it_value
.tv_usec
= 0 ;
156 it
.it_interval
.tv_sec
= 1;
157 it
.it_interval
.tv_usec
= 0 ;
158 setitimer(ITIMER_REAL
, &it
, NULL
);
172 qtimer_add(7,0,fun,NULL);
173 qtimer_add(3,0,fun,NULL);
174 qtimer_add(4,2,fun,NULL);