From: Alan T. DeKok Date: Wed, 23 Nov 2016 18:29:36 +0000 (-0500) Subject: use new DLIST X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ca167f70ed89e82ddcfdd367d446347d2f9f1c6;p=thirdparty%2Ffreeradius-server.git use new DLIST --- diff --git a/src/util/channel.h b/src/util/channel.h index 665a0ae9663..71f24e49ddb 100644 --- a/src/util/channel.h +++ b/src/util/channel.h @@ -81,6 +81,8 @@ typedef struct fr_channel_data_t { struct { fr_time_t *start_time; //!< time original request started (network -> worker) uint32_t priority; //!< priority of this packet. 0=high, 65535=low. + + fr_dlist_t list; //!< list of unprocessed packets for the worker } request; struct { diff --git a/src/util/time.h b/src/util/time.h index 8e0d67e24ee..4703005f4a3 100644 --- a/src/util/time.h +++ b/src/util/time.h @@ -83,6 +83,8 @@ typedef struct fr_time_tracking_t { #define FR_DLIST_INIT(head) do { head.prev = head.next = &head; } while (0) #define FR_DLIST_INSERT_TAIL(head, entry) do { entry.prev = head.prev; entry.next = &head; head.prev->next = &entry; head.prev = &entry; } while (0) #define FR_DLIST_REMOVE(entry) do { entry.prev->next = entry.next; entry.next->prev = entry.prev; FR_DLIST_INIT(entry); } while (0) +#define FR_DLIST_FIRST(head) (head.next == &head) ? NULL : head.next +#define FR_DLIST_NEXT(head, p_entry) (p_entry->next == &head) ? NULL : p_entry->next int fr_time_start(void); fr_time_t fr_time(void); diff --git a/src/util/transport.h b/src/util/transport.h index b0d1d192678..f551d4886da 100644 --- a/src/util/transport.h +++ b/src/util/transport.h @@ -106,6 +106,7 @@ struct rad_request { fr_channel_t *channel; fr_transport_t *transport; fr_heap_t *backlog; + fr_dlist_t list; }; #endif diff --git a/src/util/worker.c b/src/util/worker.c index 883f41e2011..66f894560fc 100644 --- a/src/util/worker.c +++ b/src/util/worker.c @@ -41,6 +41,9 @@ struct fr_worker_t { fr_time_t checked_timeout; //!< when we last checked the tails of the queues + fr_dlist_t channel_head; + fr_dlist_t channel_tail; + fr_heap_t *to_decode; //!< messages from the master, to be decoded or localized fr_heap_t *localized; //!< localized messages to be decoded fr_heap_t *decoded; //!< decoded requests which should (eventually) be runnable @@ -269,13 +272,14 @@ static void fr_worker_check_timeouts(fr_worker_t *worker, fr_time_t now) { fr_time_t waiting; fr_channel_data_t *cd; + fr_dlist_t *entry; REQUEST *request; /* * Check the "to_decode" queue for old packets. */ while ((cd = fr_heap_peek_tail(worker->to_decode)) != NULL) { - fr_message_t *l; + fr_message_t *lm; waiting = now - cd->m.when; @@ -297,10 +301,10 @@ static void fr_worker_check_timeouts(fr_worker_t *worker, fr_time_t now) * 0.1 to 1s. Localize it. */ (void) fr_heap_extract(worker->to_decode, cd); - l = fr_message_localize(worker, &cd->m, sizeof(cd)); - if (!l) goto nak; + lm = fr_message_localize(worker, &cd->m, sizeof(cd)); + if (!lm) goto nak; - (void) fr_heap_insert(worker->localized, l); + (void) fr_heap_insert(worker->localized, lm); } /* @@ -357,28 +361,26 @@ static void fr_worker_check_timeouts(fr_worker_t *worker, fr_time_t now) /* * Check the resumable queue for old packets. */ - if (worker->tracking.list.next != &worker->tracking.list) { - fr_dlist_t *list = worker->tracking.list.next; - - while (list != &worker->tracking.list) { - request = fr_ptr_to_type(REQUEST, tracking.list, list); + for (entry = FR_DLIST_FIRST(worker->tracking.list); + entry != NULL; + entry = FR_DLIST_NEXT(worker->tracking.list, entry)) { + request = fr_ptr_to_type(REQUEST, tracking.list, entry); #ifndef NDEBUG - (void) talloc_get_type_abort(request, REQUEST); + (void) talloc_get_type_abort(request, REQUEST); #endif - waiting = now - request->recv_time; + waiting = now - request->recv_time; - if (waiting < (30 * (fr_time_t) NANOSEC)) break; + if (waiting < (30 * (fr_time_t) NANOSEC)) break; - /* - * Waiting too long, delete it. - * - * @todo send a NAK - */ - fr_time_tracking_resume(&request->tracking, now); - fr_time_tracking_end(&request->tracking, now, &worker->tracking); - talloc_free(request); - } + /* + * Waiting too long, delete it. + * + * @todo send a NAK + */ + fr_time_tracking_resume(&request->tracking, now); + fr_time_tracking_end(&request->tracking, now, &worker->tracking); + talloc_free(request); } }