Kannel: Open Source WAP and SMS gateway  svn-r5335
gw-timer.h File Reference
#include "gwlib/gwlib.h"

Go to the source code of this file.

Typedefs

typedef struct Timer Timer
 
typedef struct Timerset Timerset
 

Functions

Timersetgw_timerset_create (void)
 
void gw_timerset_destroy (Timerset *set)
 
void gw_timerset_elapsed_destroy (Timerset *set)
 
long gw_timerset_count (Timerset *set)
 
Timergw_timer_create (Timerset *set, List *outputlist, void(*callback)(void *))
 
void gw_timer_destroy (Timer *timer)
 
void gw_timer_elapsed_destroy (Timer *timer)
 
void gw_timer_elapsed_destroy_cb (Timer *timer)
 
void gw_timer_start (Timer *timer, int interval, void *data)
 
void gw_timer_elapsed_start (Timer *timer, int interval, void *data)
 
void gw_timer_elapsed_start_cb (Timer *timer, int interval, void *data)
 
void gw_timer_stop (Timer *timer)
 
void gw_timer_elapsed_stop (Timer *timer)
 
void gw_timer_elapsed_stop_cb (Timer *timer)
 
Listgw_timer_break (Timerset *set)
 
void * gw_timer_data (Timer *timer)
 

Typedef Documentation

◆ Timer

typedef struct Timer Timer

Definition at line 92 of file gw-timer.h.

◆ Timerset

typedef struct Timerset Timerset

Definition at line 93 of file gw-timer.h.

Function Documentation

◆ gw_timer_break()

List* gw_timer_break ( Timerset set)

Definition at line 501 of file gw-timer.c.

References abort_elapsed(), Timer::elapses, gw_assert(), gwlist_append(), gwlist_create, heap_delete(), Timer::index, lock(), and unlock().

502 {
503  List *ret = NULL;
504 
505  lock(set);
506 
507  if (set->heap->len == 0) {
508  unlock(set);
509  return NULL;
510  }
511 
512  ret = gwlist_create();
513 
514  /* Stop all timers. */
515  while (set->heap->len > 0) {
516  Timer *timer = set->heap->tab[0];
517 
518  gwlist_append(ret, timer);
519 
520  /*
521  * If the timer is active, make it inactive and remove it from
522  * the heap.
523  */
524  if (timer->elapses > 0) {
525  timer->elapses = -1;
526  gw_assert(set->heap->tab[timer->index] == timer);
527  heap_delete(set->heap, timer->index);
528  }
529 
530  abort_elapsed(timer);
531  }
532 
533  unlock(set);
534 
535  return ret;
536 }
gw_assert(wtls_machine->packet_to_send !=NULL)
void gwlist_append(List *list, void *item)
Definition: list.c:179
static void abort_elapsed(Timer *timer)
Definition: gw-timer.c:583
Timer ** tab
Definition: gw-timer.c:87
TimerHeap * heap
Definition: gw-timer.c:110
static void lock(Timerset *set)
Definition: gw-timer.c:563
long elapses
Definition: gw-timer.c:142
#define gwlist_create()
Definition: list.h:136
long index
Definition: gw-timer.c:161
long len
Definition: gw-timer.c:88
static void unlock(Timerset *set)
Definition: gw-timer.c:569
static void heap_delete(TimerHeap *heap, long index)
Definition: gw-timer.c:622
Definition: list.c:102

◆ gw_timer_create()

Timer* gw_timer_create ( Timerset set,
List outputlist,
void(*)(void *)  callback 
)

Definition at line 255 of file gw-timer.c.

References Timer::callback, Timer::data, Timer::elapsed_data, Timer::elapses, gwlist_add_producer(), Timer::index, Timer::output, and Timer::timerset.

Referenced by main(), retry_consumer_thread(), and url_result_thread().

256 {
257  Timer *t;
258 
259  t = gw_malloc(sizeof(*t));
260  t->timerset = set;
261  t->elapses = -1;
262  t->data = NULL;
263  t->elapsed_data = NULL;
264  t->index = -1;
265  t->output = outputlist;
266  if (t->output != NULL)
267  gwlist_add_producer(outputlist);
268  t->callback = callback;
269 
270  return t;
271 }
List * output
Definition: gw-timer.c:132
void * data
Definition: gw-timer.c:148
void(* callback)(void *data)
Definition: gw-timer.c:136
void * elapsed_data
Definition: gw-timer.c:155
Timerset * timerset
Definition: gw-timer.c:123
long elapses
Definition: gw-timer.c:142
long index
Definition: gw-timer.c:161
void gwlist_add_producer(List *list)
Definition: list.c:383

◆ gw_timer_data()

void* gw_timer_data ( Timer timer)

Definition at line 538 of file gw-timer.c.

References Timer::data, and gw_assert().

539 {
540  gw_assert(timer != NULL);
541 
542  return timer->data;
543 }
gw_assert(wtls_machine->packet_to_send !=NULL)
void * data
Definition: gw-timer.c:148

◆ gw_timer_destroy()

void gw_timer_destroy ( Timer timer)

Definition at line 273 of file gw-timer.c.

References gw_timer_stop(), gwlist_remove_producer(), and Timer::output.

274 {
275  if (timer == NULL)
276  return;
277 
278  gw_timer_stop(timer);
279  if (timer->output != NULL)
281  gw_free(timer);
282 }
List * output
Definition: gw-timer.c:132
void gw_timer_stop(Timer *timer)
Definition: gw-timer.c:442
void gwlist_remove_producer(List *list)
Definition: list.c:401

◆ gw_timer_elapsed_destroy()

void gw_timer_elapsed_destroy ( Timer timer)

Definition at line 284 of file gw-timer.c.

References gw_timer_elapsed_stop(), gwlist_remove_producer(), and Timer::output.

Referenced by gw_timerset_elapsed_destroy(), http_queue_thread(), and timer_consumer_thread().

285 {
286  if (timer == NULL)
287  return;
288 
289  gw_timer_elapsed_stop(timer);
290  if (timer->output != NULL)
292  gw_free(timer);
293 }
List * output
Definition: gw-timer.c:132
void gw_timer_elapsed_stop(Timer *timer)
Definition: gw-timer.c:462
void gwlist_remove_producer(List *list)
Definition: list.c:401

◆ gw_timer_elapsed_destroy_cb()

void gw_timer_elapsed_destroy_cb ( Timer timer)

Definition at line 295 of file gw-timer.c.

References gw_timer_elapsed_stop_cb(), gwlist_remove_producer(), and Timer::output.

Referenced by timer_retry_cb().

296 {
297  if (timer == NULL)
298  return;
299 
301  if (timer->output != NULL)
303  gw_free(timer);
304 }
List * output
Definition: gw-timer.c:132
void gw_timer_elapsed_stop_cb(Timer *timer)
Definition: gw-timer.c:483
void gwlist_remove_producer(List *list)
Definition: list.c:401

◆ gw_timer_elapsed_start()

void gw_timer_elapsed_start ( Timer timer,
int  interval,
void *  data 
)

Definition at line 352 of file gw-timer.c.

References Timer::data, Timer::elapsed_data, Timer::elapses, gw_assert(), gwthread_wakeup(), Timerset::heap, heap_adjust(), heap_insert(), Timer::index, interval, lock(), TimerHeap::tab, Timerset::thread, Timer::timerset, and unlock().

Referenced by main(), retry_consumer_thread(), timer_consumer_thread(), and url_result_thread().

353 {
354  int wakeup = 0;
355 
356  gw_assert(timer != NULL);
357 
358  if (timer == NULL)
359  return;
360 
361  lock(timer->timerset);
362 
363  /* Convert to absolute time */
364  interval += time(NULL);
365 
366  if (timer->elapses > 0) {
367  /* Resetting an existing timer. Move it to its new
368  * position in the heap. */
369  if (interval < timer->elapses && timer->index == 0)
370  wakeup = 1;
371  timer->elapses = interval;
372  gw_assert(timer->index >= 0);
373  gw_assert(timer->timerset->heap->tab[timer->index] == timer);
374  wakeup |= heap_adjust(timer->timerset->heap, timer->index);
375  } else {
376  /* Setting a new timer, or resetting an elapsed one.
377  * There should be no further elapse event on the
378  * output list here. */
379  /* abort_elapsed(timer); */
380  timer->elapsed_data = NULL;
381 
382  /* Then activate the timer. */
383  timer->elapses = interval;
384  gw_assert(timer->index < 0);
385  heap_insert(timer->timerset->heap, timer);
386  wakeup = timer->index == 0; /* Do we have a new top? */
387  }
388 
389  if (data != NULL) {
390  timer->data = data;
391  }
392 
393  unlock(timer->timerset);
394 
395  if (wakeup)
397 }
gw_assert(wtls_machine->packet_to_send !=NULL)
Timer ** tab
Definition: gw-timer.c:87
void * data
Definition: gw-timer.c:148
TimerHeap * heap
Definition: gw-timer.c:110
static void heap_insert(TimerHeap *heap, Timer *timer)
Definition: gw-timer.c:642
static void lock(Timerset *set)
Definition: gw-timer.c:563
void * elapsed_data
Definition: gw-timer.c:155
Timerset * timerset
Definition: gw-timer.c:123
double interval
Definition: fakewap.c:234
long thread
Definition: gw-timer.c:115
long elapses
Definition: gw-timer.c:142
void gwthread_wakeup(long thread)
long index
Definition: gw-timer.c:161
static void unlock(Timerset *set)
Definition: gw-timer.c:569
static int heap_adjust(TimerHeap *heap, long index)
Definition: gw-timer.c:685

◆ gw_timer_elapsed_start_cb()

void gw_timer_elapsed_start_cb ( Timer timer,
int  interval,
void *  data 
)

Definition at line 399 of file gw-timer.c.

References Timer::data, Timer::elapsed_data, Timer::elapses, gw_assert(), gwthread_wakeup(), Timerset::heap, heap_adjust(), heap_insert(), Timer::index, interval, TimerHeap::tab, Timerset::thread, and Timer::timerset.

400 {
401  int wakeup = 0;
402 
403  gw_assert(timer != NULL);
404 
405  if (timer == NULL)
406  return;
407 
408  /* Convert to absolute time */
409  interval += time(NULL);
410 
411  if (timer->elapses > 0) {
412  /* Resetting an existing timer. Move it to its new
413  * position in the heap. */
414  if (interval < timer->elapses && timer->index == 0)
415  wakeup = 1;
416  timer->elapses = interval;
417  gw_assert(timer->index >= 0);
418  gw_assert(timer->timerset->heap->tab[timer->index] == timer);
419  wakeup |= heap_adjust(timer->timerset->heap, timer->index);
420  } else {
421  /* Setting a new timer, or resetting an elapsed one.
422  * There should be no further elapse event on the
423  * output list here. */
424  /* abort_elapsed(timer); */
425  timer->elapsed_data = NULL;
426 
427  /* Then activate the timer. */
428  timer->elapses = interval;
429  gw_assert(timer->index < 0);
430  heap_insert(timer->timerset->heap, timer);
431  wakeup = timer->index == 0; /* Do we have a new top? */
432  }
433 
434  if (data != NULL) {
435  timer->data = data;
436  }
437 
438  if (wakeup)
440 }
gw_assert(wtls_machine->packet_to_send !=NULL)
Timer ** tab
Definition: gw-timer.c:87
void * data
Definition: gw-timer.c:148
TimerHeap * heap
Definition: gw-timer.c:110
static void heap_insert(TimerHeap *heap, Timer *timer)
Definition: gw-timer.c:642
void * elapsed_data
Definition: gw-timer.c:155
Timerset * timerset
Definition: gw-timer.c:123
double interval
Definition: fakewap.c:234
long thread
Definition: gw-timer.c:115
long elapses
Definition: gw-timer.c:142
void gwthread_wakeup(long thread)
long index
Definition: gw-timer.c:161
static int heap_adjust(TimerHeap *heap, long index)
Definition: gw-timer.c:685

◆ gw_timer_elapsed_stop()

void gw_timer_elapsed_stop ( Timer timer)

Definition at line 462 of file gw-timer.c.

References Timer::elapsed_data, Timer::elapses, gw_assert(), Timerset::heap, heap_delete(), Timer::index, lock(), TimerHeap::tab, Timer::timerset, and unlock().

Referenced by gw_timer_elapsed_destroy().

463 {
464  gw_assert(timer != NULL);
465  lock(timer->timerset);
466 
467  /*
468  * If the timer is active, make it inactive and remove it from
469  * the heap.
470  */
471  if (timer->elapses > 0) {
472  timer->elapses = -1;
473  gw_assert(timer->timerset->heap->tab[timer->index] == timer);
474  heap_delete(timer->timerset->heap, timer->index);
475  }
476 
477  /* abort_elapsed(timer); */
478  timer->elapsed_data = NULL;
479 
480  unlock(timer->timerset);
481 }
gw_assert(wtls_machine->packet_to_send !=NULL)
Timer ** tab
Definition: gw-timer.c:87
TimerHeap * heap
Definition: gw-timer.c:110
static void lock(Timerset *set)
Definition: gw-timer.c:563
void * elapsed_data
Definition: gw-timer.c:155
Timerset * timerset
Definition: gw-timer.c:123
long elapses
Definition: gw-timer.c:142
long index
Definition: gw-timer.c:161
static void unlock(Timerset *set)
Definition: gw-timer.c:569
static void heap_delete(TimerHeap *heap, long index)
Definition: gw-timer.c:622

◆ gw_timer_elapsed_stop_cb()

void gw_timer_elapsed_stop_cb ( Timer timer)

Definition at line 483 of file gw-timer.c.

References Timer::elapsed_data, Timer::elapses, gw_assert(), Timerset::heap, heap_delete(), Timer::index, TimerHeap::tab, and Timer::timerset.

Referenced by gw_timer_elapsed_destroy_cb().

484 {
485  gw_assert(timer != NULL);
486 
487  /*
488  * If the timer is active, make it inactive and remove it from
489  * the heap.
490  */
491  if (timer->elapses > 0) {
492  timer->elapses = -1;
493  gw_assert(timer->timerset->heap->tab[timer->index] == timer);
494  heap_delete(timer->timerset->heap, timer->index);
495  }
496 
497  /* abort_elapsed(timer); */
498  timer->elapsed_data = NULL;
499 }
gw_assert(wtls_machine->packet_to_send !=NULL)
Timer ** tab
Definition: gw-timer.c:87
TimerHeap * heap
Definition: gw-timer.c:110
void * elapsed_data
Definition: gw-timer.c:155
Timerset * timerset
Definition: gw-timer.c:123
long elapses
Definition: gw-timer.c:142
long index
Definition: gw-timer.c:161
static void heap_delete(TimerHeap *heap, long index)
Definition: gw-timer.c:622

◆ gw_timer_start()

void gw_timer_start ( Timer timer,
int  interval,
void *  data 
)

Definition at line 306 of file gw-timer.c.

References abort_elapsed(), Timer::data, Timer::elapses, gw_assert(), gwthread_wakeup(), Timerset::heap, heap_adjust(), heap_insert(), Timer::index, interval, lock(), TimerHeap::tab, Timerset::thread, Timer::timerset, and unlock().

307 {
308  int wakeup = 0;
309 
310  gw_assert(timer != NULL);
311 
312  if (timer == NULL)
313  return;
314 
315  lock(timer->timerset);
316 
317  /* Convert to absolute time */
318  interval += time(NULL);
319 
320  if (timer->elapses > 0) {
321  /* Resetting an existing timer. Move it to its new
322  * position in the heap. */
323  if (interval < timer->elapses && timer->index == 0)
324  wakeup = 1;
325  timer->elapses = interval;
326  gw_assert(timer->index >= 0);
327  gw_assert(timer->timerset->heap->tab[timer->index] == timer);
328  wakeup |= heap_adjust(timer->timerset->heap, timer->index);
329  } else {
330  /* Setting a new timer, or resetting an elapsed one.
331  * First deal with a possible elapse event that may
332  * still be on the output list. */
333  abort_elapsed(timer);
334 
335  /* Then activate the timer. */
336  timer->elapses = interval;
337  gw_assert(timer->index < 0);
338  heap_insert(timer->timerset->heap, timer);
339  wakeup = timer->index == 0; /* Do we have a new top? */
340  }
341 
342  if (data != NULL) {
343  timer->data = data;
344  }
345 
346  unlock(timer->timerset);
347 
348  if (wakeup)
350 }
gw_assert(wtls_machine->packet_to_send !=NULL)
static void abort_elapsed(Timer *timer)
Definition: gw-timer.c:583
Timer ** tab
Definition: gw-timer.c:87
void * data
Definition: gw-timer.c:148
TimerHeap * heap
Definition: gw-timer.c:110
static void heap_insert(TimerHeap *heap, Timer *timer)
Definition: gw-timer.c:642
static void lock(Timerset *set)
Definition: gw-timer.c:563
Timerset * timerset
Definition: gw-timer.c:123
double interval
Definition: fakewap.c:234
long thread
Definition: gw-timer.c:115
long elapses
Definition: gw-timer.c:142
void gwthread_wakeup(long thread)
long index
Definition: gw-timer.c:161
static void unlock(Timerset *set)
Definition: gw-timer.c:569
static int heap_adjust(TimerHeap *heap, long index)
Definition: gw-timer.c:685

◆ gw_timer_stop()

void gw_timer_stop ( Timer timer)

Definition at line 442 of file gw-timer.c.

References abort_elapsed(), Timer::elapses, gw_assert(), Timerset::heap, heap_delete(), Timer::index, lock(), TimerHeap::tab, Timer::timerset, and unlock().

Referenced by gw_timer_destroy(), and gw_timerset_destroy().

443 {
444  gw_assert(timer != NULL);
445  lock(timer->timerset);
446 
447  /*
448  * If the timer is active, make it inactive and remove it from
449  * the heap.
450  */
451  if (timer->elapses > 0) {
452  timer->elapses = -1;
453  gw_assert(timer->timerset->heap->tab[timer->index] == timer);
454  heap_delete(timer->timerset->heap, timer->index);
455  }
456 
457  abort_elapsed(timer);
458 
459  unlock(timer->timerset);
460 }
gw_assert(wtls_machine->packet_to_send !=NULL)
static void abort_elapsed(Timer *timer)
Definition: gw-timer.c:583
Timer ** tab
Definition: gw-timer.c:87
TimerHeap * heap
Definition: gw-timer.c:110
static void lock(Timerset *set)
Definition: gw-timer.c:563
Timerset * timerset
Definition: gw-timer.c:123
long elapses
Definition: gw-timer.c:142
long index
Definition: gw-timer.c:161
static void unlock(Timerset *set)
Definition: gw-timer.c:569
static void heap_delete(TimerHeap *heap, long index)
Definition: gw-timer.c:622

◆ gw_timerset_count()

long gw_timerset_count ( Timerset set)

Definition at line 244 of file gw-timer.c.

References lock(), and unlock().

Referenced by main().

245 {
246  long ret;
247 
248  lock(set);
249  ret = set->heap->len;
250  unlock(set);
251 
252  return ret;
253 }
static void lock(Timerset *set)
Definition: gw-timer.c:563
static void unlock(Timerset *set)
Definition: gw-timer.c:569

◆ gw_timerset_create()

Timerset* gw_timerset_create ( void  )

Definition at line 190 of file gw-timer.c.

References gwthread_create, heap_create(), mutex_create, and watch_timers().

Referenced by main().

191 {
192  Timerset *set;
193 
194  set = gw_malloc(sizeof(Timerset));
195  set->mutex = mutex_create();
196  set->heap = heap_create();
197  set->stopping = 0;
198  set->thread = gwthread_create(watch_timers, set);
199 
200  return set;
201 }
#define mutex_create()
Definition: thread.h:96
static void watch_timers(void *arg)
Definition: gw-timer.c:772
#define gwthread_create(func, arg)
Definition: gwthread.h:90
static TimerHeap * heap_create(void)
Definition: gw-timer.c:596

◆ gw_timerset_destroy()

void gw_timerset_destroy ( Timerset set)

Definition at line 203 of file gw-timer.c.

References gw_timer_stop(), gwthread_join(), gwthread_wakeup(), heap_destroy(), and mutex_destroy().

Referenced by main().

204 {
205  if (set == NULL)
206  return;
207 
208  /* Stop all timers. */
209  while (set->heap->len > 0)
210  gw_timer_stop(set->heap->tab[0]);
211 
212  /* Kill timer thread */
213  set->stopping = 1;
214  gwthread_wakeup(set->thread);
215  gwthread_join(set->thread);
216 
217  /* Free resources */
218  heap_destroy(set->heap);
219  mutex_destroy(set->mutex);
220  gw_free(set);
221 }
void gwthread_join(long thread)
static void heap_destroy(TimerHeap *heap)
Definition: gw-timer.c:608
Timer ** tab
Definition: gw-timer.c:87
TimerHeap * heap
Definition: gw-timer.c:110
void gw_timer_stop(Timer *timer)
Definition: gw-timer.c:442
void mutex_destroy(Mutex *mutex)
Definition: thread.c:97
long thread
Definition: gw-timer.c:115
void gwthread_wakeup(long thread)
long len
Definition: gw-timer.c:88
Mutex * mutex
Definition: gw-timer.c:105

◆ gw_timerset_elapsed_destroy()

void gw_timerset_elapsed_destroy ( Timerset set)

Definition at line 223 of file gw-timer.c.

References gw_timer_elapsed_destroy(), gwthread_join(), gwthread_wakeup(), heap_destroy(), and mutex_destroy().

224 {
225  if (set == NULL)
226  return;
227 
228  /* Stop all timers. */
229  while (set->heap->len > 0)
231 
232  /* Kill timer thread */
233  set->stopping = 1;
234  gwthread_wakeup(set->thread);
235  gwthread_join(set->thread);
236 
237  /* Free resources */
238  heap_destroy(set->heap);
239  mutex_destroy(set->mutex);
240  gw_free(set);
241 }
void gwthread_join(long thread)
static void heap_destroy(TimerHeap *heap)
Definition: gw-timer.c:608
Timer ** tab
Definition: gw-timer.c:87
TimerHeap * heap
Definition: gw-timer.c:110
void mutex_destroy(Mutex *mutex)
Definition: thread.c:97
long thread
Definition: gw-timer.c:115
void gw_timer_elapsed_destroy(Timer *timer)
Definition: gw-timer.c:284
void gwthread_wakeup(long thread)
long len
Definition: gw-timer.c:88
Mutex * mutex
Definition: gw-timer.c:105
See file LICENSE for details about the license agreement for using, modifying, copying or deriving work from this software.