diff options
Diffstat (limited to 'server/.svn/text-base/periodic.c.svn-base')
-rw-r--r-- | server/.svn/text-base/periodic.c.svn-base | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/server/.svn/text-base/periodic.c.svn-base b/server/.svn/text-base/periodic.c.svn-base new file mode 100644 index 0000000..9a94edb --- /dev/null +++ b/server/.svn/text-base/periodic.c.svn-base @@ -0,0 +1,118 @@ +#include "conf.h" +#include "cdb.h" +#include "log.h" +#include "memdb.h" +#include "mysqldb.h" +#include "thread.h" +#include "periodic.h" + +#include <errno.h> +#include <stdlib.h> +#include <string.h> + +RCSID("$Id: periodic.c,v 1.9 2000/05/17 21:52:34 shmit Exp $"); + +struct _per_thread_t { + cond_t *cond; + thread_t *tid; +}; +typedef struct _per_thread_t per_thread_t; + +static void * +periodic_looper(void *arg) +{ + per_thread_t *self; + int count; + + self = (per_thread_t *)arg; + pthread_detach(pthread_self()); + + count = 0; + for (;;) { + struct timespec ts; + + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += 1; + (void)cond_timedwait(self->cond, &ts); + + count++; + if (count == PERIODICITY) { + cdb_periodic(); + count = 0; + } + + cdb_collate(); + mysqldb_collate(); + memdb_collate(); + } + return NULL; +} + +void +periodic_delete(per_thread_t *thr) +{ + if (thr == NULL) + return; + + if (thr->cond) { + cond_destroy(thr->cond); + free(thr->cond); + thr->cond = NULL; + } + + if (thr->tid) { + free(thr->tid); + thr->tid = NULL; + } + free(thr); +} + +int +periodic_new() +{ + per_thread_t *per_thread; + int rc; + + per_thread = malloc(sizeof(per_thread_t)); + if (per_thread == NULL) { + log_err("Couldn't allocate periodic thread: %s.", + strerror(errno)); + return -1; + } + per_thread->cond = NULL; + per_thread->tid = NULL; + + per_thread->cond = malloc(sizeof(cond_t)); + if (per_thread->cond == NULL) { + log_err("Couldn't allocate periodic condition: %s.", + strerror(errno)); + periodic_delete(per_thread); + return -1; + } + + rc = cond_new(per_thread->cond); + if (rc) { + log_err("Couldn't initialise periodic condition: %s.", + strerror(rc)); + periodic_delete(per_thread); + return -1; + } + + per_thread->tid = malloc(sizeof(thread_t)); + if (per_thread->tid == NULL) { + log_err("Couldn't allocate periodic thread: %s.", + strerror(rc)); + periodic_delete(per_thread); + return -1; + } + + rc = thread_new(per_thread->tid, periodic_looper, per_thread); + if (rc) { + log_err("Couldn't start periodic thread: %s.", + strerror(rc)); + periodic_delete(per_thread); + return -1; + } + + return 0; +} |