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