diff options
author | davidxu <davidxu@FreeBSD.org> | 2007-11-21 04:21:02 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2007-11-21 04:21:02 +0000 |
commit | 648833c9531994ca86ff55eaabdde1c3f8b9e6d0 (patch) | |
tree | 393b57a295e0e0241ac0224ce5ea921b0ea42d75 /sys | |
parent | b607c8d8ad8a9a7639a87f1bc13821a2294feffa (diff) | |
download | FreeBSD-src-648833c9531994ca86ff55eaabdde1c3f8b9e6d0.zip FreeBSD-src-648833c9531994ca86ff55eaabdde1c3f8b9e6d0.tar.gz |
Add function UMTX_OP_WAIT_UINT, the function causes thread to wait for
an integer to be changed.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/kern_umtx.c | 26 | ||||
-rw-r--r-- | sys/sys/umtx.h | 3 |
2 files changed, 26 insertions, 3 deletions
diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index 6df3ce7..5f572be 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -2386,6 +2386,26 @@ __umtx_op_wait(struct thread *td, struct _umtx_op_args *uap) } static int +__umtx_op_wait_uint(struct thread *td, struct _umtx_op_args *uap) +{ + struct timespec *ts, timeout; + int error; + + if (uap->uaddr2 == NULL) + ts = NULL; + else { + error = copyin(uap->uaddr2, &timeout, sizeof(timeout)); + if (error != 0) + return (error); + if (timeout.tv_nsec >= 1000000000 || + timeout.tv_nsec < 0) + return (EINVAL); + ts = &timeout; + } + return do_wait(td, uap->obj, uap->val, ts, 1); +} + +static int __umtx_op_wake(struct thread *td, struct _umtx_op_args *uap) { return (kern_umtx_wake(td, uap->obj, uap->val)); @@ -2480,7 +2500,8 @@ static _umtx_op_func op_table[] = { __umtx_op_set_ceiling, /* UMTX_OP_SET_CEILING */ __umtx_op_cv_wait, /* UMTX_OP_CV_WAIT*/ __umtx_op_cv_signal, /* UMTX_OP_CV_SIGNAL */ - __umtx_op_cv_broadcast /* UMTX_OP_CV_BROADCAST */ + __umtx_op_cv_broadcast, /* UMTX_OP_CV_BROADCAST */ + __umtx_op_wait_uint /* UMTX_OP_WAIT_UINT */ }; int @@ -2626,7 +2647,8 @@ static _umtx_op_func op_table_compat32[] = { __umtx_op_set_ceiling, /* UMTX_OP_SET_CEILING */ __umtx_op_cv_wait_compat32, /* UMTX_OP_CV_WAIT*/ __umtx_op_cv_signal, /* UMTX_OP_CV_SIGNAL */ - __umtx_op_cv_broadcast /* UMTX_OP_CV_BROADCAST */ + __umtx_op_cv_broadcast, /* UMTX_OP_CV_BROADCAST */ + __umtx_op_wait_compat32 /* UMTX_OP_WAIT_UINT */ }; int diff --git a/sys/sys/umtx.h b/sys/sys/umtx.h index 6631be7..e90fa67 100644 --- a/sys/sys/umtx.h +++ b/sys/sys/umtx.h @@ -78,7 +78,8 @@ struct ucond { #define UMTX_OP_CV_WAIT 8 #define UMTX_OP_CV_SIGNAL 9 #define UMTX_OP_CV_BROADCAST 10 -#define UMTX_OP_MAX 11 +#define UMTX_OP_WAIT_UINT 11 +#define UMTX_OP_MAX 12 /* flags for UMTX_OP_CV_WAIT */ #define UMTX_CHECK_UNPARKING 0x01 |