|
@@ -6,15 +6,42 @@
|
|
#include "dprint.h"
|
|
#include "dprint.h"
|
|
#include "error.h"
|
|
#include "error.h"
|
|
#include "config.h"
|
|
#include "config.h"
|
|
|
|
+#ifdef SHM_MEM
|
|
|
|
+#include "shm_mem.h"
|
|
|
|
+#endif
|
|
|
|
|
|
#include <stdlib.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
|
|
struct sr_timer* timer_list=0;
|
|
struct sr_timer* timer_list=0;
|
|
|
|
|
|
-static int jiffies=0;
|
|
|
|
|
|
+static int* jiffies=0;
|
|
static int timer_id=0;
|
|
static int timer_id=0;
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* ret 0 on success, <0 on error*/
|
|
|
|
+int init_timer()
|
|
|
|
+{
|
|
|
|
+#ifdef SHM_MEM
|
|
|
|
+ jiffies=shm_malloc(sizeof(int));
|
|
|
|
+#else
|
|
|
|
+ /* in this case get_ticks won't work! */
|
|
|
|
+ LOG(L_INFO, "WARNING: no shared memory support compiled in"
|
|
|
|
+ " get_ticks won't work\n");
|
|
|
|
+ jiffies=malloc(sizeof(int));
|
|
|
|
+#endif
|
|
|
|
+ if (jiffies==0){
|
|
|
|
+ LOG(L_CRIT, "ERROR: init_timer: could not init jiffies\n");
|
|
|
|
+ return E_OUT_OF_MEM;
|
|
|
|
+ }
|
|
|
|
+ *jiffies=0;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
/*register a periodic timer;
|
|
/*register a periodic timer;
|
|
* ret: <0 on error*/
|
|
* ret: <0 on error*/
|
|
int register_timer(timer_function f, void* param, unsigned int interval)
|
|
int register_timer(timer_function f, void* param, unsigned int interval)
|
|
@@ -30,7 +57,7 @@ int register_timer(timer_function f, void* param, unsigned int interval)
|
|
t->timer_f=f;
|
|
t->timer_f=f;
|
|
t->t_param=param;
|
|
t->t_param=param;
|
|
t->interval=interval;
|
|
t->interval=interval;
|
|
- t->expires=jiffies+interval;
|
|
|
|
|
|
+ t->expires=*jiffies+interval;
|
|
/* insert it into the list*/
|
|
/* insert it into the list*/
|
|
t->next=timer_list;
|
|
t->next=timer_list;
|
|
timer_list=t;
|
|
timer_list=t;
|
|
@@ -47,23 +74,23 @@ void timer_ticker()
|
|
struct sr_timer* t;
|
|
struct sr_timer* t;
|
|
unsigned int prev_jiffies;
|
|
unsigned int prev_jiffies;
|
|
|
|
|
|
- prev_jiffies=jiffies;
|
|
|
|
- jiffies+=TIMER_TICK;
|
|
|
|
|
|
+ prev_jiffies=*jiffies;
|
|
|
|
+ *jiffies+=TIMER_TICK;
|
|
/* test for overflow (if tick= 1s =>overflow in 136 years)*/
|
|
/* test for overflow (if tick= 1s =>overflow in 136 years)*/
|
|
- if (jiffies<prev_jiffies){
|
|
|
|
|
|
+ if (*jiffies<prev_jiffies){
|
|
/*force expire & update every timer, a little buggy but it
|
|
/*force expire & update every timer, a little buggy but it
|
|
* happens once in 136 years :) */
|
|
* happens once in 136 years :) */
|
|
for(t=timer_list;t;t=t->next){
|
|
for(t=timer_list;t;t=t->next){
|
|
- t->expires=jiffies+t->interval;
|
|
|
|
- t->timer_f(jiffies, t->t_param);
|
|
|
|
|
|
+ t->expires=*jiffies+t->interval;
|
|
|
|
+ t->timer_f(*jiffies, t->t_param);
|
|
}
|
|
}
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
for (t=timer_list;t; t=t->next){
|
|
for (t=timer_list;t; t=t->next){
|
|
- if (jiffies>=t->expires){
|
|
|
|
- t->expires=jiffies+t->interval;
|
|
|
|
- t->timer_f(jiffies, t->t_param);
|
|
|
|
|
|
+ if (*jiffies>=t->expires){
|
|
|
|
+ t->expires=*jiffies+t->interval;
|
|
|
|
+ t->timer_f(*jiffies, t->t_param);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -72,5 +99,14 @@ void timer_ticker()
|
|
|
|
|
|
unsigned int get_ticks()
|
|
unsigned int get_ticks()
|
|
{
|
|
{
|
|
- return jiffies;
|
|
|
|
|
|
+ if (jiffies==0){
|
|
|
|
+ LOG(L_CRIT, "BUG: get_ticks: jiffies not intialized\n");
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+#ifndef SHM_MEM
|
|
|
|
+ LOG(L_CRIT, "WARNING: get_ticks: no shared memory support compiled in"
|
|
|
|
+ ", returning 0 (probably wrong)");
|
|
|
|
+ return 0;
|
|
|
|
+#endif
|
|
|
|
+ return *jiffies;
|
|
}
|
|
}
|