Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/private/fibril.h

    rf787c8e r2965d18  
    3535#include <abi/proc/uarg.h>
    3636#include <atomic.h>
    37 #include <fibril.h>
    38 
    39 #include "./futex.h"
    40 
    41 typedef struct {
    42         fibril_t *fibril;
    43 } fibril_event_t;
    44 
    45 #define FIBRIL_EVENT_INIT ((fibril_event_t) {0})
     37#include <futex.h>
    4638
    4739struct fibril {
     
    8173extern void __fibrils_init(void);
    8274
    83 extern void fibril_wait_for(fibril_event_t *);
    84 extern errno_t fibril_wait_timeout(fibril_event_t *, const struct timeval *);
    85 extern void fibril_notify(fibril_event_t *);
    86 
    87 extern errno_t fibril_ipc_wait(ipc_call_t *, const struct timeval *);
    88 extern void fibril_ipc_poke(void);
    89 
    90 /**
    91  * "Restricted" fibril mutex.
    92  *
    93  * Similar to `fibril_mutex_t`, but has a set of restrictions placed on its
    94  * use. Within a rmutex critical section, you
    95  *         - may not use any other synchronization primitive,
    96  *           save for another `fibril_rmutex_t`. This includes nonblocking
    97  *           operations like cvar signal and mutex unlock, unless otherwise
    98  *           specified.
    99  *         - may not read IPC messages
    100  *         - may not start a new thread/fibril
    101  *           (creating fibril without starting is fine)
    102  *
    103  * Additionally, locking with a timeout is not possible on this mutex,
    104  * and there is no associated condition variable type.
    105  * This is a design constraint, not a lack of implementation effort.
    106  */
    107 typedef struct {
    108         // TODO: At this point, this is just silly handwaving to hide current
    109         //       futex use behind a fibril based abstraction. Later, the imple-
    110         //       mentation will change, but the restrictions placed on this type
    111         //       will allow it to be simpler and faster than a regular mutex.
    112         //       There might also be optional debug checking of the assumptions.
    113         //
    114         //       Note that a consequence of the restrictions is that if we are
    115         //       running on a single thread, no other fibril can ever get to run
    116         //       while a fibril has a rmutex locked. That means that for
    117         //       single-threaded programs, we can reduce all rmutex locks and
    118         //       unlocks to simple branches on a global bool variable.
    119 
    120         futex_t futex;
    121 } fibril_rmutex_t;
    122 
    123 #define FIBRIL_RMUTEX_INITIALIZER(name) \
    124         { .futex = FUTEX_INITIALIZE(1) }
    125 
    126 #define FIBRIL_RMUTEX_INITIALIZE(name) \
    127         fibril_rmutex_t name = FIBRIL_RMUTEX_INITIALIZER(name)
    128 
    129 extern void fibril_rmutex_initialize(fibril_rmutex_t *);
    130 extern void fibril_rmutex_lock(fibril_rmutex_t *);
    131 extern bool fibril_rmutex_trylock(fibril_rmutex_t *);
    132 extern void fibril_rmutex_unlock(fibril_rmutex_t *);
    133 
    134 
    13575#endif
Note: See TracChangeset for help on using the changeset viewer.