File: queue.c

package info (click to toggle)
totd 1.4-3
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 660 kB
  • ctags: 512
  • sloc: ansic: 5,840; sh: 2,826; perl: 111; makefile: 110
file content (105 lines) | stat: -rw-r--r-- 2,040 bytes parent folder | download | duplicates (4)
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);
}