]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
use new DLIST
authorAlan T. DeKok <aland@freeradius.org>
Wed, 23 Nov 2016 18:29:36 +0000 (13:29 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 24 Nov 2016 23:14:07 +0000 (18:14 -0500)
src/util/channel.h
src/util/time.h
src/util/transport.h
src/util/worker.c

index 665a0ae96639f502441375431d666b1ae8c661d6..71f24e49ddb9d1d92706c92fa835594e445faa47 100644 (file)
@@ -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 {
index 8e0d67e24ee999703502a647dc25d054dfad72f4..4703005f4a3abe511a207fd5643cfc15c6704eaf 100644 (file)
@@ -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);
index b0d1d19267839e00a0d0fd2ec7d1acb797d78455..f551d4886da99e4a0d84cb025d3755c5b1726213 100644 (file)
@@ -106,6 +106,7 @@ struct rad_request {
        fr_channel_t            *channel;
        fr_transport_t          *transport;
        fr_heap_t               *backlog;
+       fr_dlist_t              list;
 };
 #endif
 
index 883f41e2011d1f3592cbe4e483ecc660e9dbbe61..66f894560fcb4bbdf5bf7caaf8be99672681ec44 100644 (file)
@@ -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);
        }
 }