LINUX.ORG.RU

История изменений

Исправление SkyMaverick, (текущая версия) :

Кстати, действительно, соглашусь. Лучше разделить на две процедуры (которые инлайнятся) и вызывать нужный unlock вручную, не проверяя флаг.

upd. или слегка переделать unlock. Так гонок нет.

TAF_API int
taf_rwlock_unlock(uintptr_t m) {
    if (!m)
        return -1;
    rwlock_t *lock = (rwlock_t *)m;

    uint64_t flags = atomic_load(&lock->flags);

    uint64_t ref_count = flags & RWLOCK_COUNTER_MASK;
    if (ref_count != 0) {
       return _rwlock_unlock_read(lock);
    } else if (flags & RWLOCK_WRITE_FLAG) {
        return _rwlock_unlock_write(lock);
    }
    return 0;
}

Исправление SkyMaverick, :

Кстати, действительно, соглашусь. Лучше разделить на две процедуры (которые инлайнятся) и вызывать нужный unlock вручную, не проверяя флаг.

upd. или слегка переделать unlock. Так гонок нет.

TAF_API int
taf_rwlock_unlock(uintptr_t m) {
    if (!m)
        return -1;
    rwlock_t *lock = (rwlock_t *)m;

    uint64_t flags = atomic_load(&lock->flags);

    uint64_t ref_count = flags & RWLOCK_COUNTER_MASK;
    if (ref_count == 0) {
       return _rwlock_unlock_read(lock);
    } else if (flags & RWLOCK_WRITE_FLAG) {
        return _rwlock_unlock_write(lock);
    }
    return 0;
}

Исходная версия SkyMaverick, :

Кстати, действительно, соглашусь. Лучше разделить на две процедуры (которые инлайнятся) и вызывать нужный unlock вручную, не проверяя флаг.