thread safe longjmp functions.
[kopensolaris-gnu/glibc.git] / linuxthreads / queue.h
1 /* Linuxthreads - a simple clone()-based implementation of Posix        */
2 /* threads for Linux.                                                   */
3 /* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
4 /*                                                                      */
5 /* This program is free software; you can redistribute it and/or        */
6 /* modify it under the terms of the GNU Library General Public License  */
7 /* as published by the Free Software Foundation; either version 2       */
8 /* of the License, or (at your option) any later version.               */
9 /*                                                                      */
10 /* This program is distributed in the hope that it will be useful,      */
11 /* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
12 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
13 /* GNU Library General Public License for more details.                 */
14
15 /* Waiting queues */
16
17 typedef struct _pthread_queue pthread_queue;
18
19 static inline void queue_init(pthread_queue * q)
20 {
21   q->head = q->tail = NULL;
22 }
23
24 static inline void enqueue(pthread_queue * q, pthread_descr th)
25 {
26   int prio;
27   pthread_descr * elt;
28
29   ASSERT(th->p_nextwaiting == NULL);
30   if (q->tail == NULL) {
31     q->head = th;
32     q->tail = th;
33     return;
34   }
35   prio = th->p_priority;
36   if (prio > 0) {
37     /* Insert in queue according to priority order */
38     for (elt = &(q->head); *elt != NULL; elt = &((*elt)->p_nextwaiting)) {
39       if (prio > (*elt)->p_priority) {
40         th->p_nextwaiting = *elt;
41         *elt = th;
42         return;
43       }
44     }
45   }
46   /* Priority is no greater than any thread in the queue.
47      Insert at end of queue */
48   q->tail->p_nextwaiting = th;
49   q->tail = th;
50 }
51
52 static inline pthread_descr dequeue(pthread_queue * q)
53 {
54   pthread_descr th;
55   th = q->head;
56   if (th != NULL) {
57     q->head = th->p_nextwaiting;
58     if (q->head == NULL) q->tail = NULL;
59     th->p_nextwaiting = NULL;
60   }
61   return th;
62 }