/* Linuxthreads - a simple clone()-based implementation of Posix        */
/* threads for Linux.                                                   */
/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
/*                                                                      */
/* This program is free software; you can redistribute it and/or        */
/* modify it under the terms of the GNU Library General Public License  */
/* as published by the Free Software Foundation; either version 2       */
/* of the License, or (at your option) any later version.               */
/*                                                                      */
/* This program is distributed in the hope that it will be useful,      */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
/* GNU Library General Public License for more details.                 */

/* Waiting queues */

/* Waiting queues are represented by lists of thread descriptors
   linked through their p_nextwaiting field.  The lists are kept
   sorted by decreasing priority, and then decreasing waiting time. */

static __inline__ void enqueue(pthread_descr * q, pthread_descr th)
{
  int prio = th->p_priority;
  for (; *q != NULL; q = &((*q)->p_nextwaiting)) {
    if (prio > (*q)->p_priority) {
      th->p_nextwaiting = *q;
      *q = th;
      return;
    }
  }
  *q = th;
}

static __inline__ pthread_descr dequeue(pthread_descr * q)
{
  pthread_descr th;
  th = *q;
  if (th != NULL) {
    *q = th->p_nextwaiting;
    th->p_nextwaiting = NULL;
  }
  return th;
}

static __inline__ int remove_from_queue(pthread_descr * q, pthread_descr th)
{
  for (; *q != NULL; q = &((*q)->p_nextwaiting)) {
    if (*q == th) {
      *q = th->p_nextwaiting;
      th->p_nextwaiting = NULL;
      return 1;
    }
  }
  return 0;
}

static __inline__ int queue_is_empty(pthread_descr * q)
{
    return *q == NULL;
}
