1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
/****************************************************************************
* Copyright (C) 1998 WIDE Project. All rights reserved.
* Copyright (C) 1999,2000,2001,2002 University of Tromso. All rights reserved.
* Copyright (C) 2002 Invenia Innovation AS. All rights reserved.
*
* Author: Feike W. Dillema, feico@pasta.cs.uit.no.
* based on newbie code by Yusuke DOI, Keio Univ. Murai Lab.
****************************************************************************/
/*
* <$Id: queue.c,v 3.16 2002/12/11 16:39:50 dillema Exp $>
*/
#include "totd.h"
Q_Set *queue_create (void) {
char *fn = "queue_create()";
Q_Set *qs_tmp;
qs_tmp = malloc (sizeof (Q_Set));
if (!qs_tmp)
syslog (LOG_ERR, "%s: Cannot allocate memory", fn);
else if (!(qs_tmp->head = qs_tmp->tail = malloc (sizeof (G_Queue)))) {
syslog (LOG_ERR, "%s: Cannot allocate memory", fn);
free (qs_tmp);
} else {
qs_tmp->head->next = NULL;
qs_tmp->head->p = NULL;
/* SUCCESS */
return qs_tmp;
}
/* FAILURE */
return (NULL);
}
int enqueue (Q_Set *qs, void *p) {
char *fn = "enqueue()";
G_Queue *gq_tmp;
gq_tmp = malloc (sizeof (G_Queue));
if (!gq_tmp)
syslog (LOG_ERR, "%s: Cannot allocate memory", fn);
else {
gq_tmp->next = NULL;
gq_tmp->p = NULL;
qs->tail->p = p;
qs->tail->next = gq_tmp;
qs->tail = gq_tmp;
/* SUCCESS */
return 0;
}
/* FAILURE */
return (-1);
}
void *dequeue (Q_Set *qs) {
void *p;
G_Queue *gq_tmp;
if (!qs->head->next)
return NULL;
do {
p = qs->head->p;
gq_tmp = qs->head;
qs->head = qs->head->next;
free (gq_tmp);
} while (!p && qs->head != qs->tail);
return p;
}
void *queue_peek (Q_Set *qs) {
if (!qs->head->next)
return NULL;
return qs->head->p;
}
void *queue_disable (G_Queue *gq) {
void *p;
p = gq->p;
gq->p = NULL;
return p;
}
void queue_destroy (Q_Set *qs, void (*freefnc) (void *)) {
void *p;
if (!qs)
return;
while ((p = dequeue (qs)))
(*freefnc) (p);
if (qs->head) {
/* watchdog */
free (qs->head);
}
free (qs);
}
|