From e2481edf12568bc20dc2f08f31d833aae814115e Mon Sep 17 00:00:00 2001 From: Marek Vavrusa <marek.vavrusa@nic.cz> Date: Mon, 1 Aug 2011 14:38:03 +0200 Subject: [PATCH] Fixed uint32_t to int conversion invalidating scheduled events with dt > INT_MAX. --- src/common/evsched.c | 19 ++++++++++--------- src/common/evsched.h | 10 +++++----- src/knot/server/zones.c | 1 + 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/common/evsched.c b/src/common/evsched.c index 77f75e3d9..4e2cbd1a0 100644 --- a/src/common/evsched.c +++ b/src/common/evsched.c @@ -6,7 +6,7 @@ /*! * \brief Set event timer to T (now) + dt miliseconds. */ -static void evsched_settimer(event_t *e, int dt) +static void evsched_settimer(event_t *e, uint32_t dt) { if (!e) { return; @@ -41,7 +41,7 @@ evsched_t *evsched_new() /* Initialize event calendar. */ pthread_mutex_init(&s->mx, 0); pthread_cond_init(&s->notify, 0); - pthread_spin_init(&s->cache.lock, PTHREAD_PROCESS_PRIVATE); + pthread_mutex_init(&s->cache.lock, 0); slab_cache_init(&s->cache.alloc, sizeof(event_t)); init_list(&s->calendar); return s; @@ -66,6 +66,7 @@ void evsched_delete(evsched_t **s) /* Free allocator. */ slab_cache_destroy(&(*s)->cache.alloc); + pthread_mutex_destroy(&(*s)->cache.lock); /* Free scheduler. */ free(*s); @@ -79,9 +80,9 @@ event_t *evsched_event_new(evsched_t *s, int type) } /* Allocate. */ - pthread_spin_lock(&s->cache.lock); + pthread_mutex_lock(&s->cache.lock); event_t *e = slab_cache_alloc(&s->cache.alloc); - pthread_spin_unlock(&s->cache.lock); + pthread_mutex_unlock(&s->cache.lock); /* Initialize. */ memset(e, 0, sizeof(event_t)); @@ -95,9 +96,9 @@ void evsched_event_free(evsched_t *s, event_t *ev) return; } - pthread_spin_lock(&s->cache.lock); + pthread_mutex_lock(&s->cache.lock); slab_free(ev); - pthread_spin_unlock(&s->cache.lock); + pthread_mutex_unlock(&s->cache.lock); } event_t* evsched_next(evsched_t *s) @@ -146,7 +147,7 @@ event_t* evsched_next(evsched_t *s) } -int evsched_schedule(evsched_t *s, event_t *ev, int dt) +int evsched_schedule(evsched_t *s, event_t *ev, uint32_t dt) { if (!s || !ev || dt < 0) { return -1; @@ -185,7 +186,7 @@ int evsched_schedule(evsched_t *s, event_t *ev, int dt) return 0; } -event_t* evsched_schedule_cb(evsched_t *s, event_cb_t cb, void *data, int dt) +event_t* evsched_schedule_cb(evsched_t *s, event_cb_t cb, void *data, uint32_t dt) { if (!s) { return 0; @@ -208,7 +209,7 @@ event_t* evsched_schedule_cb(evsched_t *s, event_cb_t cb, void *data, int dt) return e; } -event_t* evsched_schedule_term(evsched_t *s, int dt) +event_t* evsched_schedule_term(evsched_t *s, uint32_t dt) { if (!s) { return 0; diff --git a/src/common/evsched.h b/src/common/evsched.h index 3f6cef82d..727d60131 100644 --- a/src/common/evsched.h +++ b/src/common/evsched.h @@ -77,8 +77,8 @@ typedef struct { pthread_cond_t notify; /*!< Event queue notification. */ list calendar; /*!< Event calendar. */ struct { - slab_cache_t alloc; /*!< Events SLAB cache. */ - pthread_spinlock_t lock; /*!< Events cache spin lock. */ + slab_cache_t alloc; /*!< Events SLAB cache. */ + pthread_mutex_t lock; /*!< Events cache spin lock. */ } cache; } evsched_t; @@ -139,7 +139,7 @@ event_t* evsched_next(evsched_t *s); * \retval 0 on success. * \retval <0 on error. */ -int evsched_schedule(evsched_t *s, event_t *ev, int dt); +int evsched_schedule(evsched_t *s, event_t *ev, uint32_t dt); /*! * \brief Schedule callback event. @@ -154,7 +154,7 @@ int evsched_schedule(evsched_t *s, event_t *ev, int dt); * \retval Event instance on success. * \retval NULL on error. */ -event_t* evsched_schedule_cb(evsched_t *s, event_cb_t cb, void *data, int dt); +event_t* evsched_schedule_cb(evsched_t *s, event_cb_t cb, void *data, uint32_t dt); /*! * \brief Schedule termination event. @@ -167,7 +167,7 @@ event_t* evsched_schedule_cb(evsched_t *s, event_cb_t cb, void *data, int dt); * \retval Event instance on success. * \retval NULL on error. */ -event_t* evsched_schedule_term(evsched_t *s, int dt); +event_t* evsched_schedule_term(evsched_t *s, uint32_t dt); /*! * \brief Cancel a scheduled event. diff --git a/src/knot/server/zones.c b/src/knot/server/zones.c index 0af9a5053..9984195df 100644 --- a/src/knot/server/zones.c +++ b/src/knot/server/zones.c @@ -423,6 +423,7 @@ void zones_timers_update(dnslib_zone_t *zone, conf_zone_t *cfzone, evsched_t *sc uint32_t refresh_tmr = zones_soa_refresh(zone); zd->xfr_in.timer = evsched_schedule_cb(sch, zones_axfrin_poll, zone, refresh_tmr); + debug_zones("notify: REFRESH set to %u\n", refresh_tmr); /* Cancel EXPIRE timer. */ if (zd->xfr_in.expire) { -- GitLab