mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 14:00:30 +00:00
hurd: Add __lll_abstimed_wait_intr
For semaphores, we need an interruptible version of low-level locks.
This commit is contained in:
parent
bec412424e
commit
59bb023c83
@ -93,6 +93,7 @@ CFLAGS-RPC_exec_startup_get_info.o = $(no-stack-protector)
|
|||||||
# Make generated headers compatible with all support standards
|
# Make generated headers compatible with all support standards
|
||||||
migheaderpipe := | sed -e 's/\<ino64_t\>/__ino64_t/' -e 's/\<loff_t\>/__loff_t/'
|
migheaderpipe := | sed -e 's/\<ino64_t\>/__ino64_t/' -e 's/\<loff_t\>/__loff_t/'
|
||||||
include ../mach/Machrules
|
include ../mach/Machrules
|
||||||
|
libhurduser-routines += RPC_gsync_wait_intr
|
||||||
include ../Rules
|
include ../Rules
|
||||||
|
|
||||||
# intr-rpc.defs defines the INTR_INTERFACE macro to make the generated RPC
|
# intr-rpc.defs defines the INTR_INTERFACE macro to make the generated RPC
|
||||||
|
4
hurd/RPC_gsync_wait_intr.c
Normal file
4
hurd/RPC_gsync_wait_intr.c
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#include "intr-rpc.h"
|
||||||
|
#define gsync_wait gsync_wait_intr
|
||||||
|
#define __gsync_wait __gsync_wait_intr
|
||||||
|
#include "RPC_gsync_wait.c"
|
@ -149,7 +149,7 @@ libc {
|
|||||||
|
|
||||||
GLIBC_PRIVATE {
|
GLIBC_PRIVATE {
|
||||||
# Used by other libs.
|
# Used by other libs.
|
||||||
__lll_abstimed_wait; __lll_abstimed_xwait;
|
__lll_abstimed_wait; __lll_abstimed_wait_intr; __lll_abstimed_xwait;
|
||||||
__lll_abstimed_lock; __lll_robust_lock;
|
__lll_abstimed_lock; __lll_robust_lock;
|
||||||
__lll_robust_abstimed_lock; __lll_robust_trylock;
|
__lll_robust_abstimed_lock; __lll_robust_trylock;
|
||||||
__lll_robust_unlock;
|
__lll_robust_unlock;
|
||||||
|
@ -54,6 +54,17 @@ __lll_abstimed_wait (void *ptr, int val,
|
|||||||
return mlsec < 0 ? KERN_TIMEDOUT : __lll_timed_wait (ptr, val, mlsec, flags);
|
return mlsec < 0 ? KERN_TIMEDOUT : __lll_timed_wait (ptr, val, mlsec, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
__lll_abstimed_wait_intr (void *ptr, int val,
|
||||||
|
const struct timespec *tsp, int flags, int clk)
|
||||||
|
{
|
||||||
|
if (clk != CLOCK_REALTIME)
|
||||||
|
return EINVAL;
|
||||||
|
|
||||||
|
int mlsec = compute_reltime (tsp, clk);
|
||||||
|
return mlsec < 0 ? KERN_TIMEDOUT : __lll_timed_wait_intr (ptr, val, mlsec, flags);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
__lll_abstimed_xwait (void *ptr, int lo, int hi,
|
__lll_abstimed_xwait (void *ptr, int lo, int hi,
|
||||||
const struct timespec *tsp, int flags, int clk)
|
const struct timespec *tsp, int flags, int clk)
|
||||||
|
@ -40,6 +40,11 @@ struct timespec;
|
|||||||
__gsync_wait (__mach_task_self (), \
|
__gsync_wait (__mach_task_self (), \
|
||||||
(vm_offset_t)ptr, val, 0, mlsec, flags | GSYNC_TIMED)
|
(vm_offset_t)ptr, val, 0, mlsec, flags | GSYNC_TIMED)
|
||||||
|
|
||||||
|
/* Interruptible version. */
|
||||||
|
#define __lll_timed_wait_intr(ptr, val, mlsec, flags) \
|
||||||
|
__gsync_wait_intr (__mach_task_self (), \
|
||||||
|
(vm_offset_t)ptr, val, 0, mlsec, flags | GSYNC_TIMED)
|
||||||
|
|
||||||
/* Same as '__lll_xwait', but only block for MLSEC milliseconds. */
|
/* Same as '__lll_xwait', but only block for MLSEC milliseconds. */
|
||||||
#define __lll_timed_xwait(ptr, lo, hi, mlsec, flags) \
|
#define __lll_timed_xwait(ptr, lo, hi, mlsec, flags) \
|
||||||
__gsync_wait (__mach_task_self (), (vm_offset_t)ptr, \
|
__gsync_wait (__mach_task_self (), (vm_offset_t)ptr, \
|
||||||
@ -50,6 +55,10 @@ struct timespec;
|
|||||||
extern int __lll_abstimed_wait (void *__ptr, int __val,
|
extern int __lll_abstimed_wait (void *__ptr, int __val,
|
||||||
const struct timespec *__tsp, int __flags, int __clk);
|
const struct timespec *__tsp, int __flags, int __clk);
|
||||||
|
|
||||||
|
/* Interruptible version. */
|
||||||
|
extern int __lll_abstimed_wait_intr (void *__ptr, int __val,
|
||||||
|
const struct timespec *__tsp, int __flags, int __clk);
|
||||||
|
|
||||||
/* Same as 'lll_xwait', but only block until TSP elapses,
|
/* Same as 'lll_xwait', but only block until TSP elapses,
|
||||||
using clock CLK. */
|
using clock CLK. */
|
||||||
extern int __lll_abstimed_xwait (void *__ptr, int __lo, int __hi,
|
extern int __lll_abstimed_xwait (void *__ptr, int __lo, int __hi,
|
||||||
@ -106,6 +115,13 @@ extern void __lll_robust_unlock (void *__ptr, int __flags);
|
|||||||
__clk[sizeof (__clk) / sizeof (__clk[0]) - 1]); \
|
__clk[sizeof (__clk) / sizeof (__clk[0]) - 1]); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#define lll_abstimed_wait_intr(var, val, tsp, flags, ...) \
|
||||||
|
({ \
|
||||||
|
const clockid_t __clk[] = { CLOCK_REALTIME, ##__VA_ARGS__ }; \
|
||||||
|
__lll_abstimed_wait_intr (&(var), (val), (tsp), (flags), \
|
||||||
|
__clk[sizeof (__clk) / sizeof (__clk[0]) - 1]); \
|
||||||
|
})
|
||||||
|
|
||||||
#define lll_abstimed_xwait(var, lo, hi, tsp, flags, ...) \
|
#define lll_abstimed_xwait(var, lo, hi, tsp, flags, ...) \
|
||||||
({ \
|
({ \
|
||||||
const clockid_t __clk[] = { CLOCK_REALTIME, ##__VA_ARGS__ }; \
|
const clockid_t __clk[] = { CLOCK_REALTIME, ##__VA_ARGS__ }; \
|
||||||
|
@ -34,6 +34,17 @@
|
|||||||
/* Static initializer for low-level locks. */
|
/* Static initializer for low-level locks. */
|
||||||
#define LLL_LOCK_INITIALIZER 0
|
#define LLL_LOCK_INITIALIZER 0
|
||||||
|
|
||||||
|
/* Interruptible version of __gsync_wait. */
|
||||||
|
extern kern_return_t __gsync_wait_intr
|
||||||
|
(
|
||||||
|
mach_port_t task,
|
||||||
|
vm_offset_t addr,
|
||||||
|
unsigned val1,
|
||||||
|
unsigned val2,
|
||||||
|
natural_t msec,
|
||||||
|
int flags
|
||||||
|
);
|
||||||
|
|
||||||
/* Wait on address PTR, without blocking if its contents
|
/* Wait on address PTR, without blocking if its contents
|
||||||
* are different from VAL. */
|
* are different from VAL. */
|
||||||
#define __lll_wait(ptr, val, flags) \
|
#define __lll_wait(ptr, val, flags) \
|
||||||
@ -42,6 +53,13 @@
|
|||||||
#define lll_wait(var, val, flags) \
|
#define lll_wait(var, val, flags) \
|
||||||
__lll_wait (&(var), val, flags)
|
__lll_wait (&(var), val, flags)
|
||||||
|
|
||||||
|
/* Interruptible version. */
|
||||||
|
#define __lll_wait_intr(ptr, val, flags) \
|
||||||
|
__gsync_wait_intr (__mach_task_self (), \
|
||||||
|
(vm_offset_t)(ptr), (val), 0, 0, (flags))
|
||||||
|
#define lll_wait_intr(var, val, flags) \
|
||||||
|
__lll_wait_intr ((&var), val, flags)
|
||||||
|
|
||||||
/* Wake one or more threads waiting on address PTR. */
|
/* Wake one or more threads waiting on address PTR. */
|
||||||
#define __lll_wake(ptr, flags) \
|
#define __lll_wake(ptr, flags) \
|
||||||
__gsync_wake (__mach_task_self (), (vm_offset_t)(ptr), 0, (flags))
|
__gsync_wake (__mach_task_self (), (vm_offset_t)(ptr), 0, (flags))
|
||||||
|
Loading…
Reference in New Issue
Block a user