История изменений
Исправление 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 вручную, не проверяя флаг.