diff options
author | David C. Jedlinsky <opus@mit.edu> | 1987-07-16 19:46:51 +0000 |
---|---|---|
committer | David C. Jedlinsky <opus@mit.edu> | 1987-07-16 19:46:51 +0000 |
commit | 0894f22ea63cef3021de36e20b97a9dddf72a349 (patch) | |
tree | 2c4102281fb0927f1a0d21f01c0c12dd1f815ac1 /zhm/queue.c | |
parent | 226cab6028c498679725bdec6ee20bfd4cbe1c11 (diff) |
Redid some malloc stuff; added queue_len() for STATs.
Diffstat (limited to 'zhm/queue.c')
-rw-r--r-- | zhm/queue.c | 30 |
1 files changed, 28 insertions, 2 deletions
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; { |