Changeset f787c8e in mainline for uspace/lib/c/include/fibril_synch.h


Ignore:
Timestamp:
2018-08-01T18:37:54Z (7 years ago)
Author:
Jiří Zárevúcky <jiri.zarevucky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
82d9087
Parents:
1de92fb0
Message:

Move some internal interfaces to private headers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/include/fibril_synch.h

    r1de92fb0 rf787c8e  
    4141#include <sys/time.h>
    4242#include <stdbool.h>
    43 #include <futex.h>
    44 
    45 /**
    46  * "Restricted" fibril mutex.
    47  *
    48  * Similar to `fibril_mutex_t`, but has a set of restrictions placed on its
    49  * use. Within a rmutex critical section, you
    50  *         - may not use any other synchronization primitive,
    51  *           save for another `fibril_rmutex_t`. This includes nonblocking
    52  *           operations like cvar signal and mutex unlock, unless otherwise
    53  *           specified.
    54  *         - may not read IPC messages
    55  *         - may not start a new thread/fibril
    56  *           (creating fibril without starting is fine)
    57  *
    58  * Additionally, locking with a timeout is not possible on this mutex,
    59  * and there is no associated condition variable type.
    60  * This is a design constraint, not a lack of implementation effort.
    61  */
    62 typedef struct {
    63         // TODO: At this point, this is just silly handwaving to hide current
    64         //       futex use behind a fibril based abstraction. Later, the imple-
    65         //       mentation will change, but the restrictions placed on this type
    66         //       will allow it to be simpler and faster than a regular mutex.
    67         //       There might also be optional debug checking of the assumptions.
    68         //
    69         //       Note that a consequence of the restrictions is that if we are
    70         //       running on a single thread, no other fibril can ever get to run
    71         //       while a fibril has a rmutex locked. That means that for
    72         //       single-threaded programs, we can reduce all rmutex locks and
    73         //       unlocks to simple branches on a global bool variable.
    74 
    75         futex_t futex;
    76 } fibril_rmutex_t;
    77 
    78 #define FIBRIL_RMUTEX_INITIALIZER(name) \
    79         { .futex = FUTEX_INITIALIZE(1) }
    80 
    81 #define FIBRIL_RMUTEX_INITIALIZE(name) \
    82         fibril_rmutex_t name = FIBRIL_RMUTEX_INITIALIZER(name)
    8343
    8444typedef struct {
     
    204164        fibril_semaphore_t name = FIBRIL_SEMAPHORE_INITIALIZER(name, cnt)
    205165
    206 extern void fibril_rmutex_initialize(fibril_rmutex_t *);
    207 extern void fibril_rmutex_lock(fibril_rmutex_t *);
    208 extern bool fibril_rmutex_trylock(fibril_rmutex_t *);
    209 extern void fibril_rmutex_unlock(fibril_rmutex_t *);
    210 
    211166extern void fibril_mutex_initialize(fibril_mutex_t *);
    212167extern void fibril_mutex_lock(fibril_mutex_t *);
Note: See TracChangeset for help on using the changeset viewer.