Implement clockid_t handling to pthread_rwlock timeout

This commit is contained in:
Wildan M
2026-03-29 10:51:04 +07:00
parent e589a94c6d
commit 928a446f12
2 changed files with 81 additions and 23 deletions
+41 -15
View File
@@ -2,7 +2,7 @@ use super::*;
use crate::header::errno::{EBUSY, EINVAL};
use crate::pthread::Pshared;
use crate::{error::ResultExt, header::time::CLOCK_REALTIME, pthread::Pshared};
#[unsafe(no_mangle)]
pub unsafe extern "C" fn pthread_rwlock_init(
@@ -23,27 +23,52 @@ pub unsafe extern "C" fn pthread_rwlock_init(
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn pthread_rwlock_rdlock(rwlock: *mut pthread_rwlock_t) -> c_int {
unsafe { get(rwlock) }.acquire_read_lock(None);
0
unsafe { get(rwlock) }
.acquire_read_lock(None)
.map(|_| 0)
.or_minus_one_errno()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn pthread_rwlock_clockrdlock(
rwlock: *mut pthread_rwlock_t,
clock_id: clockid_t,
abstime: *const timespec,
) -> c_int {
unsafe { get(rwlock) }
.acquire_read_lock(Some((unsafe { &*abstime }, clock_id)))
.map(|_| 0)
.or_minus_one_errno()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn pthread_rwlock_timedrdlock(
rwlock: *mut pthread_rwlock_t,
timeout: *const timespec,
abstime: *const timespec,
) -> c_int {
unsafe { get(rwlock) }.acquire_read_lock(Some(unsafe { &*timeout }));
0
unsafe { get(rwlock) }
.acquire_read_lock(Some((unsafe { &*abstime }, CLOCK_REALTIME)))
.map(|_| 0)
.or_minus_one_errno()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn pthread_rwlock_clockwrlock(
rwlock: *mut pthread_rwlock_t,
clock_id: clockid_t,
abstime: *const timespec,
) -> c_int {
unsafe { get(rwlock) }
.acquire_write_lock(Some((unsafe { &*abstime }, clock_id)))
.map(|_| 0)
.or_minus_one_errno()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn pthread_rwlock_timedwrlock(
rwlock: *mut pthread_rwlock_t,
timeout: *const timespec,
abstime: *const timespec,
) -> c_int {
unsafe { get(rwlock) }.acquire_write_lock(Some(unsafe { &*timeout }));
0
unsafe { get(rwlock) }
.acquire_write_lock(Some((unsafe { &*abstime }, CLOCK_REALTIME)))
.map(|_| 0)
.or_minus_one_errno()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn pthread_rwlock_tryrdlock(rwlock: *mut pthread_rwlock_t) -> c_int {
@@ -67,9 +92,10 @@ pub unsafe extern "C" fn pthread_rwlock_unlock(rwlock: *mut pthread_rwlock_t) ->
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn pthread_rwlock_wrlock(rwlock: *mut pthread_rwlock_t) -> c_int {
unsafe { get(rwlock) }.acquire_write_lock(None);
0
unsafe { get(rwlock) }
.acquire_write_lock(None)
.map(|_| 0)
.or_minus_one_errno()
}
#[unsafe(no_mangle)]