Ignore:
File:
1 edited

Legend:

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

    r2965d18 rf787c8e  
    3535#include <abi/proc/uarg.h>
    3636#include <atomic.h>
    37 #include <futex.h>
     37#include <fibril.h>
     38
     39#include "./futex.h"
     40
     41typedef struct {
     42        fibril_t *fibril;
     43} fibril_event_t;
     44
     45#define FIBRIL_EVENT_INIT ((fibril_event_t) {0})
    3846
    3947struct fibril {
     
    7381extern void __fibrils_init(void);
    7482
     83extern void fibril_wait_for(fibril_event_t *);
     84extern errno_t fibril_wait_timeout(fibril_event_t *, const struct timeval *);
     85extern void fibril_notify(fibril_event_t *);
     86
     87extern errno_t fibril_ipc_wait(ipc_call_t *, const struct timeval *);
     88extern 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 */
     107typedef 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
     129extern void fibril_rmutex_initialize(fibril_rmutex_t *);
     130extern void fibril_rmutex_lock(fibril_rmutex_t *);
     131extern bool fibril_rmutex_trylock(fibril_rmutex_t *);
     132extern void fibril_rmutex_unlock(fibril_rmutex_t *);
     133
     134
    75135#endif
Note: See TracChangeset for help on using the changeset viewer.