Changeset 111b9b9 in mainline for kernel/generic/include/synch/waitq.h


Ignore:
Timestamp:
2023-02-11T19:13:44Z (20 months ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4777e02
Parents:
76e17d7c
git-author:
Jiří Zárevúcky <zarevucky.jiri@…> (2022-08-15 17:46:39)
git-committer:
Jiří Zárevúcky <zarevucky.jiri@…> (2023-02-11 19:13:44)
Message:

Reimplement waitq using thread_wait/wakeup

This adds a few functions to the thread API which can be
summarized as "stop running until woken up by others".
The ordering and context-switching concerns are thus yeeted
to this abstraction and waitq only deals with maintaining
the queues. Overall, this makes the control flow in waitq
much easier to navigate.

File:
1 edited

Legend:

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

    r76e17d7c r111b9b9  
    4141#include <adt/list.h>
    4242
    43 typedef enum {
    44         WAKEUP_FIRST = 0,
    45         WAKEUP_ALL,
    46         WAKEUP_CLOSE,
    47 } wakeup_mode_t;
    48 
    4943/** Wait queue structure.
    5044 *
     
    5852
    5953        /**
    60          * Number of waitq_wakeup() calls that didn't find a thread to wake up.
    61          *
     54         * If negative, number of wakeups that are to be ignored (necessary for futex operation).
     55         * If positive, number of wakeups that weren't able to wake a thread.
    6256         */
    63         int missed_wakeups;
    64 
    65         /** Number of wakeups that need to be ignored due to futex timeout. */
    66         int ignore_wakeups;
     57        int wakeup_balance;
    6758
    6859        /** List of sleeping threads for which there was no missed_wakeup. */
    6960        list_t sleepers;
     61
     62        bool closed;
    7063} waitq_t;
     64
     65typedef struct wait_guard {
     66        ipl_t ipl;
     67} wait_guard_t;
    7168
    7269struct thread;
     
    7572extern void waitq_initialize_with_count(waitq_t *, int);
    7673extern errno_t waitq_sleep(waitq_t *);
    77 extern errno_t waitq_sleep_timeout(waitq_t *, uint32_t, unsigned int, bool *);
    78 extern ipl_t waitq_sleep_prepare(waitq_t *);
    79 extern errno_t waitq_sleep_unsafe(waitq_t *, bool *);
    80 extern errno_t waitq_sleep_timeout_unsafe(waitq_t *, uint32_t, unsigned int, bool *);
    81 extern void waitq_sleep_finish(waitq_t *, bool, ipl_t);
    82 extern void waitq_wakeup(waitq_t *, wakeup_mode_t);
    83 extern void _waitq_wakeup_unsafe(waitq_t *, wakeup_mode_t);
    84 extern void waitq_interrupt_sleep(struct thread *);
     74extern errno_t _waitq_sleep_timeout(waitq_t *, uint32_t, unsigned int);
     75extern errno_t waitq_sleep_timeout(waitq_t *, uint32_t);
     76extern wait_guard_t waitq_sleep_prepare(waitq_t *);
     77extern errno_t waitq_sleep_unsafe(waitq_t *, wait_guard_t);
     78extern errno_t waitq_sleep_timeout_unsafe(waitq_t *, uint32_t, unsigned int, wait_guard_t);
     79
     80extern void waitq_wake_one(waitq_t *);
     81extern void waitq_wake_all(waitq_t *);
     82extern void waitq_signal(waitq_t *);
     83extern void waitq_close(waitq_t *);
    8584
    8685#endif
Note: See TracChangeset for help on using the changeset viewer.