2 * Copyright 2013 GRNET S.A. All rights reserved.
4 * Redistribution and use in source and binary forms, with or
5 * without modification, are permitted provided that the following
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
11 * 2. Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following
13 * disclaimer in the documentation and/or other materials
14 * provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
29 * The views and conclusions contained in the software and
30 * documentation are those of the authors and should not be
31 * interpreted as representing official policies, either expressed
32 * or implied, of GRNET S.A.
35 #include <xtypes/domain.h>
36 #include <xtypes/xwaitq.h>
38 static int __check_cond(struct xwaitq *wq)
40 return wq->cond_fn(wq->cond_arg);
43 int xwaitq_init(struct xwaitq *wq, int (*cond_fn)(void *arg), void *arg, uint32_t flags)
45 wq->cond_fn = cond_fn;
48 wq->q = xtypes_malloc(sizeof(struct xq));
51 xlock_release(&wq->lock);
52 if (!xq_alloc_empty(wq->q, 8)){
59 void xwaitq_destroy(struct xwaitq *wq)
65 int __xwaitq_enqueue(struct xwaitq *wq, struct work *w)
67 //enqueure and resize if necessary
70 r = __xq_append_tail(wq->q, (xqindex)w);
72 newq = xtypes_malloc(sizeof(struct xq));
76 if (!xq_alloc_empty(newq, wq->q->size*2)){
80 if (__xq_resize(wq->q, newq) == Noneidx){
87 r = __xq_append_tail(wq->q, (xqindex)w);
90 return ((r == Noneidx)? -1 : 0);
93 int xwaitq_enqueue(struct xwaitq *wq, struct work *w)
96 if (__check_cond(wq)){
97 w->job_fn(wq, w->job);
100 xlock_acquire(&wq->lock, 1);
101 r = __xwaitq_enqueue(wq, w);
102 xlock_release(&wq->lock);
107 void xwaitq_signal(struct xwaitq *wq)
112 if (!xq_count(wq->q))
115 if (wq->flags & XWAIT_SIGNAL_ONE){
116 if (!xlock_try_lock(&wq->lock, 1))
119 xlock_acquire(&wq->lock, 1);
121 while (xq_count(wq->q) && __check_cond(wq)){
122 xqi = __xq_pop_head(wq->q);
126 xlock_release(&wq->lock);
127 w = (struct work *)xqi;
128 w->job_fn(wq, w->job);
129 if (wq->flags & XWAIT_SIGNAL_ONE){
130 if (!xlock_try_lock(&wq->lock, 1))
133 xlock_acquire(&wq->lock, 1);
136 xlock_release(&wq->lock);
140 #include <linux/module.h>
141 #include <xtypes/xwaitq_exports.h>