Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/synch/waitq.h

    r597fa24 rd314571  
    4141#include <adt/list.h>
    4242
    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)
     43typedef enum {
     44        WAKEUP_FIRST = 0,
     45        WAKEUP_ALL
     46} wakeup_mode_t;
    5647
    5748/** Wait queue structure.
     
    6657
    6758        /**
    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.
     59         * Number of waitq_wakeup() calls that didn't find a thread to wake up.
     60         *
    7061         */
    71         int wakeup_balance;
     62        int missed_wakeups;
     63
     64        /** Number of wakeups that need to be ignored due to futex timeout. */
     65        int ignore_wakeups;
    7266
    7367        /** List of sleeping threads for which there was no missed_wakeup. */
    7468        list_t sleepers;
    75 
    76         bool closed;
    7769} waitq_t;
    7870
    79 typedef struct wait_guard {
    80         ipl_t ipl;
    81 } wait_guard_t;
     71#define waitq_sleep(wq) \
     72        waitq_sleep_timeout((wq), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE, NULL)
    8273
    8374struct thread;
    8475
    8576extern void waitq_initialize(waitq_t *);
    86 extern void waitq_initialize_with_count(waitq_t *, int);
    87 extern errno_t waitq_sleep(waitq_t *);
    88 extern errno_t _waitq_sleep_timeout(waitq_t *, uint32_t, unsigned int);
    89 extern errno_t waitq_sleep_timeout(waitq_t *, uint32_t);
    90 extern wait_guard_t waitq_sleep_prepare(waitq_t *);
    91 extern errno_t waitq_sleep_unsafe(waitq_t *, wait_guard_t);
    92 extern errno_t waitq_sleep_timeout_unsafe(waitq_t *, uint32_t, unsigned int, wait_guard_t);
    93 
    94 extern void waitq_wake_one(waitq_t *);
    95 extern void waitq_wake_all(waitq_t *);
    96 extern void waitq_signal(waitq_t *);
    97 extern void waitq_close(waitq_t *);
     77extern errno_t waitq_sleep_timeout(waitq_t *, uint32_t, unsigned int, bool *);
     78extern ipl_t waitq_sleep_prepare(waitq_t *);
     79extern errno_t waitq_sleep_timeout_unsafe(waitq_t *, uint32_t, unsigned int, bool *);
     80extern void waitq_sleep_finish(waitq_t *, bool, ipl_t);
     81extern void waitq_wakeup(waitq_t *, wakeup_mode_t);
     82extern void _waitq_wakeup_unsafe(waitq_t *, wakeup_mode_t);
     83extern void waitq_interrupt_sleep(struct thread *);
     84extern int waitq_count_get(waitq_t *);
     85extern void waitq_count_set(waitq_t *, int val);
    9886
    9987#endif
Note: See TracChangeset for help on using the changeset viewer.