Changeset 2965d18 in mainline


Ignore:
Timestamp:
2018-07-30T20:15:38Z (6 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:
d4b7b29
Parents:
8080262
git-author:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-07-30 19:53:13)
git-committer:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-07-30 20:15:38)
Message:

Add debug counter for rmutex locks.

Location:
uspace/lib/c
Files:
6 edited

Legend:

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

    r8080262 r2965d18  
    476476static void _fibril_switch_to(_switch_type_t type, fibril_t *dstf, bool locked)
    477477{
     478        assert(fibril_self()->rmutex_locks == 0);
     479
    478480        if (!locked)
    479481                futex_lock(&fibril_futex);
     
    633635errno_t fibril_wait_timeout(fibril_event_t *event, const struct timeval *expires)
    634636{
     637        assert(fibril_self()->rmutex_locks == 0);
     638
    635639        DPRINTF("### Fibril %p sleeping on event %p.\n", fibril_self(), event);
    636640
     
    713717void fibril_wait_for(fibril_event_t *event)
    714718{
     719        assert(fibril_self()->rmutex_locks == 0);
     720
    715721        (void) fibril_wait_timeout(event, NULL);
    716722}
     
    769775void fibril_yield(void)
    770776{
     777        if (fibril_self()->rmutex_locks > 0)
     778                return;
     779
    771780        fibril_t *f = _ready_list_pop_nonblocking(false);
    772781        if (f)
     
    789798int fibril_test_spawn_runners(int n)
    790799{
     800        assert(fibril_self()->rmutex_locks == 0);
     801
    791802        if (!multithreaded) {
    792803                _ready_debug_check();
  • uspace/lib/c/generic/fibril_synch.c

    r8080262 r2965d18  
    5050#include "private/async.h"
    5151#include "private/fibril.h"
     52
     53void fibril_rmutex_initialize(fibril_rmutex_t *m)
     54{
     55        futex_initialize(&m->futex, 1);
     56}
     57
     58/**
     59 * Lock restricted mutex.
     60 * When a restricted mutex is locked, the fibril may not sleep or create new
     61 * threads. Any attempt to do so will abort the program.
     62 */
     63void fibril_rmutex_lock(fibril_rmutex_t *m)
     64{
     65        futex_lock(&m->futex);
     66        fibril_self()->rmutex_locks++;
     67}
     68
     69bool fibril_rmutex_trylock(fibril_rmutex_t *m)
     70{
     71        if (futex_trylock(&m->futex)) {
     72                fibril_self()->rmutex_locks++;
     73                return true;
     74        } else {
     75                return false;
     76        }
     77}
     78
     79void fibril_rmutex_unlock(fibril_rmutex_t *m)
     80{
     81        fibril_self()->rmutex_locks--;
     82        futex_unlock(&m->futex);
     83}
    5284
    5385static fibril_local bool deadlocked = false;
  • uspace/lib/c/generic/futex.c

    r8080262 r2965d18  
    4343
    4444//#define DPRINTF(...) kio_printf(__VA_ARGS__)
    45 #define DPRINTF(...) ((void)0)
     45#define DPRINTF(...) dummy_printf(__VA_ARGS__)
    4646
    4747/** Initialize futex counter.
     
    8484         * They should compile to regular load/stores, but simple assignments
    8585         * would be UB by definition.
     86         * The proper ordering is ensured by the surrounding futex operation.
    8687         */
    8788
     
    9495        assert(prev_owner == NULL);
    9596        __atomic_store_n(&futex->owner, self, __ATOMIC_RELAXED);
    96 
    97         atomic_inc(&self->futex_locks);
    9897}
    9998
     
    104103        __futex_assert_is_locked(futex, name);
    105104        __atomic_store_n(&futex->owner, NULL, __ATOMIC_RELAXED);
    106         atomic_dec(&self->futex_locks);
    107105        futex_up(futex);
    108106}
     
    117115
    118116                __atomic_store_n(&futex->owner, self, __ATOMIC_RELAXED);
    119 
    120                 atomic_inc(&self->futex_locks);
    121117
    122118                DPRINTF("Trylock on futex %s (%p) by fibril %p succeeded.\n", name, futex, self);
     
    135131
    136132        __futex_assert_is_locked(futex, name);
    137         atomic_dec(&self->futex_locks);
    138         atomic_inc(&no->futex_locks);
    139133        __atomic_store_n(&futex->owner, new_owner, __ATOMIC_RELAXED);
    140134}
  • uspace/lib/c/generic/private/fibril.h

    r8080262 r2965d18  
    6161
    6262        /* Debugging stuff. */
    63         atomic_t futex_locks;
     63        int rmutex_locks;
    6464        fibril_owner_info_t *waits_for;
    6565        fibril_event_t *sleep_event;
  • uspace/lib/c/include/fibril_synch.h

    r8080262 r2965d18  
    8080#define FIBRIL_RMUTEX_INITIALIZE(name) \
    8181        fibril_rmutex_t name = FIBRIL_RMUTEX_INITIALIZER(name)
    82 
    83 static inline void fibril_rmutex_initialize(fibril_rmutex_t *m)
    84 {
    85         futex_initialize(&m->futex, 1);
    86 }
    87 
    88 static inline void fibril_rmutex_lock(fibril_rmutex_t *m)
    89 {
    90         futex_lock(&m->futex);
    91 }
    92 
    93 static inline bool fibril_rmutex_trylock(fibril_rmutex_t *m)
    94 {
    95         return futex_trylock(&m->futex);
    96 }
    97 
    98 static inline void fibril_rmutex_unlock(fibril_rmutex_t *m)
    99 {
    100         futex_unlock(&m->futex);
    101 }
    10282
    10383typedef struct {
     
    222202        fibril_semaphore_t name = FIBRIL_SEMAPHORE_INITIALIZER(name, cnt)
    223203
     204extern void fibril_rmutex_initialize(fibril_rmutex_t *);
     205extern void fibril_rmutex_lock(fibril_rmutex_t *);
     206extern bool fibril_rmutex_trylock(fibril_rmutex_t *);
     207extern void fibril_rmutex_unlock(fibril_rmutex_t *);
     208
    224209extern void fibril_mutex_initialize(fibril_mutex_t *);
    225210extern void fibril_mutex_lock(fibril_mutex_t *);
  • uspace/lib/c/include/io/kio.h

    r8080262 r2965d18  
    4949extern int kio_vprintf(const char *, va_list);
    5050
     51/*
     52 * In some files, we have conditional DPRINTF(...) macro that is defined empty
     53 * in most cases. Provide a dummy printf so we get argument checking and
     54 * avoid unused variable errors.
     55 */
     56
     57static inline int dummy_printf(const char *fmt, ...) _HELENOS_PRINTF_ATTRIBUTE(1, 2);
     58static inline int dummy_printf(const char *fmt, ...)
     59{
     60        /* Empty. */
     61        (void) fmt;
     62        return 0;
     63}
     64
    5165#endif
    5266
Note: See TracChangeset for help on using the changeset viewer.