From 0894f22ea63cef3021de36e20b97a9dddf72a349 Mon Sep 17 00:00:00 2001 From: "David C. Jedlinsky" Date: Thu, 16 Jul 1987 19:46:51 +0000 Subject: Redid some malloc stuff; added queue_len() for STATs. --- zhm/queue.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'zhm/queue.c') diff --git a/zhm/queue.c b/zhm/queue.c index 6c9b3b0..2ac2a4e 100644 --- a/zhm/queue.c +++ b/zhm/queue.c @@ -35,13 +35,21 @@ struct _qelem { typedef struct _qelem Qelem; -Qelem hm_queue, *is_in_queue(); +Qelem hm_queue = { &hm_queue, &hm_queue, NULL }, *is_in_queue(); long time(); extern int timeout_type; Code_t init_queue() { + if (hm_queue.q_forw != &hm_queue) + do { + free(hm_queue.q_forw->q_data->z_packet); + free(hm_queue.q_forw->q_data); + remque(hm_queue.q_forw); + free(hm_queue.q_forw); + } while (hm_queue.q_forw != &hm_queue); + hm_queue.q_forw = hm_queue.q_back = &hm_queue; hm_queue.q_data = NULL; DPR ("Queue initialized and flushed.\n"); @@ -62,7 +70,8 @@ Code_t add_notice_to_queue(notice, packet, repl) entry->timeout = time(NULL) + NOTICE_TIMEOUT; entry->retries = 0; entry->z_notice = *notice; - entry->z_packet = packet; + entry->z_packet = (char *)malloc(Z_MAXPKTLEN); + bcopy(packet, entry->z_packet, Z_MAXPKTLEN); entry->reply = *repl; elem->q_data = entry; elem->q_forw = elem; @@ -90,7 +99,10 @@ Code_t remove_notice_from_queue(notice, kind, repl) else { *kind = elem->q_data->z_notice.z_kind; *repl = elem->q_data->reply; + free(elem->q_data->z_packet); + free(elem->q_data); remque(elem); + free(elem); if (hm_queue.q_forw == &hm_queue) (void)alarm(0); #ifdef DEBUG @@ -167,6 +179,20 @@ Code_t dump_queue() } while (srch != &hm_queue); } +int queue_len() +{ + int length = 0; + Qelem *srch; + + if ((srch = hm_queue.q_forw) != &hm_queue) { + do { + length++; + srch = srch->q_forw; + } while (srch != &hm_queue); + } + return(length); +} + Qelem *is_in_queue(notice) ZNotice_t notice; { -- cgit v1.2.3