source: mainline/kernel/generic/include/synch/waitq.h

Last change on this file was 597fa24, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 3 months ago

Enable static initialization of kernel synchronization primitives

  • Property mode set to 100644
File size: 3.3 KB
RevLine 
[f761f1eb]1/*
[df4ed85]2 * Copyright (c) 2001-2004 Jakub Jermar
[f761f1eb]3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
[e88eb48]29/** @addtogroup kernel_sync
[b45c443]30 * @{
31 */
32/** @file
33 */
34
[06e1e95]35#ifndef KERN_WAITQ_H_
36#define KERN_WAITQ_H_
[f761f1eb]37
[d99c1d2]38#include <typedefs.h>
[f761f1eb]39#include <synch/spinlock.h>
[c0699467]40#include <abi/synch.h>
[5c9a08b]41#include <adt/list.h>
[f761f1eb]42
[597fa24]43#define WAITQ_INITIALIZER_WITH_COUNT(name, count) (waitq_t) { \
44 .lock = IRQ_SPINLOCK_INITIALIZER(#name ".lock"), \
45 .sleepers = LIST_INITIALIZER((name).sleepers), \
46 .wakeup_balance = (count), \
47}
48
49#define WAITQ_INITIALIZER(name) WAITQ_INITIALIZER_WITH_COUNT(name, 0)
50
51#define WAITQ_INITIALIZE_WITH_COUNT(name, count) \
52 waitq_t name = WAITQ_INITIALIZER_WITH_COUNT(name, count)
53
54#define WAITQ_INITIALIZE(name) \
55 waitq_t name = WAITQ_INITIALIZER(name)
56
[da1bafb]57/** Wait queue structure.
58 *
59 */
[d314571]60typedef struct waitq {
[05e2a7ad]61 /** Lock protecting wait queue structure.
62 *
63 * Must be acquired before T.lock for each T of type thread_t.
64 */
[da1bafb]65 IRQ_SPINLOCK_DECLARE(lock);
[a35b458]66
[80bcaed]67 /**
[111b9b9]68 * If negative, number of wakeups that are to be ignored (necessary for futex operation).
69 * If positive, number of wakeups that weren't able to wake a thread.
[80bcaed]70 */
[111b9b9]71 int wakeup_balance;
[b59318e]72
[912100e]73 /** List of sleeping threads for which there was no missed_wakeup. */
[55b77d9]74 list_t sleepers;
[111b9b9]75
76 bool closed;
[e71a61d]77} waitq_t;
[f761f1eb]78
[111b9b9]79typedef struct wait_guard {
80 ipl_t ipl;
81} wait_guard_t;
82
[5573942]83struct thread;
84
[2e151ab0]85extern void waitq_initialize(waitq_t *);
[4c78104]86extern void waitq_initialize_with_count(waitq_t *, int);
[5110d0a]87extern errno_t waitq_sleep(waitq_t *);
[111b9b9]88extern errno_t _waitq_sleep_timeout(waitq_t *, uint32_t, unsigned int);
89extern errno_t waitq_sleep_timeout(waitq_t *, uint32_t);
90extern wait_guard_t waitq_sleep_prepare(waitq_t *);
91extern errno_t waitq_sleep_unsafe(waitq_t *, wait_guard_t);
92extern errno_t waitq_sleep_timeout_unsafe(waitq_t *, uint32_t, unsigned int, wait_guard_t);
93
94extern void waitq_wake_one(waitq_t *);
95extern void waitq_wake_all(waitq_t *);
96extern void waitq_signal(waitq_t *);
97extern void waitq_close(waitq_t *);
[f761f1eb]98
99#endif
[b45c443]100
[06e1e95]101/** @}
[b45c443]102 */
Note: See TracBrowser for help on using the repository browser.