Index: lib/libc/gen/sysconf.3 =================================================================== RCS file: /cvsroot/src/lib/libc/gen/sysconf.3,v retrieving revision 1.48 diff -u -p -u -r1.48 sysconf.3 --- lib/libc/gen/sysconf.3 10 Jun 2016 23:29:20 -0000 1.48 +++ lib/libc/gen/sysconf.3 23 Jun 2016 17:08:43 -0000 @@ -178,6 +178,8 @@ and its Threads option to which the system attempts to conform, otherwise \-1. +.It Li _SC_THREAD_PRIO_PROTECT +System supports the priority ceiling protocol for POSIX threads. .It Li _SC_TIMERS The version of .St -p1003.1 Index: lib/libc/gen/sysconf.c =================================================================== RCS file: /cvsroot/src/lib/libc/gen/sysconf.c,v retrieving revision 1.39 diff -u -p -u -r1.39 sysconf.c --- lib/libc/gen/sysconf.c 10 Jun 2016 23:29:20 -0000 1.39 +++ lib/libc/gen/sysconf.c 23 Jun 2016 17:08:43 -0000 @@ -411,9 +411,10 @@ yesno: if (sysctl(mib, mib_len, &value, return _POSIX_THREAD_ATTR_STACKSIZE; case _SC_THREAD_SAFE_FUNCTIONS: return _POSIX_THREAD_SAFE_FUNCTIONS; + case _SC_THREAD_PRIO_PROTECT: + return _POSIX_THREAD_PRIO_PROTECT; case _SC_THREAD_PRIORITY_SCHEDULING: case _SC_THREAD_PRIO_INHERIT: - case _SC_THREAD_PRIO_PROTECT: case _SC_THREAD_PROCESS_SHARED: return -1; case _SC_TTY_NAME_MAX: Index: lib/libc/sys/Makefile.inc =================================================================== RCS file: /cvsroot/src/lib/libc/sys/Makefile.inc,v retrieving revision 1.230 diff -u -p -u -r1.230 Makefile.inc --- lib/libc/sys/Makefile.inc 23 Apr 2016 23:11:31 -0000 1.230 +++ lib/libc/sys/Makefile.inc 23 Jun 2016 17:08:43 -0000 @@ -173,7 +173,7 @@ WEAKASM= accept.S __aio_suspend50.S clos msgrcv.S msgsnd.S __msync13.S __nanosleep50.S open.S poll.S \ __pollts50.S __pselect50.S read.S readlink.S \ readv.S _sched_setparam.S _sched_getparam.S _sched_setaffinity.S \ - _sched_getaffinity.S sched_yield.S \ + _sched_getaffinity.S sched_yield.S _sched_protect.S \ __select50.S setcontext.S __sigprocmask14.S __sigsuspend14.S sysarch.S \ __wait450.S wait6.S write.S writev.S Index: lib/libpthread/Makefile =================================================================== RCS file: /cvsroot/src/lib/libpthread/Makefile,v retrieving revision 1.86 diff -u -p -u -r1.86 Makefile --- lib/libpthread/Makefile 23 Apr 2016 23:12:19 -0000 1.86 +++ lib/libpthread/Makefile 23 Jun 2016 17:08:43 -0000 @@ -177,6 +177,8 @@ MLINKS+= pthread_barrier.3 pthread_barri MLINKS+= pthread_barrierattr.3 pthread_barrierattr_init.3 MLINKS+= pthread_barrierattr.3 pthread_barrierattr_destroy.3 +#MLINKS+= pthread_barrierattr.3 pthread_barrierattr_getpshared.3 +#MLINKS+= pthread_barrierattr.3 pthread_barrierattr_setpshared.3 MLINKS+= pthread_cond.3 pthread_cond_init.3 MLINKS+= pthread_cond.3 pthread_cond_destroy.3 @@ -188,6 +190,9 @@ MLINKS+= pthread_cond.3 pthread_cond_tim MLINKS+= pthread_condattr.3 pthread_condattr_init.3 MLINKS+= pthread_condattr.3 pthread_condattr_destroy.3 MLINKS+= pthread_condattr.3 pthread_condattr_setclock.3 +MLINKS+= pthread_condattr.3 pthread_condattr_getclock.3 +#MLINKS+= pthread_condattr.3 pthread_condattr_getpshared.3 +#MLINKS+= pthread_condattr.3 pthread_condattr_setpshared.3 MLINKS+= pthread_getname_np.3 pthread_setname_np.3 MLINKS+= pthread_getspecific.3 pthread_setspecific.3 @@ -198,11 +203,20 @@ MLINKS+= pthread_mutex.3 pthread_mutex_d MLINKS+= pthread_mutex.3 pthread_mutex_lock.3 MLINKS+= pthread_mutex.3 pthread_mutex_trylock.3 MLINKS+= pthread_mutex.3 pthread_mutex_unlock.3 +MLINKS+= pthread_mutex.3 pthread_mutex_timedlock.3 +MLINKS+= pthread_mutex.3 pthread_mutex_getprioceiling.3 +MLINKS+= pthread_mutex.3 pthread_mutex_setprioceiling.3 MLINKS+= pthread_mutexattr.3 pthread_mutexattr_init.3 MLINKS+= pthread_mutexattr.3 pthread_mutexattr_destroy.3 +#MLINKS+= pthread_mutexattr.3 pthread_mutexattr_getpshared.3 +#MLINKS+= pthread_mutexattr.3 pthread_mutexattr_setpshared.3 MLINKS+= pthread_mutexattr.3 pthread_mutexattr_settype.3 MLINKS+= pthread_mutexattr.3 pthread_mutexattr_gettype.3 +MLINKS+= pthread_mutexattr.3 pthread_mutexattr_getprotocol.3 +MLINKS+= pthread_mutexattr.3 pthread_mutexattr_setprotocol.3 +MLINKS+= pthread_mutexattr.3 pthread_mutexattr_getprioceiling.3 +MLINKS+= pthread_mutexattr.3 pthread_mutexattr_setprioceiling.3 MLINKS+= pthread_rwlock.3 pthread_rwlock_init.3 MLINKS+= pthread_rwlock.3 pthread_rwlock_destroy.3 @@ -217,6 +231,8 @@ MLINKS+= pthread_rwlock.3 pthread_rwlock MLINKS+= pthread_rwlockattr.3 pthread_rwlockattr_init.3 MLINKS+= pthread_rwlockattr.3 pthread_rwlockattr_destroy.3 +#MLINKS+= pthread_rwlockattr.3 pthread_rwlockattr_getpshared.3 +#MLINKS+= pthread_rwlockattr.3 pthread_rwlockattr_setpshared.3 MLINKS+= pthread_spin.3 pthread_spin_init.3 MLINKS+= pthread_spin.3 pthread_spin_destroy.3 Index: lib/libpthread/pthread.h =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread.h,v retrieving revision 1.36 diff -u -p -u -r1.36 pthread.h --- lib/libpthread/pthread.h 23 Apr 2016 23:12:19 -0000 1.36 +++ lib/libpthread/pthread.h 23 Jun 2016 17:08:43 -0000 @@ -94,12 +94,30 @@ int pthread_mutex_destroy(pthread_mutex_ int pthread_mutex_lock(pthread_mutex_t *); int pthread_mutex_trylock(pthread_mutex_t *); int pthread_mutex_unlock(pthread_mutex_t *); +int pthread_mutex_timedlock(pthread_mutex_t *, + const struct timespec * __restrict); +int pthread_mutex_getprioceiling(const pthread_mutex_t * __restrict, + int * __restrict); +int pthread_mutex_setprioceiling(pthread_mutex_t * __restrict, int, + int * __restrict); int pthread_mutexattr_init(pthread_mutexattr_t *); int pthread_mutexattr_destroy(pthread_mutexattr_t *); +#ifdef _PTHREAD_PSHARED +int pthread_mutexattr_getpshared(const pthread_mutexattr_t * __restrict, + int * __restrict); +int pthread_mutexattr_setpshared(pthread_mutexattr_t *, int); +#endif int pthread_mutexattr_gettype(const pthread_mutexattr_t * __restrict, int * __restrict); int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int); - +int pthread_mutexattr_getprotocol(const pthread_mutexattr_t * __restrict, + int * __restrict); +int pthread_mutexattr_setprotocol(pthread_mutexattr_t*, + int); +int pthread_mutexattr_getprioceiling(const pthread_mutexattr_t * __restrict, + int * __restrict); +int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *, + int); int pthread_cond_init(pthread_cond_t * __restrict, const pthread_condattr_t * __restrict); int pthread_cond_destroy(pthread_cond_t *); @@ -114,9 +132,15 @@ int pthread_cond_broadcast(pthread_cond_ int pthread_condattr_init(pthread_condattr_t *); #if defined(_NETBSD_SOURCE) int pthread_condattr_setclock(pthread_condattr_t *, clockid_t); +int pthread_condattr_getclock(const pthread_condattr_t * __restrict, + clockid_t * __restrict); #endif int pthread_condattr_destroy(pthread_condattr_t *); - +#ifdef _PTHREAD_PSHARED +int pthread_condattr_getpshared(const pthread_condattr_t * __restrict, + int * __restrict); +int pthread_condattr_setpshared(pthread_condattr_t *, int); +#endif int pthread_once(pthread_once_t *, void (*)(void)); int pthread_key_create(pthread_key_t *, void (*)(void *)); @@ -178,14 +202,22 @@ int pthread_rwlock_timedwrlock(pthread_r int pthread_rwlock_unlock(pthread_rwlock_t *); int pthread_rwlockattr_init(pthread_rwlockattr_t *); int pthread_rwlockattr_destroy(pthread_rwlockattr_t *); - +#ifdef _PTHREAD_PSHARED +int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t * __restrict, + int * __restrict); +int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int); +#endif int pthread_barrier_init(pthread_barrier_t * __restrict, const pthread_barrierattr_t * __restrict, unsigned int); int pthread_barrier_wait(pthread_barrier_t *); int pthread_barrier_destroy(pthread_barrier_t *); int pthread_barrierattr_init(pthread_barrierattr_t *); int pthread_barrierattr_destroy(pthread_barrierattr_t *); - +#ifdef _PTHREAD_PSHARED +int pthread_barrierattr_getpshared(const pthread_barrierattr_t * __restrict, + int * __restrict); +int pthread_barrierattr_setpshared(pthread_barrierattr_t *, int); +#endif int pthread_getschedparam(pthread_t, int * __restrict, struct sched_param * __restrict); int pthread_setschedparam(pthread_t, int, const struct sched_param *); @@ -251,6 +283,10 @@ __END_DECLS #define PTHREAD_MUTEX_RECURSIVE 2 #define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL +#define PTHREAD_PRIO_NONE 0 +#define PTHREAD_PRIO_INHERIT 1 +#define PTHREAD_PRIO_PROTECT 2 + #define PTHREAD_COND_INITIALIZER _PTHREAD_COND_INITIALIZER #define PTHREAD_MUTEX_INITIALIZER _PTHREAD_MUTEX_INITIALIZER #define PTHREAD_ONCE_INIT _PTHREAD_ONCE_INIT Index: lib/libpthread/pthread_barrier.3 =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_barrier.3,v retrieving revision 1.4 diff -u -p -u -r1.4 pthread_barrier.3 --- lib/libpthread/pthread_barrier.3 9 Jul 2010 18:07:20 -0000 1.4 +++ lib/libpthread/pthread_barrier.3 23 Jun 2016 17:08:43 -0000 @@ -25,7 +25,8 @@ .\" POSSIBILITY OF SUCH DAMAGE. .\" .\" ---------------------------------------------------------------------------- -.Dd July 8, 2010 + +.Dd June 12, 2016 .Dt PTHREAD_BARRIER 3 .Os .Sh NAME @@ -42,7 +43,14 @@ .Fn pthread_barrier_destroy "pthread_barrier_t *barrier" .Ft int .Fn pthread_barrier_wait "pthread_barrier_t *barrier" +.Ft int +.Fn pthread_barrierattr_getpshared "const pthread_barrierattr_t * __restrict attr" \ +"int * __restrict pshared" +.Ft int +.Fn pthread_barrierattr_setpshared "pthread_barrierattr_t * attr" \ +"int pshared" .\" ---------------------------------------------------------------------------- + .Sh DESCRIPTION The .Fn pthread_barrier_init @@ -87,7 +95,18 @@ call have called all threads will wake up, return from their respective .Fn pthread_barrier_wait calls and continue execution. +.Pp +.\" ----- +The +.Fn pthread_barrierattr_getpshared +function shall obtain the value of the process-shared attribute from the +attributes object referenced by attr. +The +.Fn pthread_barrierattr_setpshared +function shall set the process-shared attribute in an initialized attributes +object referenced by attr. .\" ---------------------------------------------------------------------------- + .Sh RETURN VALUES If successful, .Fn pthread_barrier_init @@ -113,7 +132,23 @@ It is the responsibility of this thread and atomicity of any updates to shared data with respect to the other threads participating in the barrier. In the case of failure, an error value will be returned. +.Pp +.\" ----- +If successful, +.Fn pthread_barrierattr_getpshared +shall return zero and store the value of the process-shared attribute of attr +into the object referenced by the +.Fa pshared +parameter. +Otherwise, an error number shall be returned to indicate the error. +.Pp +.\" ----- +If successful, +.Fn pthread_barrierattr_setpshared +shall return zero; +Otherwise, an error number shall be returned to indicate the error. .\" ---------------------------------------------------------------------------- + .Sh ERRORS The .Fn pthread_barrier_init @@ -152,6 +187,20 @@ The value specified by .Fa barrier is invalid. .El +.Pp +.\" ----- +The +.Fn pthread_barrierattr_setpshared +function and +the +.Fn pthread_barrierattr_getpshared +function may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +The value specified by +.Fa attr +is invalid. + .\" --------------------------------------------------------------------------- .Sh SEE ALSO .Xr pthread_barrierattr 3 , Index: lib/libpthread/pthread_barrier.c =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_barrier.c,v retrieving revision 1.19 diff -u -p -u -r1.19 pthread_barrier.c --- lib/libpthread/pthread_barrier.c 29 Jan 2009 21:19:35 -0000 1.19 +++ lib/libpthread/pthread_barrier.c 23 Jun 2016 17:08:43 -0000 @@ -117,6 +117,29 @@ pthread_barrier_wait(pthread_barrier_t * return 0; } +#ifdef _PTHREAD_PSHARED +int +pthread_barrierattr_getpshared(const pthread_barrierattr_t * __restrict attr, + int * __restrict pshared) +{ + + *pshared = PTHREAD_PROCESS_PRIVATE; + return 0; +} + +int +pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, int pshared) +{ + + switch(pshared) { + case PTHREAD_PROCESS_PRIVATE: + return 0; + case PTHREAD_PROCESS_SHARED: + return ENOSYS; + } + return EINVAL; +} +#endif int pthread_barrierattr_init(pthread_barrierattr_t *attr) Index: lib/libpthread/pthread_barrierattr.3 =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_barrierattr.3,v retrieving revision 1.9 diff -u -p -u -r1.9 pthread_barrierattr.3 --- lib/libpthread/pthread_barrierattr.3 9 Jul 2010 10:45:36 -0000 1.9 +++ lib/libpthread/pthread_barrierattr.3 23 Jun 2016 17:08:43 -0000 @@ -22,12 +22,14 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd July 9, 2010 +.Dd June 12, 2016 .Dt PTHREAD_BARRIERATTR 3 .Os .Sh NAME .Nm pthread_barrierattr_init , .Nm pthread_barrierattr_destroy , +.Nm pthread_barrierattr_getpshared , +.Nm pthread_barrierattr_setpshared .Nd barrier attribute operations .Sh LIBRARY .Lb libpthread @@ -37,6 +39,10 @@ .Fn pthread_barrierattr_init "pthread_barrierattr_t *attr" .Ft int .Fn pthread_barrierattr_destroy "pthread_barrierattr_t *attr" +.Ft int +.Fn pthread_barrierattr_getpshared "const pthread_barrierattr_t * __restrict attr" "int * __restrict pshared" +.Ft int +.Fn pthread_barrierattr_setpshared "pthread_barrierattr_t * attr" "int pshared" .Sh DESCRIPTION Barrier attributes are used to specify parameters to be used with .Xr pthread_barrier_init 3 . @@ -54,6 +60,19 @@ The .Fn pthread_barrierattr_destroy function destroys .Fa attr . +.Pp +The +.Fn pthread_barrierattr_getpshared +function shall obtain the value of the process-shared attribute +from the attributes object referenced by +.Fa attr . +.Pp +The +.Fn pthread_barrierattr_setpshared +function shall set the process-shared attribute in an initialized +attributes object referenced by +.Fa attr . + .Sh RETURN VALUES If successful, these functions return 0. Otherwise, an error number is returned to indicate the error. @@ -70,6 +89,18 @@ The value specified by .Fa attr is invalid. .El +.Pp +The +.Fn pthread_barrierattr_getpshared +and +.Fn pthread_barrierattr_setpshared +may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +The value specified by +.Fa attr +is invalid. +.El .Sh SEE ALSO .Xr pthread_barrier_init 3 .Sh STANDARDS Index: lib/libpthread/pthread_cond.c =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_cond.c,v retrieving revision 1.63 diff -u -p -u -r1.63 pthread_cond.c --- lib/libpthread/pthread_cond.c 31 Jan 2014 20:44:01 -0000 1.63 +++ lib/libpthread/pthread_cond.c 23 Jun 2016 17:08:43 -0000 @@ -370,6 +370,16 @@ pthread_condattr_setclock(pthread_condat } int +pthread_condattr_getclock(const pthread_condattr_t *__restrict attr, + clockid_t *__restrict clock_id) +{ + if (attr == NULL || attr->ptca_private == NULL) + return EINVAL; + *clock_id = *(clockid_t *)attr->ptca_private; + return 0; +} + +int pthread_condattr_destroy(pthread_condattr_t *attr) { @@ -382,6 +392,30 @@ pthread_condattr_destroy(pthread_condatt return 0; } +#ifdef _PTHREAD_PSHARED +int +pthread_condattr_getpshared(const pthread_condattr_t * __restrict attr, + int * __restrict pshared) +{ + + *pshared = PTHREAD_PROCESS_PRIVATE; + return 0; +} + +int +pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared) +{ + + switch(pshared) { + case PTHREAD_PROCESS_PRIVATE: + return 0; + case PTHREAD_PROCESS_SHARED: + return ENOSYS; + } + return EINVAL; +} +#endif + /* Utility routine to hang out for a while if threads haven't started yet. */ static int pthread_cond_wait_nothread(pthread_t self, pthread_mutex_t *mutex, Index: lib/libpthread/pthread_condattr.3 =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_condattr.3,v retrieving revision 1.9 diff -u -p -u -r1.9 pthread_condattr.3 --- lib/libpthread/pthread_condattr.3 3 Nov 2012 09:20:36 -0000 1.9 +++ lib/libpthread/pthread_condattr.3 23 Jun 2016 17:08:43 -0000 @@ -50,11 +50,15 @@ .\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" $FreeBSD: src/lib/libpthread/man/pthread_condattr.3,v 1.10 2002/09/16 19:29:28 mini Exp $ -.Dd November 2, 2012 +.Dd June 12, 2016 .Dt PTHREAD_CONDATTR 3 .Os .Sh NAME -.Nm pthread_condattr_init +.Nm pthread_condattr_init, +.Nm pthread_condattr_getpshared, +.Nm pthread_condattr_setpshared, +.Nm pthread_condattr_getclock, +.Nm pthread_condattr_setclock .Nd condition attribute operations .Sh LIBRARY .Lb libpthread @@ -63,9 +67,16 @@ .Ft int .Fn pthread_condattr_init "pthread_condattr_t *attr" .Ft int +.Fn pthread_condattr_getclock "const pthread_condattr_t *__restrict attr" \ +"clockid_t * __restrict clock_id" +.Ft int .Fn pthread_condattr_setclock "pthread_condattr_t *attr" "clockid_t clock" .Ft int .Fn pthread_condattr_destroy "pthread_condattr_t *attr" +.Ft int +.Fn pthread_condattr_getpshared "const pthread_condattr_t * __restrict attr" "int * __restrict pshared" +.Ft int +.Fn pshared_condattr_setpshared "pthread_condattr_t *attr" "int pshared" .Sh DESCRIPTION Condition attribute objects are used to specify parameters to the .Xr pthread_cond_init 3 @@ -77,6 +88,12 @@ and the .Fn pthread_condattr_destroy function destroys a condition attribute object. The +.Fn pthread_condattr_getclock +function shall obtain the value of the +.Fa clock +attributes object referenced by +.Fa attr. +The .Fn pthread_condattr_setclock function sets the system clock to be used for time comparisons to the one specified in @@ -86,6 +103,16 @@ Valid clock values are and .Dv CLOCK_REALTIME (the default). +The +.Fn pthread_condattr_getpshared +function shall obtain the value of the process-shared attribute from the +attributes object referenced by +.Fa attr. +The +.Fn pthread_condattr_setpshared +function shall set the process-shared attribute in an initialized attributes +object referenced by +.Fa attr. .Sh RETURN VALUES If successful, these functions return 0. Otherwise, an error number is returned to indicate the error. @@ -102,6 +129,28 @@ The value specified by .Fa attr is invalid. .El +.Pp +The +.Fn pthread_condattr_getclock +and +.Fn pthread_condattr_setclock +may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +The value specified by +.Fa attr is invalid. +.El +.Pp +The +.Fn pthread_condattr_getpshared +and +.Fn pthread_condattr_setpshared +may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +The value specified by +.Fa attr +is invalid. .Sh SEE ALSO .Xr pthread_cond_init 3 .Sh STANDARDS Index: lib/libpthread/pthread_mutex.3 =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_mutex.3,v retrieving revision 1.6 diff -u -p -u -r1.6 pthread_mutex.3 --- lib/libpthread/pthread_mutex.3 12 Nov 2012 23:11:05 -0000 1.6 +++ lib/libpthread/pthread_mutex.3 23 Jun 2016 17:08:43 -0000 @@ -52,7 +52,7 @@ .\" SUCH DAMAGE. .\" .\" ---------------------------------------------------------------------------- -.Dd July 8, 2010 +.Dd June 12, 2016 .Dt PTHREAD_MUTEX 3 .Os .Sh NAME @@ -75,6 +75,14 @@ .Fn pthread_mutex_trylock "pthread_mutex_t *mutex" .Ft int .Fn pthread_mutex_unlock "pthread_mutex_t *mutex" +.Ft int +.Fn pthread_mutex_timedlock "pthread_mutex_t * mutex" "const struct timespec *__restrict timeout" +.Ft int +.Fn pthread_mutex_getprioceiling "const pthread_mutex_t * __restrict mutex" "int * __restrict prioceiling" +.Ft int +.Fn pthread_mutex_setprioceiling "pthread_mutex_t * __restrict mutex" \ +"int prioceiling" "int * __restrict old_ceiling" + .\" ---------------------------------------------------------------------------- .Sh DESCRIPTION The @@ -135,7 +143,45 @@ When operating with the default mutex ty undefined behavior follows if a thread tries to unlock a mutex that has not been locked by it, or if a thread tries to release a mutex that is already unlocked. +.Pp +.\" ----- +The +.Fn pthread_mutex_timedlock +function shall lock the mutex object referenced by +.Fa mutex. +If the mutex is already locked, the calling thread shall block until +the mutex becomes available in the +.Fn pthread_mutex_lock +function. +If the mutex cannot be locked without waiting for another thread to +unlock the mutex, this wait shall be terminated when the specified timeout +expires. +The timeout shall expire when the absolute time specified by +.Fa timeout +passes, as measured by the clock on which timeouts are based. +.Pp +.\" ----- +The +.Fn pthread_mutex_getprioceiling +function shall return the current priority ceiling of the mutex. +.Pp +.\" ----- +The +.Fn pthread_mutex_setprioceiling +function shall either lock the mutex if it is unlocked, or block until +it can sucessfully lock the mutex, then it shall change the mutex's priority +ceiling and release the mutex. +When the change is successful, the previous value of the priority ceiling +shall be returned +in +.Fa old_ceiling. +The process of locking the mutex need not adhere to the priority +protect protocol. +If +.Fn pthread_mutex_setprioceiling +function fails, the mutex priority ceiling shall not be changed. .\" ---------------------------------------------------------------------------- + .Sh RETURN VALUES Upon success all described functions return zero. Otherwise, an error number will be returned to indicate the error. @@ -203,7 +249,45 @@ is invalid. The current thread does not hold a lock on .Fa mutex . .El +.Pp +.\" ----- +.Fn pthread_mutex_timedlock +may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +The mutex was created with the protocol attribute having the value +.Dv PTHREAD_PRIO_PROTECT +and the calling thread's priority is higher than +the mutex current priority ceiling. +.It Bq Er EINVAL +The process or thread would have blocked, and the +.Fa timeout +parameter specified a nanoseconds field value less than zero or greater +than or equal to 1000 million. +.It Bq Er ETIMEDOUT +The mutex could not be locked before the specified timeout expired. +.El +.Pp +.\" ----- +The +.Fn pthread_mutex_getprioceiling +and +.Fn pthread_mutex_setprioceiling +functions may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +The priority requested by +.Fa prioceiling +is out of range. +.It Bq Er EINVAL +The value specified by +.Fa mutex +does not refer to a currently existing mutex. +.It Bq Er EPERM +The caller does not have the privilege to perform the operation. + .\" ---------------------------------------------------------------------------- + .Sh SEE ALSO .Xr pthread 3 , .Xr pthread_barrier 3 , Index: lib/libpthread/pthread_mutex.c =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_mutex.c,v retrieving revision 1.59 diff -u -p -u -r1.59 pthread_mutex.c --- lib/libpthread/pthread_mutex.c 3 Feb 2014 15:51:01 -0000 1.59 +++ lib/libpthread/pthread_mutex.c 23 Jun 2016 17:08:43 -0000 @@ -51,6 +51,7 @@ __RCSID("$NetBSD: pthread_mutex.c,v 1.59 #include #include +#include #include #include @@ -67,12 +68,27 @@ __RCSID("$NetBSD: pthread_mutex.c,v 1.59 #define MUTEX_WAITERS_BIT ((uintptr_t)0x01) #define MUTEX_RECURSIVE_BIT ((uintptr_t)0x02) #define MUTEX_DEFERRED_BIT ((uintptr_t)0x04) -#define MUTEX_THREAD ((uintptr_t)-16L) +#define MUTEX_PROTECT_BIT ((uintptr_t)0x08) +#define MUTEX_THREAD ((uintptr_t)~0x0f) #define MUTEX_HAS_WAITERS(x) ((uintptr_t)(x) & MUTEX_WAITERS_BIT) #define MUTEX_RECURSIVE(x) ((uintptr_t)(x) & MUTEX_RECURSIVE_BIT) +#define MUTEX_PROTECT(x) ((uintptr_t)(x) & MUTEX_PROTECT_BIT) #define MUTEX_OWNER(x) ((uintptr_t)(x) & MUTEX_THREAD) +#define MUTEX_GET_TYPE(x) \ + ((int)(((uintptr_t)(x) & 0x000000ff) >> 0)) +#define MUTEX_SET_TYPE(x, t) \ + (x) = (void *)(((uintptr_t)(x) & ~0x000000ff) | ((t) << 0)) +#define MUTEX_GET_PROTOCOL(x) \ + ((int)(((uintptr_t)(x) & 0x0000ff00) >> 8)) +#define MUTEX_SET_PROTOCOL(x, p) \ + (x) = (void *)(((uintptr_t)(x) & ~0x0000ff00) | ((p) << 8)) +#define MUTEX_GET_CEILING(x) \ + ((int)(((uintptr_t)(x) & 0x00ff0000) >> 16)) +#define MUTEX_SET_CEILING(x, c) \ + (x) = (void *)(((uintptr_t)(x) & ~0x00ff0000) | ((c) << 16)) + #if __GNUC_PREREQ__(3, 0) #define NOINLINE __attribute ((noinline)) #else @@ -80,7 +96,8 @@ __RCSID("$NetBSD: pthread_mutex.c,v 1.59 #endif static void pthread__mutex_wakeup(pthread_t, pthread_mutex_t *); -static int pthread__mutex_lock_slow(pthread_mutex_t *); +static int pthread__mutex_lock_slow(pthread_mutex_t *, + const struct timespec *); static int pthread__mutex_unlock_slow(pthread_mutex_t *); static void pthread__mutex_pause(void); @@ -103,16 +120,22 @@ __strong_alias(__libc_mutexattr_settype, int pthread_mutex_init(pthread_mutex_t *ptm, const pthread_mutexattr_t *attr) { - intptr_t type; + uintptr_t type, proto, val, ceil; if (__predict_false(__uselibcstub)) return __libc_mutex_init_stub(ptm, attr); - if (attr == NULL) + if (attr == NULL) { type = PTHREAD_MUTEX_NORMAL; - else - type = (intptr_t)attr->ptma_private; + proto = PTHREAD_PRIO_NONE; + ceil = 0; + } else { + val = (uintptr_t)attr->ptma_private; + type = MUTEX_GET_TYPE(val); + proto = MUTEX_GET_PROTOCOL(val); + ceil = MUTEX_GET_CEILING(val); + } switch (type) { case PTHREAD_MUTEX_ERRORCHECK: __cpu_simple_lock_set(&ptm->ptm_errorcheck); @@ -127,10 +150,18 @@ pthread_mutex_init(pthread_mutex_t *ptm, ptm->ptm_owner = NULL; break; } + switch (proto) { + case PTHREAD_PRIO_PROTECT: + val = (uintptr_t)ptm->ptm_owner; + val |= MUTEX_PROTECT_BIT; + ptm->ptm_owner = (void *)val; + break; + } ptm->ptm_magic = _PT_MUTEX_MAGIC; ptm->ptm_waiters = NULL; ptm->ptm_recursed = 0; + ptm->ptm_ceiling = (unsigned char)ceil; return 0; } @@ -168,7 +199,24 @@ pthread_mutex_lock(pthread_mutex_t *ptm) #endif return 0; } - return pthread__mutex_lock_slow(ptm); + return pthread__mutex_lock_slow(ptm, NULL); +} + +int +pthread_mutex_timedlock(pthread_mutex_t* ptm, const struct timespec *ts) +{ + pthread_t self; + void *val; + + self = pthread__self(); + val = atomic_cas_ptr(&ptm->ptm_owner, NULL, self); + if (__predict_true(val == NULL)) { +#ifndef PTHREAD__ATOMIC_IS_MEMBAR + membar_enter(); +#endif + return 0; + } + return pthread__mutex_lock_slow(ptm, ts); } /* We want function call overhead. */ @@ -258,11 +306,12 @@ again: } NOINLINE static int -pthread__mutex_lock_slow(pthread_mutex_t *ptm) +pthread__mutex_lock_slow(pthread_mutex_t *ptm, const struct timespec *ts) { void *waiters, *new, *owner, *next; pthread_t self; int serrno; + int error; pthread__error(EINVAL, "Invalid mutex", ptm->ptm_magic == _PT_MUTEX_MAGIC); @@ -282,6 +331,10 @@ pthread__mutex_lock_slow(pthread_mutex_t return EDEADLK; } + /* priority protect */ + if (MUTEX_PROTECT(owner) && _sched_protect(ptm->ptm_ceiling) == -1) { + return errno; + } serrno = errno; for (;; owner = ptm->ptm_owner) { /* Spin while the owner is running. */ @@ -339,12 +392,23 @@ pthread__mutex_lock_slow(pthread_mutex_t */ while (self->pt_mutexwait) { self->pt_blocking++; - (void)_lwp_park(CLOCK_REALTIME, TIMER_ABSTIME, NULL, + error = _lwp_park(CLOCK_REALTIME, TIMER_ABSTIME, ts, self->pt_unpark, __UNVOLATILE(&ptm->ptm_waiters), __UNVOLATILE(&ptm->ptm_waiters)); self->pt_unpark = 0; self->pt_blocking--; membar_sync(); + if (__predict_true(error != -1)) { + continue; + } + if (errno == ETIMEDOUT && self->pt_mutexwait) { + /*Remove self from waiters list*/ + pthread__mutex_wakeup(self, ptm); + /*priority protect*/ + if (MUTEX_PROTECT(owner)) + (void)_sched_protect(-1); + return ETIMEDOUT; + } } } } @@ -460,6 +524,10 @@ pthread__mutex_unlock_slow(pthread_mutex */ if (new != owner) { owner = atomic_swap_ptr(&ptm->ptm_owner, new); + if (__predict_false(MUTEX_PROTECT(owner))) { + /* restore elevated priority */ + (void)_sched_protect(-1); + } if (MUTEX_HAS_WAITERS(owner) != 0) { pthread__mutex_wakeup(self, ptm); return 0; @@ -591,16 +659,18 @@ pthread_mutexattr_destroy(pthread_mutexa int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *typep) { + pthread__error(EINVAL, "Invalid mutex attribute", attr->ptma_magic == _PT_MUTEXATTR_MAGIC); - *typep = (int)(intptr_t)attr->ptma_private; + *typep = MUTEX_GET_TYPE(attr->ptma_private); return 0; } int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type) { + if (__predict_false(__uselibcstub)) return __libc_mutexattr_settype_stub(attr, type); @@ -611,13 +681,92 @@ pthread_mutexattr_settype(pthread_mutexa case PTHREAD_MUTEX_NORMAL: case PTHREAD_MUTEX_ERRORCHECK: case PTHREAD_MUTEX_RECURSIVE: - attr->ptma_private = (void *)(intptr_t)type; + MUTEX_SET_TYPE(attr->ptma_private, type); + return 0; + default: + return EINVAL; + } +} + +int +pthread_mutexattr_getprotocol(const pthread_mutexattr_t *attr, int*proto) +{ + + pthread__error(EINVAL, "Invalid mutex attribute", + attr->ptma_magic == _PT_MUTEXATTR_MAGIC); + + *proto = MUTEX_GET_PROTOCOL(attr->ptma_private); + return 0; +} + +int +pthread_mutexattr_setprotocol(pthread_mutexattr_t* attr, int proto) +{ + + pthread__error(EINVAL, "Invalid mutex attribute", + attr->ptma_magic == _PT_MUTEXATTR_MAGIC); + + switch (proto) { + case PTHREAD_PRIO_NONE: + case PTHREAD_PRIO_PROTECT: + MUTEX_SET_PROTOCOL(attr->ptma_private, proto); return 0; + case PTHREAD_PRIO_INHERIT: + return ENOTSUP; default: return EINVAL; } } +int +pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *attr, int *ceil) +{ + + pthread__error(EINVAL, "Invalid mutex attribute", + attr->ptma_magic == _PT_MUTEXATTR_MAGIC); + + *ceil = MUTEX_GET_CEILING(attr->ptma_private); + return 0; +} + +int +pthread_mutexattr_setprioceiling(pthread_mutexattr_t *attr, int ceil) +{ + + pthread__error(EINVAL, "Invalid mutex attribute", + attr->ptma_magic == _PT_MUTEXATTR_MAGIC); + + if (ceil & ~0xff) + return EINVAL; + + MUTEX_SET_CEILING(attr->ptma_private, ceil); + return 0; +} + +#ifdef _PTHREAD_PSHARED +int +pthread_mutexattr_getpshared(const pthread_mutexattr_t * __restrict attr, + int * __restrict pshared) +{ + + *pshared = PTHREAD_PROCESS_PRIVATE; + return 0; +} + +int +pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared) +{ + + switch(pshared) { + case PTHREAD_PROCESS_PRIVATE: + return 0; + case PTHREAD_PROCESS_SHARED: + return ENOSYS; + } + return EINVAL; +} +#endif + /* * pthread__mutex_deferwake: try to defer unparking threads in self->pt_waiters * @@ -645,6 +794,28 @@ pthread__mutex_deferwake(pthread_t self, } int +pthread_mutex_getprioceiling(const pthread_mutex_t *ptm, int*ceil) +{ + *ceil = (unsigned int)ptm->ptm_ceiling; + return 0; +} + +int +pthread_mutex_setprioceiling(pthread_mutex_t *ptm, int ceil, int *old_ceil) +{ + int error; + + error = pthread_mutex_lock(ptm); + if (error == 0) { + *old_ceil = (unsigned int)ptm->ptm_ceiling; + /*check range*/ + ptm->ptm_ceiling = (unsigned char)ceil; + pthread_mutex_unlock(ptm); + } + return error; +} + +int _pthread_mutex_held_np(pthread_mutex_t *ptm) { Index: lib/libpthread/pthread_mutexattr.3 =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_mutexattr.3,v retrieving revision 1.11 diff -u -p -u -r1.11 pthread_mutexattr.3 --- lib/libpthread/pthread_mutexattr.3 8 Jul 2010 22:46:34 -0000 1.11 +++ lib/libpthread/pthread_mutexattr.3 23 Jun 2016 17:08:43 -0000 @@ -50,18 +50,20 @@ .\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" $FreeBSD: src/lib/libpthread/man/pthread_mutexattr.3,v 1.8 2002/09/16 19:29:29 mini Exp $ -.Dd July 9, 2010 +.Dd June 12, 2016 .Dt PTHREAD_MUTEXATTR 3 .Os .Sh NAME .Nm pthread_mutexattr_init , .Nm pthread_mutexattr_destroy , -.\" .Nm pthread_mutexattr_setprioceiling , -.\" .Nm pthread_mutexattr_getprioceiling , -.\" .Nm pthread_mutexattr_setprotocol , -.\" .Nm pthread_mutexattr_getprotocol , +.Nm pthread_mutexattr_setprioceiling , +.Nm pthread_mutexattr_getprioceiling , +.Nm pthread_mutexattr_setprotocol , +.Nm pthread_mutexattr_getprotocol , .Nm pthread_mutexattr_settype , -.Nm pthread_mutexattr_gettype +.Nm pthread_mutexattr_gettype , +.Nm pthread_mutexattr_getpshared , +.Nm pthread_mutexattr_setpshared .Nd mutex attribute operations .Sh LIBRARY .Lb libpthread @@ -71,23 +73,29 @@ .Fn pthread_mutexattr_init "pthread_mutexattr_t *attr" .Ft int .Fn pthread_mutexattr_destroy "pthread_mutexattr_t *attr" -.\" .Ft int -.\" .Fn pthread_mutexattr_setprioceiling \ -.\" "pthread_mutexattr_t *attr" "int prioceiling" -.\" .Ft int -.\" .Fn pthread_mutexattr_getprioceiling \ -.\" "pthread_mutexattr_t *attr" "int *prioceiling" -.\" .Ft int -.\" .Fn pthread_mutexattr_setprotocol \ -.\" "pthread_mutexattr_t *attr" "int protocol" -.\" .Ft int -.\" .Fn pthread_mutexattr_getprotocol \ -.\" "pthread_mutexattr_t *attr" "int *protocol" +.Ft int +.Fn pthread_mutexattr_setprioceiling \ +"pthread_mutexattr_t *attr" "int prioceiling" +.Ft int +.Fn pthread_mutexattr_getprioceiling \ +"pthread_mutexattr_t *attr" "int *prioceiling" +.Ft int +.Fn pthread_mutexattr_setprotocol \ +"pthread_mutexattr_t *attr" "int protocol" +.Ft int +.Fn pthread_mutexattr_getprotocol \ +"pthread_mutexattr_t *attr" "int *protocol" .Ft int .Fn pthread_mutexattr_settype "pthread_mutexattr_t *attr" "int type" .Ft int .Fn pthread_mutexattr_gettype \ "pthread_mutexattr_t * restrict attr" "int * restrict type" +.Ft int +.Fn pthread_mutexattr_getpshared \ +"const pthread_mutexattr_t * __restrict attr" "int * __restrict pshared" +.Ft int +.Fn pthread_mutexattr_setpshared \ +"pthread_mutexattr_t * attr" "int pshared" .Sh DESCRIPTION Mutex attributes are used to specify parameters to .Fn pthread_mutex_init . @@ -172,6 +180,38 @@ The .Fn pthread_mutexattr_gettype functions copy the type value of the attribute to the location pointed to by the second parameter. +.Pp +The +.Fn pthread_mutexattr_getpshared +function obtains the value of the process-shared attribute from +the attributes object referenced by +.Fa attr. +.Pp +The +.Fn pthread_mutexattr_setpshared +function is used to set the process-shared attribute in an initialised +attributes object referenced by +.Fa attr. +.Pp +The +.Fn pthread_mutexattr_getprotocol +and +.Fn pthread_mutexattr_setprotocol +functions shall get and set the protocol attribute of a mutex attributes +object pointed to by +.Fa attr +which was previously created by the function +.Fn pthread_mutexattr_init . +.Pp +The +.Fn pthread_mutexattr_getprioceiling +and +.Fn pthread_mutexattr_setprioceiling +functions, shall get and set the priority ceiling attribute of a mutex attributes +object pointed to by +.Fa attr +which was previously created by the function +.Fn pthread_mutexattr_init . .Sh RETURN VALUES If successful, these functions return 0. Otherwise, an error number is returned to indicate the error. @@ -201,44 +241,54 @@ No error numbers are defined for the and .Fn pthread_mutexattr_gettype functions. -.\" -.\" .Pp -.\" .Fn pthread_mutexattr_setprioceiling -.\" may fail if: -.\" .Bl -tag -width Er -.\" .It Bq Er EINVAL -.\" Invalid value for -.\" .Fa attr , -.\" or invalid value for -.\" .Fa prioceiling . -.\" .El -.\" .Pp -.\" .Fn pthread_mutexattr_getprioceiling -.\" may fail if: -.\" .Bl -tag -width Er -.\" .It Bq Er EINVAL -.\" Invalid value for -.\" .Fa attr . -.\" .El -.\" .Pp -.\" .Fn pthread_mutexattr_setprotocol -.\" may fail if: -.\" .Bl -tag -width Er -.\" .It Bq Er EINVAL -.\" Invalid value for -.\" .Fa attr , -.\" or invalid value for -.\" .Fa protocol . -.\" .El -.\" .Pp -.\" .Fn pthread_mutexattr_getprotocol -.\" may fail if: -.\" .Bl -tag -width Er -.\" .It Bq Er EINVAL -.\" Invalid value for -.\" .Fa attr . -.\" .El -.\" .Pp +.Pp +.Fn pthread_mutexattr_setprioceiling +may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +Invalid value for +.Fa attr , +or invalid value for +.Fa prioceiling . +.El +.Pp +.Fn pthread_mutexattr_getprioceiling +may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +Invalid value for +.Fa attr . +.El +.Pp +.Fn pthread_mutexattr_setprotocol +may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +Invalid value for +.Fa attr , +or invalid value for +.Fa protocol . +.El +.Pp +.Fn pthread_mutexattr_getprotocol +may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +Invalid value for +.Fa attr . +.El +.Pp +.El +.Pp +.Fn pthread_mutexattr_getpshared +and +.Fn pthread_mutexattr_setpshared +may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +the value specified by +.Fa attr +is invalid. .Sh SEE ALSO .Xr pthread_mutex_init 3 .Sh STANDARDS Index: lib/libpthread/pthread_rwlock.c =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_rwlock.c,v retrieving revision 1.33 diff -u -p -u -r1.33 pthread_rwlock.c --- lib/libpthread/pthread_rwlock.c 21 Mar 2013 16:49:12 -0000 1.33 +++ lib/libpthread/pthread_rwlock.c 23 Jun 2016 17:08:43 -0000 @@ -639,6 +639,29 @@ _pthread_rwlock_wrheld_np(pthread_rwlock ((uintptr_t)pthread__self() | RW_WRITE_LOCKED); } +#ifdef _PTHREAD_PSHARED +int +pthread_rwlockattr_getpshared(const pthread_rwlockattr_t * __restrict attr, + int * __restrict pshared) +{ + *pshared = PTHREAD_PROCESS_PRIVATE; + return 0; +} + +int +pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, int pshared) +{ + + switch(pshared) { + case PTHREAD_PROCESS_PRIVATE: + return 0; + case PTHREAD_PROCESS_SHARED: + return ENOSYS; + } + return EINVAL; +} +#endif + int pthread_rwlockattr_init(pthread_rwlockattr_t *attr) { Index: lib/libpthread/pthread_rwlockattr.3 =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_rwlockattr.3,v retrieving revision 1.8 diff -u -p -u -r1.8 pthread_rwlockattr.3 --- lib/libpthread/pthread_rwlockattr.3 9 Jul 2010 08:51:28 -0000 1.8 +++ lib/libpthread/pthread_rwlockattr.3 23 Jun 2016 17:08:43 -0000 @@ -48,13 +48,15 @@ .\" .\" $FreeBSD: src/lib/libpthread/man/pthread_rwlockattr_init.3,v 1.7 2002/09/16 19:29:29 mini Exp $ .\" -.Dd July 9, 2010 +.Dd June 12, 2016 .Dt PTHREAD_RWLOCKATTR 3 .Os .Sh NAME .Nm pthread_rwlockattr_init , -.Nm pthread_rwlockattr_destroy -.Nd initialize or destroy read/write lock attributes +.Nm pthread_rwlockattr_destroy , +.Nm pthread_rwlockattr_getpshared , +.Nm pthread_rwlockattr_setpshared +.Nd initialize, destroy or query read/write lock attributes .Sh LIBRARY .Lb libpthread .Sh SYNOPSIS @@ -63,6 +65,10 @@ .Fn pthread_rwlockattr_init "pthread_rwlockattr_t *attr" .Ft int .Fn pthread_rwlockattr_destroy "pthread_rwlockattr_t *attr" +.Ft int +.Fn pthread_rwlockattr_getpshared "const pthread_rwlockattr_t *__restrict attr" "int * __restrict pshared" +.Ft int +.Fn pthread_rwlockattr_setpshared "pthread_rwlockattr_t *attr" "int pshared" .Sh DESCRIPTION The .Fn pthread_rwlockattr_init @@ -73,12 +79,21 @@ The function is used to destroy a read/write lock attribute object previously created with .Fn pthread_rwlockattr_init . +.Pp +The +.Fn pthread_rwlockattr_getpshared +function shall obtain the value of process-shared attribute from +the initialized attributes object referenced by +.Fa attr. +.Pp +The +.Fn pthread_rwlockattr_setpshared +function shall set the process-shared attribute in an initialized +attributes object referenced by +.Fa attr. .Sh RETURN VALUES -If successful, the -.Fn pthread_rwlockattr_init -and -.Fn pthread_rwlockattr_destroy -functions return zero. +If successful, +all these functions return zero. Otherwise an error number will be returned to indicate the error. .Sh ERRORS .Fn pthread_rwlockattr_init @@ -98,6 +113,17 @@ The value specified by .Fa attr is invalid. .El +.Pp +.Fn pthread_rwlockattr_getpshared +and +.Fn pthread_rwlockattr_setpshared +may fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +The value specified by +.Fa attr +is invalid. +.El .Sh SEE ALSO .Xr pthread_rwlock_init 3 .Sh STANDARDS Index: lib/libpthread/pthread_types.h =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_types.h,v retrieving revision 1.17 diff -u -p -u -r1.17 pthread_types.h --- lib/libpthread/pthread_types.h 27 Aug 2015 12:30:50 -0000 1.17 +++ lib/libpthread/pthread_types.h 23 Jun 2016 17:08:43 -0000 @@ -115,7 +115,7 @@ struct __pthread_mutex_st { #ifdef __CPU_SIMPLE_LOCK_PAD uint8_t ptm_pad1[3]; #endif - __pthread_spin_t ptm_interlock; /* unused - backwards compat */ + __pthread_spin_t ptm_ceiling; #ifdef __CPU_SIMPLE_LOCK_PAD uint8_t ptm_pad2[3]; #endif Index: sys/kern/init_sysent.c =================================================================== RCS file: /cvsroot/src/sys/kern/init_sysent.c,v retrieving revision 1.311 diff -u -p -u -r1.311 init_sysent.c --- sys/kern/init_sysent.c 6 May 2016 10:19:40 -0000 1.311 +++ sys/kern/init_sysent.c 23 Jun 2016 17:08:51 -0000 @@ -1,4 +1,4 @@ -/* $NetBSD: init_sysent.c,v 1.311 2016/05/06 10:19:40 pooka Exp $ */ +/* $NetBSD$ */ /* * System call switch table. @@ -8,7 +8,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: init_sysent.c,v 1.311 2016/05/06 10:19:40 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD$"); #include "opt_modular.h" #include "opt_ntp.h" @@ -1682,8 +1682,9 @@ struct sysent sysent[] = { .sy_call = (sy_call_t *)sys_sched_yield }, /* 350 = sched_yield */ { - .sy_call = sys_nosys, - }, /* 351 = filler */ + ns(struct sys__sched_protect_args), + .sy_call = (sy_call_t *)sys__sched_protect + }, /* 351 = _sched_protect */ { .sy_call = sys_nosys, }, /* 352 = filler */ Index: sys/kern/kern_lwp.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_lwp.c,v retrieving revision 1.184 diff -u -p -u -r1.184 kern_lwp.c --- sys/kern/kern_lwp.c 4 Apr 2016 23:07:06 -0000 1.184 +++ sys/kern/kern_lwp.c 23 Jun 2016 17:08:51 -0000 @@ -829,6 +829,8 @@ lwp_create(lwp_t *l1, proc_t *p2, vaddr_ l2->l_kpribase = PRI_KERNEL; l2->l_priority = l1->l_priority; l2->l_inheritedprio = -1; + l2->l_protectprio = -1; + l2->l_auxprio = -1; l2->l_flag = 0; l2->l_pflag = LP_MPSAFE; TAILQ_INIT(&l2->l_ld_locks); Index: sys/kern/kern_sleepq.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_sleepq.c,v retrieving revision 1.50 diff -u -p -u -r1.50 kern_sleepq.c --- sys/kern/kern_sleepq.c 5 Sep 2014 05:57:21 -0000 1.50 +++ sys/kern/kern_sleepq.c 23 Jun 2016 17:08:51 -0000 @@ -479,5 +479,6 @@ sleepq_lendpri(lwp_t *l, pri_t pri) KASSERT(lwp_locked(l, NULL)); l->l_inheritedprio = pri; + l->l_auxprio = MAX(l->l_inheritedprio, l->l_protectprio); sleepq_reinsert(sq, l); } Index: sys/kern/kern_synch.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_synch.c,v retrieving revision 1.310 diff -u -p -u -r1.310 kern_synch.c --- sys/kern/kern_synch.c 4 Apr 2016 20:47:57 -0000 1.310 +++ sys/kern/kern_synch.c 23 Jun 2016 17:08:51 -0000 @@ -1085,9 +1085,11 @@ sched_lendpri(struct lwp *l, pri_t pri) KASSERT(lwp_locked(l, l->l_cpu->ci_schedstate.spc_mutex)); sched_dequeue(l); l->l_inheritedprio = pri; + l->l_auxprio = MAX(l->l_inheritedprio, l->l_protectprio); sched_enqueue(l, false); } else { l->l_inheritedprio = pri; + l->l_auxprio = MAX(l->l_inheritedprio, l->l_protectprio); } resched_cpu(l); } Index: sys/kern/sys_sched.c =================================================================== RCS file: /cvsroot/src/sys/kern/sys_sched.c,v retrieving revision 1.43 diff -u -p -u -r1.43 sys_sched.c --- sys/kern/sys_sched.c 25 Feb 2014 18:30:11 -0000 1.43 +++ sys/kern/sys_sched.c 23 Jun 2016 17:08:51 -0000 @@ -532,6 +532,69 @@ out: } /* + * Priority protection for PTHREAD_PRIO_PROTECT. This is a weak + * analogue of priority inheritance: temp raise the priority + * of the caller when accessing a protected resource. + */ +int +sys__sched_protect(struct lwp *l, + const struct sys__sched_protect_args *uap, register_t *retval) +{ + /* { + syscallarg(int) priority; + } */ + int error; + pri_t pri; + + KASSERT(l->l_inheritedprio == -1); + KASSERT(l->l_auxprio == -1 || l->l_auxprio == l->l_protectprio); + + pri = SCARG(uap, priority); + error = 0; + lwp_lock(l); + if (pri == -1) { + /* back out priority changes */ + switch(l->l_protectdepth) { + case 0: + error = EINVAL; + break; + case 1: + l->l_protectdepth = 0; + l->l_protectprio = -1; + l->l_auxprio = -1; + break; + default: + l->l_protectdepth--; + break; + } + } else if (pri < 0) { + /* Just retrieve the current value. */ + } else if (__predict_false(pri < SCHED_PRI_MIN || + pri > SCHED_PRI_MAX || l->l_priority > pri + PRI_USER_RT)) { + /* must fail if existing priority is higher */ + error = EPERM; + } else { + /* play along but make no changes if not a realtime LWP. */ + l->l_protectdepth++; + pri += PRI_USER_RT; + if (__predict_true(l->l_class != SCHED_OTHER && + pri > l->l_protectprio)) { + l->l_protectprio = pri; + l->l_auxprio = pri; + } + } + if (error == 0) { + if (l->l_protectprio == -1) + error = ENOENT; + else + *retval = l->l_protectprio - PRI_USER_RT; + } + lwp_unlock(l); + + return error; +} + +/* * Yield. */ int Index: sys/kern/syscalls.c =================================================================== RCS file: /cvsroot/src/sys/kern/syscalls.c,v retrieving revision 1.301 diff -u -p -u -r1.301 syscalls.c --- sys/kern/syscalls.c 6 May 2016 10:19:40 -0000 1.301 +++ sys/kern/syscalls.c 23 Jun 2016 17:08:51 -0000 @@ -1,4 +1,4 @@ -/* $NetBSD: syscalls.c,v 1.301 2016/05/06 10:19:40 pooka Exp $ */ +/* $NetBSD$ */ /* * System call names. @@ -8,7 +8,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: syscalls.c,v 1.301 2016/05/06 10:19:40 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD$"); #if defined(_KERNEL_OPT) #include "opt_modular.h" @@ -394,7 +394,7 @@ const char *const syscallnames[] = { /* 348 */ "_sched_setaffinity", /* 349 */ "_sched_getaffinity", /* 350 */ "sched_yield", - /* 351 */ "#351 (unimplemented)", + /* 351 */ "_sched_protect", /* 352 */ "#352 (unimplemented)", /* 353 */ "#353 (unimplemented)", /* 354 */ "fsync_range", @@ -931,7 +931,7 @@ const char *const altsyscallnames[] = { /* 348 */ NULL, /* _sched_setaffinity */ /* 349 */ NULL, /* _sched_getaffinity */ /* 350 */ NULL, /* sched_yield */ - /* 351 */ NULL, /* unimplemented */ + /* 351 */ NULL, /* _sched_protect */ /* 352 */ NULL, /* unimplemented */ /* 353 */ NULL, /* unimplemented */ /* 354 */ NULL, /* fsync_range */ Index: sys/kern/syscalls.master =================================================================== RCS file: /cvsroot/src/sys/kern/syscalls.master,v retrieving revision 1.284 diff -u -p -u -r1.284 syscalls.master --- sys/kern/syscalls.master 23 Apr 2016 23:08:26 -0000 1.284 +++ sys/kern/syscalls.master 23 Jun 2016 17:08:51 -0000 @@ -692,7 +692,7 @@ 349 STD { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, \ size_t size, cpuset_t *cpuset); } 350 STD { int|sys||sched_yield(void); } -351 UNIMPL +351 STD { int|sys||_sched_protect(int priority); } 352 UNIMPL 353 UNIMPL Index: sys/kern/syscalls_autoload.c =================================================================== RCS file: /cvsroot/src/sys/kern/syscalls_autoload.c,v retrieving revision 1.20 diff -u -p -u -r1.20 syscalls_autoload.c --- sys/kern/syscalls_autoload.c 6 May 2016 10:19:40 -0000 1.20 +++ sys/kern/syscalls_autoload.c 23 Jun 2016 17:08:51 -0000 @@ -1,4 +1,4 @@ -/* $NetBSD: syscalls_autoload.c,v 1.20 2016/05/06 10:19:40 pooka Exp $ */ +/* $NetBSD$ */ /* * System call autoload table. @@ -8,7 +8,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: syscalls_autoload.c,v 1.20 2016/05/06 10:19:40 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD$"); #include static struct sc_autoload netbsd_syscalls_autoload[] = { Index: sys/kern/systrace_args.c =================================================================== RCS file: /cvsroot/src/sys/kern/systrace_args.c,v retrieving revision 1.20 diff -u -p -u -r1.20 systrace_args.c --- sys/kern/systrace_args.c 6 May 2016 10:19:40 -0000 1.20 +++ sys/kern/systrace_args.c 23 Jun 2016 17:08:51 -0000 @@ -1,4 +1,4 @@ -/* $NetBSD: systrace_args.c,v 1.20 2016/05/06 10:19:40 pooka Exp $ */ +/* $NetBSD$ */ /* * System call argument to DTrace register array converstion. @@ -2519,6 +2519,13 @@ systrace_args(register_t sysnum, const v *n_args = 0; break; } + /* sys__sched_protect */ + case 351: { + struct sys__sched_protect_args *p = params; + iarg[0] = SCARG(p, priority); /* int */ + *n_args = 1; + break; + } /* sys_fsync_range */ case 354: { struct sys_fsync_range_args *p = params; @@ -7802,6 +7809,16 @@ systrace_entry_setargdesc(int sysnum, in /* sys_sched_yield */ case 350: break; + /* sys__sched_protect */ + case 351: + switch(ndx) { + case 0: + p = "int"; + break; + default: + break; + }; + break; /* sys_fsync_range */ case 354: switch(ndx) { @@ -11373,6 +11390,11 @@ systrace_return_setargdesc(int sysnum, i break; /* sys_sched_yield */ case 350: + /* sys__sched_protect */ + case 351: + if (ndx == 0 || ndx == 1) + p = "int"; + break; /* sys_fsync_range */ case 354: if (ndx == 0 || ndx == 1) Index: sys/rump/include/rump/rump_syscalls.h =================================================================== RCS file: /cvsroot/src/sys/rump/include/rump/rump_syscalls.h,v retrieving revision 1.101 diff -u -p -u -r1.101 rump_syscalls.h --- sys/rump/include/rump/rump_syscalls.h 6 May 2016 10:19:40 -0000 1.101 +++ sys/rump/include/rump/rump_syscalls.h 23 Jun 2016 17:08:52 -0000 @@ -1,4 +1,4 @@ -/* $NetBSD: rump_syscalls.h,v 1.101 2016/05/06 10:19:40 pooka Exp $ */ +/* $NetBSD$ */ /* * System call protos in rump namespace. @@ -16,824 +16,824 @@ #include -#ifndef RUMP_SYS_RENAME_FGETXATTR -#define RUMP_SYS_RENAME_FGETXATTR rump___sysimpl_fgetxattr +#ifndef RUMP_SYS_RENAME_FKTRACE +#define RUMP_SYS_RENAME_FKTRACE rump___sysimpl_fktrace #endif -#ifndef RUMP_SYS_RENAME_IOCTL -#define RUMP_SYS_RENAME_IOCTL rump___sysimpl_ioctl +#ifndef RUMP_SYS_RENAME_GETSID +#define RUMP_SYS_RENAME_GETSID rump___sysimpl_getsid #endif -#ifndef RUMP_SYS_RENAME_GETPPID -#define RUMP_SYS_RENAME_GETPPID rump___sysimpl_getppid +#ifndef RUMP_SYS_RENAME_RECVMMSG +#define RUMP_SYS_RENAME_RECVMMSG rump___sysimpl_recvmmsg #endif -#ifndef RUMP_SYS_RENAME___QUOTACTL -#define RUMP_SYS_RENAME___QUOTACTL rump___sysimpl___quotactl +#ifndef RUMP_SYS_RENAME_UTIMENSAT +#define RUMP_SYS_RENAME_UTIMENSAT rump___sysimpl_utimensat #endif -#ifndef RUMP_SYS_RENAME_GETPGID -#define RUMP_SYS_RENAME_GETPGID rump___sysimpl_getpgid +#ifndef RUMP_SYS_RENAME_CHFLAGS +#define RUMP_SYS_RENAME_CHFLAGS rump___sysimpl_chflags #endif -#ifndef RUMP_SYS_RENAME___SETLOGIN -#define RUMP_SYS_RENAME___SETLOGIN rump___sysimpl___setlogin +#ifndef RUMP_SYS_RENAME_GETGROUPS +#define RUMP_SYS_RENAME_GETGROUPS rump___sysimpl_getgroups #endif -#ifndef RUMP_SYS_RENAME_SETEUID -#define RUMP_SYS_RENAME_SETEUID rump___sysimpl_seteuid +#ifndef RUMP_SYS_RENAME_SENDTO +#define RUMP_SYS_RENAME_SENDTO rump___sysimpl_sendto #endif -#ifndef RUMP_SYS_RENAME_GETPEERNAME -#define RUMP_SYS_RENAME_GETPEERNAME rump___sysimpl_getpeername +#ifndef RUMP_SYS_RENAME_ADJTIME +#define RUMP_SYS_RENAME_ADJTIME rump___sysimpl_adjtime50 #endif -#ifndef RUMP_SYS_RENAME_SYMLINK -#define RUMP_SYS_RENAME_SYMLINK rump___sysimpl_symlink +#ifndef RUMP_SYS_RENAME_FHSTATVFS1 +#define RUMP_SYS_RENAME_FHSTATVFS1 rump___sysimpl_fhstatvfs140 #endif -#ifndef RUMP_SYS_RENAME_GETUID_WITH_EUID -#define RUMP_SYS_RENAME_GETUID_WITH_EUID rump___sysimpl_getuid +#ifndef RUMP_SYS_RENAME_TIMER_DELETE +#define RUMP_SYS_RENAME_TIMER_DELETE rump___sysimpl_timer_delete #endif -#ifndef RUMP_SYS_RENAME_TIMER_GETTIME -#define RUMP_SYS_RENAME_TIMER_GETTIME rump___sysimpl_timer_gettime50 +#ifndef RUMP_SYS_RENAME_PWRITEV +#define RUMP_SYS_RENAME_PWRITEV rump___sysimpl_pwritev #endif -#ifndef RUMP_SYS_RENAME_READ -#define RUMP_SYS_RENAME_READ rump___sysimpl_read +#ifndef RUMP_SYS_RENAME_EXTATTR_GET_LINK +#define RUMP_SYS_RENAME_EXTATTR_GET_LINK rump___sysimpl_extattr_get_link #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_GET_FILE -#define RUMP_SYS_RENAME_EXTATTR_GET_FILE rump___sysimpl_extattr_get_file +#ifndef RUMP_SYS_RENAME_LIO_LISTIO +#define RUMP_SYS_RENAME_LIO_LISTIO rump___sysimpl_lio_listio #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_LIST_FD -#define RUMP_SYS_RENAME_EXTATTR_LIST_FD rump___sysimpl_extattr_list_fd +#ifndef RUMP_SYS_RENAME_MKDIRAT +#define RUMP_SYS_RENAME_MKDIRAT rump___sysimpl_mkdirat +#endif + +#ifndef RUMP_SYS_RENAME___GETCWD +#define RUMP_SYS_RENAME___GETCWD rump___sysimpl___getcwd #endif #ifndef RUMP_SYS_RENAME_SETRLIMIT #define RUMP_SYS_RENAME_SETRLIMIT rump___sysimpl_setrlimit #endif -#ifndef RUMP_SYS_RENAME_GETPID_WITH_PPID -#define RUMP_SYS_RENAME_GETPID_WITH_PPID rump___sysimpl_getpid +#ifndef RUMP_SYS_RENAME_FDATASYNC +#define RUMP_SYS_RENAME_FDATASYNC rump___sysimpl_fdatasync #endif -#ifndef RUMP_SYS_RENAME_SETGID -#define RUMP_SYS_RENAME_SETGID rump___sysimpl_setgid +#ifndef RUMP_SYS_RENAME_SETSID +#define RUMP_SYS_RENAME_SETSID rump___sysimpl_setsid #endif -#ifndef RUMP_SYS_RENAME_LISTEN -#define RUMP_SYS_RENAME_LISTEN rump___sysimpl_listen +#ifndef RUMP_SYS_RENAME_REMOVEXATTR +#define RUMP_SYS_RENAME_REMOVEXATTR rump___sysimpl_removexattr #endif -#ifndef RUMP_SYS_RENAME_SYNC -#define RUMP_SYS_RENAME_SYNC rump___sysimpl_sync +#ifndef RUMP_SYS_RENAME_AIO_RETURN +#define RUMP_SYS_RENAME_AIO_RETURN rump___sysimpl_aio_return #endif -#ifndef RUMP_SYS_RENAME_FUTIMENS -#define RUMP_SYS_RENAME_FUTIMENS rump___sysimpl_futimens +#ifndef RUMP_SYS_RENAME_GETVFSSTAT +#define RUMP_SYS_RENAME_GETVFSSTAT rump___sysimpl_getvfsstat #endif -#ifndef RUMP_SYS_RENAME_MKNODAT -#define RUMP_SYS_RENAME_MKNODAT rump___sysimpl_mknodat +#ifndef RUMP_SYS_RENAME_FLOCK +#define RUMP_SYS_RENAME_FLOCK rump___sysimpl_flock #endif -#ifndef RUMP_SYS_RENAME_PIPE2 -#define RUMP_SYS_RENAME_PIPE2 rump___sysimpl_pipe2 +#ifndef RUMP_SYS_RENAME_AIO_CANCEL +#define RUMP_SYS_RENAME_AIO_CANCEL rump___sysimpl_aio_cancel #endif -#ifndef RUMP_SYS_RENAME_CHFLAGS -#define RUMP_SYS_RENAME_CHFLAGS rump___sysimpl_chflags +#ifndef RUMP_SYS_RENAME___POSIX_RENAME +#define RUMP_SYS_RENAME___POSIX_RENAME rump___sysimpl___posix_rename #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_GET_FD -#define RUMP_SYS_RENAME_EXTATTR_GET_FD rump___sysimpl_extattr_get_fd +#ifndef RUMP_SYS_RENAME_LISTXATTR +#define RUMP_SYS_RENAME_LISTXATTR rump___sysimpl_listxattr #endif -#ifndef RUMP_SYS_RENAME_LLISTXATTR -#define RUMP_SYS_RENAME_LLISTXATTR rump___sysimpl_llistxattr +#ifndef RUMP_SYS_RENAME_PIPE2 +#define RUMP_SYS_RENAME_PIPE2 rump___sysimpl_pipe2 #endif -#ifndef RUMP_SYS_RENAME_POLLTS -#define RUMP_SYS_RENAME_POLLTS rump___sysimpl_pollts50 +#ifndef RUMP_SYS_RENAME_EXTATTR_GET_FD +#define RUMP_SYS_RENAME_EXTATTR_GET_FD rump___sysimpl_extattr_get_fd #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_LIST_FILE -#define RUMP_SYS_RENAME_EXTATTR_LIST_FILE rump___sysimpl_extattr_list_file +#ifndef RUMP_SYS_RENAME_LCHOWN +#define RUMP_SYS_RENAME_LCHOWN rump___sysimpl_lchown #endif -#ifndef RUMP_SYS_RENAME_CONNECT -#define RUMP_SYS_RENAME_CONNECT rump___sysimpl_connect +#ifndef RUMP_SYS_RENAME_GETSOCKNAME +#define RUMP_SYS_RENAME_GETSOCKNAME rump___sysimpl_getsockname #endif -#ifndef RUMP_SYS_RENAME_LUTIMES -#define RUMP_SYS_RENAME_LUTIMES rump___sysimpl_lutimes50 +#ifndef RUMP_SYS_RENAME_SETTIMEOFDAY +#define RUMP_SYS_RENAME_SETTIMEOFDAY rump___sysimpl_settimeofday50 #endif -#ifndef RUMP_SYS_RENAME_FSETXATTR -#define RUMP_SYS_RENAME_FSETXATTR rump___sysimpl_fsetxattr +#ifndef RUMP_SYS_RENAME_CLOCK_NANOSLEEP +#define RUMP_SYS_RENAME_CLOCK_NANOSLEEP rump___sysimpl_clock_nanosleep #endif -#ifndef RUMP_SYS_RENAME_KQUEUE -#define RUMP_SYS_RENAME_KQUEUE rump___sysimpl_kqueue +#ifndef RUMP_SYS_RENAME_UNLINK +#define RUMP_SYS_RENAME_UNLINK rump___sysimpl_unlink #endif -#ifndef RUMP_SYS_RENAME_FLISTXATTR -#define RUMP_SYS_RENAME_FLISTXATTR rump___sysimpl_flistxattr +#ifndef RUMP_SYS_RENAME_AIO_SUSPEND +#define RUMP_SYS_RENAME_AIO_SUSPEND rump___sysimpl_aio_suspend50 #endif -#ifndef RUMP_SYS_RENAME_LCHOWN -#define RUMP_SYS_RENAME_LCHOWN rump___sysimpl_lchown +#ifndef RUMP_SYS_RENAME_SETPGID +#define RUMP_SYS_RENAME_SETPGID rump___sysimpl_setpgid #endif -#ifndef RUMP_SYS_RENAME_SETUID -#define RUMP_SYS_RENAME_SETUID rump___sysimpl_setuid +#ifndef RUMP_SYS_RENAME_FACCESSAT +#define RUMP_SYS_RENAME_FACCESSAT rump___sysimpl_faccessat #endif -#ifndef RUMP_SYS_RENAME_GETSOCKNAME -#define RUMP_SYS_RENAME_GETSOCKNAME rump___sysimpl_getsockname +#ifndef RUMP_SYS_RENAME_FSETXATTR +#define RUMP_SYS_RENAME_FSETXATTR rump___sysimpl_fsetxattr #endif -#ifndef RUMP_SYS_RENAME_UNLINKAT -#define RUMP_SYS_RENAME_UNLINKAT rump___sysimpl_unlinkat +#ifndef RUMP_SYS_RENAME_EXTATTR_SET_FILE +#define RUMP_SYS_RENAME_EXTATTR_SET_FILE rump___sysimpl_extattr_set_file #endif -#ifndef RUMP_SYS_RENAME_SENDTO -#define RUMP_SYS_RENAME_SENDTO rump___sysimpl_sendto +#ifndef RUMP_SYS_RENAME_LSTAT +#define RUMP_SYS_RENAME_LSTAT rump___sysimpl_lstat50 #endif -#ifndef RUMP_SYS_RENAME_FDISCARD -#define RUMP_SYS_RENAME_FDISCARD rump___sysimpl_fdiscard +#ifndef RUMP_SYS_RENAME_EXTATTR_SET_FD +#define RUMP_SYS_RENAME_EXTATTR_SET_FD rump___sysimpl_extattr_set_fd #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_SET_FILE -#define RUMP_SYS_RENAME_EXTATTR_SET_FILE rump___sysimpl_extattr_set_file +#ifndef RUMP_SYS_RENAME_PREADV +#define RUMP_SYS_RENAME_PREADV rump___sysimpl_preadv #endif #ifndef RUMP_SYS_RENAME_PATHCONF #define RUMP_SYS_RENAME_PATHCONF rump___sysimpl_pathconf #endif -#ifndef RUMP_SYS_RENAME_GETDENTS -#define RUMP_SYS_RENAME_GETDENTS rump___sysimpl_getdents30 +#ifndef RUMP_SYS_RENAME_MODCTL +#define RUMP_SYS_RENAME_MODCTL rump___sysimpl_modctl #endif -#ifndef RUMP_SYS_RENAME_FTRUNCATE -#define RUMP_SYS_RENAME_FTRUNCATE rump___sysimpl_ftruncate +#ifndef RUMP_SYS_RENAME___GETLOGIN +#define RUMP_SYS_RENAME___GETLOGIN rump___sysimpl___getlogin #endif -#ifndef RUMP_SYS_RENAME_LREMOVEXATTR -#define RUMP_SYS_RENAME_LREMOVEXATTR rump___sysimpl_lremovexattr +#ifndef RUMP_SYS_RENAME_GETPGRP +#define RUMP_SYS_RENAME_GETPGRP rump___sysimpl_getpgrp #endif -#ifndef RUMP_SYS_RENAME_WRITEV -#define RUMP_SYS_RENAME_WRITEV rump___sysimpl_writev +#ifndef RUMP_SYS_RENAME_FCHFLAGS +#define RUMP_SYS_RENAME_FCHFLAGS rump___sysimpl_fchflags #endif -#ifndef RUMP_SYS_RENAME_FHSTAT -#define RUMP_SYS_RENAME_FHSTAT rump___sysimpl_fhstat50 +#ifndef RUMP_SYS_RENAME_OPENAT +#define RUMP_SYS_RENAME_OPENAT rump___sysimpl_openat #endif -#ifndef RUMP_SYS_RENAME__KSEM_CLOSE -#define RUMP_SYS_RENAME__KSEM_CLOSE rump___sysimpl__ksem_close +#ifndef RUMP_SYS_RENAME_DUP +#define RUMP_SYS_RENAME_DUP rump___sysimpl_dup #endif -#ifndef RUMP_SYS_RENAME_CHROOT -#define RUMP_SYS_RENAME_CHROOT rump___sysimpl_chroot +#ifndef RUMP_SYS_RENAME_LCHMOD +#define RUMP_SYS_RENAME_LCHMOD rump___sysimpl_lchmod #endif -#ifndef RUMP_SYS_RENAME_GETITIMER -#define RUMP_SYS_RENAME_GETITIMER rump___sysimpl_getitimer50 +#ifndef RUMP_SYS_RENAME___QUOTACTL +#define RUMP_SYS_RENAME___QUOTACTL rump___sysimpl___quotactl #endif -#ifndef RUMP_SYS_RENAME_UTIMES -#define RUMP_SYS_RENAME_UTIMES rump___sysimpl_utimes50 +#ifndef RUMP_SYS_RENAME_GETPEERNAME +#define RUMP_SYS_RENAME_GETPEERNAME rump___sysimpl_getpeername #endif -#ifndef RUMP_SYS_RENAME_STAT -#define RUMP_SYS_RENAME_STAT rump___sysimpl_stat50 +#ifndef RUMP_SYS_RENAME_GETEGID +#define RUMP_SYS_RENAME_GETEGID rump___sysimpl_getegid #endif -#ifndef RUMP_SYS_RENAME__KSEM_WAIT -#define RUMP_SYS_RENAME__KSEM_WAIT rump___sysimpl__ksem_wait +#ifndef RUMP_SYS_RENAME_EXTATTR_SET_LINK +#define RUMP_SYS_RENAME_EXTATTR_SET_LINK rump___sysimpl_extattr_set_link #endif -#ifndef RUMP_SYS_RENAME_TIMER_GETOVERRUN -#define RUMP_SYS_RENAME_TIMER_GETOVERRUN rump___sysimpl_timer_getoverrun +#ifndef RUMP_SYS_RENAME_TIMER_CREATE +#define RUMP_SYS_RENAME_TIMER_CREATE rump___sysimpl_timer_create #endif -#ifndef RUMP_SYS_RENAME_CLOCK_NANOSLEEP -#define RUMP_SYS_RENAME_CLOCK_NANOSLEEP rump___sysimpl_clock_nanosleep +#ifndef RUMP_SYS_RENAME_FDISCARD +#define RUMP_SYS_RENAME_FDISCARD rump___sysimpl_fdiscard #endif -#ifndef RUMP_SYS_RENAME_FSTATAT -#define RUMP_SYS_RENAME_FSTATAT rump___sysimpl_fstatat +#ifndef RUMP_SYS_RENAME_PACCEPT +#define RUMP_SYS_RENAME_PACCEPT rump___sysimpl_paccept #endif -#ifndef RUMP_SYS_RENAME_RENAMEAT -#define RUMP_SYS_RENAME_RENAMEAT rump___sysimpl_renameat +#ifndef RUMP_SYS_RENAME_EXTATTR_LIST_FILE +#define RUMP_SYS_RENAME_EXTATTR_LIST_FILE rump___sysimpl_extattr_list_file #endif -#ifndef RUMP_SYS_RENAME_ADJTIME -#define RUMP_SYS_RENAME_ADJTIME rump___sysimpl_adjtime50 +#ifndef RUMP_SYS_RENAME__KSEM_TRYWAIT +#define RUMP_SYS_RENAME__KSEM_TRYWAIT rump___sysimpl__ksem_trywait #endif -#ifndef RUMP_SYS_RENAME_SETTIMEOFDAY -#define RUMP_SYS_RENAME_SETTIMEOFDAY rump___sysimpl_settimeofday50 +#ifndef RUMP_SYS_RENAME_LINK +#define RUMP_SYS_RENAME_LINK rump___sysimpl_link #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_GET_LINK -#define RUMP_SYS_RENAME_EXTATTR_GET_LINK rump___sysimpl_extattr_get_link +#ifndef RUMP_SYS_RENAME_LCHFLAGS +#define RUMP_SYS_RENAME_LCHFLAGS rump___sysimpl_lchflags #endif -#ifndef RUMP_SYS_RENAME_TIMER_CREATE -#define RUMP_SYS_RENAME_TIMER_CREATE rump___sysimpl_timer_create +#ifndef RUMP_SYS_RENAME_DUP2 +#define RUMP_SYS_RENAME_DUP2 rump___sysimpl_dup2 #endif -#ifndef RUMP_SYS_RENAME_GETGROUPS -#define RUMP_SYS_RENAME_GETGROUPS rump___sysimpl_getgroups +#ifndef RUMP_SYS_RENAME_DUP3 +#define RUMP_SYS_RENAME_DUP3 rump___sysimpl_dup3 #endif -#ifndef RUMP_SYS_RENAME_GETSID -#define RUMP_SYS_RENAME_GETSID rump___sysimpl_getsid +#ifndef RUMP_SYS_RENAME_FHOPEN +#define RUMP_SYS_RENAME_FHOPEN rump___sysimpl_fhopen40 #endif -#ifndef RUMP_SYS_RENAME_READLINK -#define RUMP_SYS_RENAME_READLINK rump___sysimpl_readlink +#ifndef RUMP_SYS_RENAME_SELECT +#define RUMP_SYS_RENAME_SELECT rump___sysimpl_select50 #endif -#ifndef RUMP_SYS_RENAME_PSELECT -#define RUMP_SYS_RENAME_PSELECT rump___sysimpl_pselect50 +#ifndef RUMP_SYS_RENAME_EXTATTR_LIST_LINK +#define RUMP_SYS_RENAME_EXTATTR_LIST_LINK rump___sysimpl_extattr_list_link #endif -#ifndef RUMP_SYS_RENAME_POLL -#define RUMP_SYS_RENAME_POLL rump___sysimpl_poll +#ifndef RUMP_SYS_RENAME_REVOKE +#define RUMP_SYS_RENAME_REVOKE rump___sysimpl_revoke #endif -#ifndef RUMP_SYS_RENAME_ACCEPT -#define RUMP_SYS_RENAME_ACCEPT rump___sysimpl_accept +#ifndef RUMP_SYS_RENAME_FSTATVFS1 +#define RUMP_SYS_RENAME_FSTATVFS1 rump___sysimpl_fstatvfs1 #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_DELETE_FILE -#define RUMP_SYS_RENAME_EXTATTR_DELETE_FILE rump___sysimpl_extattr_delete_file -#endif - -#ifndef RUMP_SYS_RENAME_FCHROOT -#define RUMP_SYS_RENAME_FCHROOT rump___sysimpl_fchroot -#endif - -#ifndef RUMP_SYS_RENAME_POSIX_FALLOCATE -#define RUMP_SYS_RENAME_POSIX_FALLOCATE rump___sysimpl_posix_fallocate +#ifndef RUMP_SYS_RENAME_UTRACE +#define RUMP_SYS_RENAME_UTRACE rump___sysimpl_utrace #endif -#ifndef RUMP_SYS_RENAME_LISTXATTR -#define RUMP_SYS_RENAME_LISTXATTR rump___sysimpl_listxattr +#ifndef RUMP_SYS_RENAME_UMASK +#define RUMP_SYS_RENAME_UMASK rump___sysimpl_umask #endif -#ifndef RUMP_SYS_RENAME___POSIX_FCHOWN -#define RUMP_SYS_RENAME___POSIX_FCHOWN rump___sysimpl___posix_fchown +#ifndef RUMP_SYS_RENAME_FCNTL +#define RUMP_SYS_RENAME_FCNTL rump___sysimpl_fcntl #endif -#ifndef RUMP_SYS_RENAME_READLINKAT -#define RUMP_SYS_RENAME_READLINKAT rump___sysimpl_readlinkat +#ifndef RUMP_SYS_RENAME_MKFIFO +#define RUMP_SYS_RENAME_MKFIFO rump___sysimpl_mkfifo #endif -#ifndef RUMP_SYS_RENAME_CLOCK_GETTIME -#define RUMP_SYS_RENAME_CLOCK_GETTIME rump___sysimpl_clock_gettime50 +#ifndef RUMP_SYS_RENAME_POLLTS +#define RUMP_SYS_RENAME_POLLTS rump___sysimpl_pollts50 #endif -#ifndef RUMP_SYS_RENAME_AIO_RETURN -#define RUMP_SYS_RENAME_AIO_RETURN rump___sysimpl_aio_return +#ifndef RUMP_SYS_RENAME_OPEN +#define RUMP_SYS_RENAME_OPEN rump___sysimpl_open #endif -#ifndef RUMP_SYS_RENAME_GETVFSSTAT -#define RUMP_SYS_RENAME_GETVFSSTAT rump___sysimpl_getvfsstat +#ifndef RUMP_SYS_RENAME_ACCESS +#define RUMP_SYS_RENAME_ACCESS rump___sysimpl_access #endif -#ifndef RUMP_SYS_RENAME_FUTIMES -#define RUMP_SYS_RENAME_FUTIMES rump___sysimpl_futimes50 +#ifndef RUMP_SYS_RENAME_MKNOD +#define RUMP_SYS_RENAME_MKNOD rump___sysimpl_mknod50 #endif -#ifndef RUMP_SYS_RENAME_FREMOVEXATTR -#define RUMP_SYS_RENAME_FREMOVEXATTR rump___sysimpl_fremovexattr +#ifndef RUMP_SYS_RENAME_TRUNCATE +#define RUMP_SYS_RENAME_TRUNCATE rump___sysimpl_truncate #endif -#ifndef RUMP_SYS_RENAME_RECVMMSG -#define RUMP_SYS_RENAME_RECVMMSG rump___sysimpl_recvmmsg +#ifndef RUMP_SYS_RENAME_SETGID +#define RUMP_SYS_RENAME_SETGID rump___sysimpl_setgid #endif -#ifndef RUMP_SYS_RENAME_MOUNT -#define RUMP_SYS_RENAME_MOUNT rump___sysimpl_mount50 +#ifndef RUMP_SYS_RENAME_LREMOVEXATTR +#define RUMP_SYS_RENAME_LREMOVEXATTR rump___sysimpl_lremovexattr #endif -#ifndef RUMP_SYS_RENAME_UTRACE -#define RUMP_SYS_RENAME_UTRACE rump___sysimpl_utrace +#ifndef RUMP_SYS_RENAME_RMDIR +#define RUMP_SYS_RENAME_RMDIR rump___sysimpl_rmdir #endif -#ifndef RUMP_SYS_RENAME_RECVFROM -#define RUMP_SYS_RENAME_RECVFROM rump___sysimpl_recvfrom +#ifndef RUMP_SYS_RENAME_KQUEUE1 +#define RUMP_SYS_RENAME_KQUEUE1 rump___sysimpl_kqueue1 #endif -#ifndef RUMP_SYS_RENAME_GETRLIMIT -#define RUMP_SYS_RENAME_GETRLIMIT rump___sysimpl_getrlimit +#ifndef RUMP_SYS_RENAME_CLOCK_GETRES +#define RUMP_SYS_RENAME_CLOCK_GETRES rump___sysimpl_clock_getres50 #endif -#ifndef RUMP_SYS_RENAME_FCHOWN -#define RUMP_SYS_RENAME_FCHOWN rump___sysimpl_fchown +#ifndef RUMP_SYS_RENAME_GETGID_WITH_EGID +#define RUMP_SYS_RENAME_GETGID_WITH_EGID rump___sysimpl_getgid #endif -#ifndef RUMP_SYS_RENAME_SOCKETPAIR -#define RUMP_SYS_RENAME_SOCKETPAIR rump___sysimpl_socketpair +#ifndef RUMP_SYS_RENAME_SYMLINKAT +#define RUMP_SYS_RENAME_SYMLINKAT rump___sysimpl_symlinkat #endif -#ifndef RUMP_SYS_RENAME_CHOWN -#define RUMP_SYS_RENAME_CHOWN rump___sysimpl_chown +#ifndef RUMP_SYS_RENAME_FSYNC_RANGE +#define RUMP_SYS_RENAME_FSYNC_RANGE rump___sysimpl_fsync_range #endif -#ifndef RUMP_SYS_RENAME_GETEGID -#define RUMP_SYS_RENAME_GETEGID rump___sysimpl_getegid +#ifndef RUMP_SYS_RENAME_PWRITE +#define RUMP_SYS_RENAME_PWRITE rump___sysimpl_pwrite #endif -#ifndef RUMP_SYS_RENAME_STATVFS1 -#define RUMP_SYS_RENAME_STATVFS1 rump___sysimpl_statvfs1 +#ifndef RUMP_SYS_RENAME_GETRLIMIT +#define RUMP_SYS_RENAME_GETRLIMIT rump___sysimpl_getrlimit #endif -#ifndef RUMP_SYS_RENAME_SOCKET -#define RUMP_SYS_RENAME_SOCKET rump___sysimpl_socket30 +#ifndef RUMP_SYS_RENAME_RENAMEAT +#define RUMP_SYS_RENAME_RENAMEAT rump___sysimpl_renameat #endif -#ifndef RUMP_SYS_RENAME_LCHMOD -#define RUMP_SYS_RENAME_LCHMOD rump___sysimpl_lchmod +#ifndef RUMP_SYS_RENAME_TIMER_GETTIME +#define RUMP_SYS_RENAME_TIMER_GETTIME rump___sysimpl_timer_gettime50 #endif -#ifndef RUMP_SYS_RENAME_GETFH -#define RUMP_SYS_RENAME_GETFH rump___sysimpl_getfh30 +#ifndef RUMP_SYS_RENAME_FGETXATTR +#define RUMP_SYS_RENAME_FGETXATTR rump___sysimpl_fgetxattr #endif -#ifndef RUMP_SYS_RENAME_KQUEUE1 -#define RUMP_SYS_RENAME_KQUEUE1 rump___sysimpl_kqueue1 +#ifndef RUMP_SYS_RENAME_SENDMSG +#define RUMP_SYS_RENAME_SENDMSG rump___sysimpl_sendmsg #endif -#ifndef RUMP_SYS_RENAME_SHUTDOWN -#define RUMP_SYS_RENAME_SHUTDOWN rump___sysimpl_shutdown +#ifndef RUMP_SYS_RENAME__KSEM_OPEN +#define RUMP_SYS_RENAME__KSEM_OPEN rump___sysimpl__ksem_open #endif -#ifndef RUMP_SYS_RENAME_PREADV -#define RUMP_SYS_RENAME_PREADV rump___sysimpl_preadv +#ifndef RUMP_SYS_RENAME_FLISTXATTR +#define RUMP_SYS_RENAME_FLISTXATTR rump___sysimpl_flistxattr #endif -#ifndef RUMP_SYS_RENAME__KSEM_POST -#define RUMP_SYS_RENAME__KSEM_POST rump___sysimpl__ksem_post +#ifndef RUMP_SYS_RENAME_LUTIMES +#define RUMP_SYS_RENAME_LUTIMES rump___sysimpl_lutimes50 #endif -#ifndef RUMP_SYS_RENAME_TIMER_DELETE -#define RUMP_SYS_RENAME_TIMER_DELETE rump___sysimpl_timer_delete +#ifndef RUMP_SYS_RENAME_CLOCK_SETTIME +#define RUMP_SYS_RENAME_CLOCK_SETTIME rump___sysimpl_clock_settime50 #endif -#ifndef RUMP_SYS_RENAME_FCHMODAT -#define RUMP_SYS_RENAME_FCHMODAT rump___sysimpl_fchmodat +#ifndef RUMP_SYS_RENAME_SETITIMER +#define RUMP_SYS_RENAME_SETITIMER rump___sysimpl_setitimer50 #endif -#ifndef RUMP_SYS_RENAME_AIO_WRITE -#define RUMP_SYS_RENAME_AIO_WRITE rump___sysimpl_aio_write +#ifndef RUMP_SYS_RENAME_SHUTDOWN +#define RUMP_SYS_RENAME_SHUTDOWN rump___sysimpl_shutdown #endif -#ifndef RUMP_SYS_RENAME_LSEEK -#define RUMP_SYS_RENAME_LSEEK rump___sysimpl_lseek +#ifndef RUMP_SYS_RENAME_PREAD +#define RUMP_SYS_RENAME_PREAD rump___sysimpl_pread #endif -#ifndef RUMP_SYS_RENAME__KSEM_OPEN -#define RUMP_SYS_RENAME__KSEM_OPEN rump___sysimpl__ksem_open +#ifndef RUMP_SYS_RENAME_LISTEN +#define RUMP_SYS_RENAME_LISTEN rump___sysimpl_listen #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_LIST_LINK -#define RUMP_SYS_RENAME_EXTATTR_LIST_LINK rump___sysimpl_extattr_list_link +#ifndef RUMP_SYS_RENAME_MKDIR +#define RUMP_SYS_RENAME_MKDIR rump___sysimpl_mkdir #endif -#ifndef RUMP_SYS_RENAME_PWRITE -#define RUMP_SYS_RENAME_PWRITE rump___sysimpl_pwrite +#ifndef RUMP_SYS_RENAME_GETFH +#define RUMP_SYS_RENAME_GETFH rump___sysimpl_getfh30 #endif -#ifndef RUMP_SYS_RENAME___GETCWD -#define RUMP_SYS_RENAME___GETCWD rump___sysimpl___getcwd +#ifndef RUMP_SYS_RENAME_AIO_FSYNC +#define RUMP_SYS_RENAME_AIO_FSYNC rump___sysimpl_aio_fsync #endif -#ifndef RUMP_SYS_RENAME__KSEM_TIMEDWAIT -#define RUMP_SYS_RENAME__KSEM_TIMEDWAIT rump___sysimpl__ksem_timedwait +#ifndef RUMP_SYS_RENAME___POSIX_LCHOWN +#define RUMP_SYS_RENAME___POSIX_LCHOWN rump___sysimpl___posix_lchown #endif #ifndef RUMP_SYS_RENAME_GETEUID #define RUMP_SYS_RENAME_GETEUID rump___sysimpl_geteuid #endif -#ifndef RUMP_SYS_RENAME_MKDIR -#define RUMP_SYS_RENAME_MKDIR rump___sysimpl_mkdir +#ifndef RUMP_SYS_RENAME_FSYNC +#define RUMP_SYS_RENAME_FSYNC rump___sysimpl_fsync #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_SET_FD -#define RUMP_SYS_RENAME_EXTATTR_SET_FD rump___sysimpl_extattr_set_fd +#ifndef RUMP_SYS_RENAME_EXTATTR_DELETE_FILE +#define RUMP_SYS_RENAME_EXTATTR_DELETE_FILE rump___sysimpl_extattr_delete_file #endif -#ifndef RUMP_SYS_RENAME_AIO_FSYNC -#define RUMP_SYS_RENAME_AIO_FSYNC rump___sysimpl_aio_fsync +#ifndef RUMP_SYS_RENAME_ISSETUGID +#define RUMP_SYS_RENAME_ISSETUGID rump___sysimpl_issetugid #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_SET_LINK -#define RUMP_SYS_RENAME_EXTATTR_SET_LINK rump___sysimpl_extattr_set_link +#ifndef RUMP_SYS_RENAME_LGETXATTR +#define RUMP_SYS_RENAME_LGETXATTR rump___sysimpl_lgetxattr #endif -#ifndef RUMP_SYS_RENAME_FKTRACE -#define RUMP_SYS_RENAME_FKTRACE rump___sysimpl_fktrace +#ifndef RUMP_SYS_RENAME_KEVENT +#define RUMP_SYS_RENAME_KEVENT rump___sysimpl_kevent50 #endif -#ifndef RUMP_SYS_RENAME_FCHFLAGS -#define RUMP_SYS_RENAME_FCHFLAGS rump___sysimpl_fchflags +#ifndef RUMP_SYS_RENAME_AIO_ERROR +#define RUMP_SYS_RENAME_AIO_ERROR rump___sysimpl_aio_error #endif -#ifndef RUMP_SYS_RENAME_KTRACE -#define RUMP_SYS_RENAME_KTRACE rump___sysimpl_ktrace +#ifndef RUMP_SYS_RENAME_POSIX_FADVISE +#define RUMP_SYS_RENAME_POSIX_FADVISE rump___sysimpl_posix_fadvise50 #endif -#ifndef RUMP_SYS_RENAME_GETXATTR -#define RUMP_SYS_RENAME_GETXATTR rump___sysimpl_getxattr +#ifndef RUMP_SYS_RENAME_FSTAT +#define RUMP_SYS_RENAME_FSTAT rump___sysimpl_fstat50 #endif -#ifndef RUMP_SYS_RENAME_FCNTL -#define RUMP_SYS_RENAME_FCNTL rump___sysimpl_fcntl +#ifndef RUMP_SYS_RENAME__KSEM_DESTROY +#define RUMP_SYS_RENAME__KSEM_DESTROY rump___sysimpl__ksem_destroy #endif -#ifndef RUMP_SYS_RENAME_SETPGID -#define RUMP_SYS_RENAME_SETPGID rump___sysimpl_setpgid +#ifndef RUMP_SYS_RENAME_MKNODAT +#define RUMP_SYS_RENAME_MKNODAT rump___sysimpl_mknodat #endif -#ifndef RUMP_SYS_RENAME_LINK -#define RUMP_SYS_RENAME_LINK rump___sysimpl_link +#ifndef RUMP_SYS_RENAME_CHDIR +#define RUMP_SYS_RENAME_CHDIR rump___sysimpl_chdir #endif -#ifndef RUMP_SYS_RENAME_TIMER_SETTIME -#define RUMP_SYS_RENAME_TIMER_SETTIME rump___sysimpl_timer_settime50 +#ifndef RUMP_SYS_RENAME_EXTATTR_DELETE_LINK +#define RUMP_SYS_RENAME_EXTATTR_DELETE_LINK rump___sysimpl_extattr_delete_link #endif -#ifndef RUMP_SYS_RENAME_LCHFLAGS -#define RUMP_SYS_RENAME_LCHFLAGS rump___sysimpl_lchflags +#ifndef RUMP_SYS_RENAME_CHOWN +#define RUMP_SYS_RENAME_CHOWN rump___sysimpl_chown +#endif + +#ifndef RUMP_SYS_RENAME_CLOCK_GETTIME +#define RUMP_SYS_RENAME_CLOCK_GETTIME rump___sysimpl_clock_gettime50 #endif #ifndef RUMP_SYS_RENAME_FCHDIR #define RUMP_SYS_RENAME_FCHDIR rump___sysimpl_fchdir #endif -#ifndef RUMP_SYS_RENAME_CHDIR -#define RUMP_SYS_RENAME_CHDIR rump___sysimpl_chdir +#ifndef RUMP_SYS_RENAME_RECVMSG +#define RUMP_SYS_RENAME_RECVMSG rump___sysimpl_recvmsg #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_DELETE_FD -#define RUMP_SYS_RENAME_EXTATTR_DELETE_FD rump___sysimpl_extattr_delete_fd +#ifndef RUMP_SYS_RENAME_FCHOWN +#define RUMP_SYS_RENAME_FCHOWN rump___sysimpl_fchown #endif -#ifndef RUMP_SYS_RENAME__KSEM_UNLINK -#define RUMP_SYS_RENAME__KSEM_UNLINK rump___sysimpl__ksem_unlink +#ifndef RUMP_SYS_RENAME_SETREGID +#define RUMP_SYS_RENAME_SETREGID rump___sysimpl_setregid #endif -#ifndef RUMP_SYS_RENAME_MODCTL -#define RUMP_SYS_RENAME_MODCTL rump___sysimpl_modctl +#ifndef RUMP_SYS_RENAME_POLL +#define RUMP_SYS_RENAME_POLL rump___sysimpl_poll #endif -#ifndef RUMP_SYS_RENAME_FPATHCONF -#define RUMP_SYS_RENAME_FPATHCONF rump___sysimpl_fpathconf +#ifndef RUMP_SYS_RENAME_READV +#define RUMP_SYS_RENAME_READV rump___sysimpl_readv #endif -#ifndef RUMP_SYS_RENAME_FSYNC_RANGE -#define RUMP_SYS_RENAME_FSYNC_RANGE rump___sysimpl_fsync_range +#ifndef RUMP_SYS_RENAME_SYMLINK +#define RUMP_SYS_RENAME_SYMLINK rump___sysimpl_symlink #endif -#ifndef RUMP_SYS_RENAME_FCHMOD -#define RUMP_SYS_RENAME_FCHMOD rump___sysimpl_fchmod +#ifndef RUMP_SYS_RENAME_SENDMMSG +#define RUMP_SYS_RENAME_SENDMMSG rump___sysimpl_sendmmsg #endif -#ifndef RUMP_SYS_RENAME_READV -#define RUMP_SYS_RENAME_READV rump___sysimpl_readv +#ifndef RUMP_SYS_RENAME_PSELECT +#define RUMP_SYS_RENAME_PSELECT rump___sysimpl_pselect50 #endif -#ifndef RUMP_SYS_RENAME_NANOSLEEP -#define RUMP_SYS_RENAME_NANOSLEEP rump___sysimpl_nanosleep50 +#ifndef RUMP_SYS_RENAME_SETGROUPS +#define RUMP_SYS_RENAME_SETGROUPS rump___sysimpl_setgroups #endif -#ifndef RUMP_SYS_RENAME_CHMOD -#define RUMP_SYS_RENAME_CHMOD rump___sysimpl_chmod +#ifndef RUMP_SYS_RENAME_SETXATTR +#define RUMP_SYS_RENAME_SETXATTR rump___sysimpl_setxattr #endif -#ifndef RUMP_SYS_RENAME_DUP -#define RUMP_SYS_RENAME_DUP rump___sysimpl_dup +#ifndef RUMP_SYS_RENAME_SETEGID +#define RUMP_SYS_RENAME_SETEGID rump___sysimpl_setegid #endif -#ifndef RUMP_SYS_RENAME_LINKAT -#define RUMP_SYS_RENAME_LINKAT rump___sysimpl_linkat +#ifndef RUMP_SYS_RENAME_GETSOCKOPT +#define RUMP_SYS_RENAME_GETSOCKOPT rump___sysimpl_getsockopt #endif -#ifndef RUMP_SYS_RENAME_AIO_READ -#define RUMP_SYS_RENAME_AIO_READ rump___sysimpl_aio_read +#ifndef RUMP_SYS_RENAME_CONNECT +#define RUMP_SYS_RENAME_CONNECT rump___sysimpl_connect #endif -#ifndef RUMP_SYS_RENAME_SELECT -#define RUMP_SYS_RENAME_SELECT rump___sysimpl_select50 +#ifndef RUMP_SYS_RENAME_LSEEK +#define RUMP_SYS_RENAME_LSEEK rump___sysimpl_lseek #endif -#ifndef RUMP_SYS_RENAME_WRITE -#define RUMP_SYS_RENAME_WRITE rump___sysimpl_write +#ifndef RUMP_SYS_RENAME_MKFIFOAT +#define RUMP_SYS_RENAME_MKFIFOAT rump___sysimpl_mkfifoat #endif -#ifndef RUMP_SYS_RENAME_SETREGID -#define RUMP_SYS_RENAME_SETREGID rump___sysimpl_setregid +#ifndef RUMP_SYS_RENAME_EXTATTR_DELETE_FD +#define RUMP_SYS_RENAME_EXTATTR_DELETE_FD rump___sysimpl_extattr_delete_fd #endif -#ifndef RUMP_SYS_RENAME_BIND -#define RUMP_SYS_RENAME_BIND rump___sysimpl_bind +#ifndef RUMP_SYS_RENAME_CHMOD +#define RUMP_SYS_RENAME_CHMOD rump___sysimpl_chmod #endif -#ifndef RUMP_SYS_RENAME_SETXATTR -#define RUMP_SYS_RENAME_SETXATTR rump___sysimpl_setxattr +#ifndef RUMP_SYS_RENAME_BIND +#define RUMP_SYS_RENAME_BIND rump___sysimpl_bind #endif -#ifndef RUMP_SYS_RENAME_REBOOT -#define RUMP_SYS_RENAME_REBOOT rump___sysimpl_reboot +#ifndef RUMP_SYS_RENAME__KSEM_WAIT +#define RUMP_SYS_RENAME__KSEM_WAIT rump___sysimpl__ksem_wait #endif -#ifndef RUMP_SYS_RENAME_CLOSE -#define RUMP_SYS_RENAME_CLOSE rump___sysimpl_close +#ifndef RUMP_SYS_RENAME_FCHOWNAT +#define RUMP_SYS_RENAME_FCHOWNAT rump___sysimpl_fchownat #endif -#ifndef RUMP_SYS_RENAME_EXTATTR_DELETE_LINK -#define RUMP_SYS_RENAME_EXTATTR_DELETE_LINK rump___sysimpl_extattr_delete_link +#ifndef RUMP_SYS_RENAME_SETUID +#define RUMP_SYS_RENAME_SETUID rump___sysimpl_setuid #endif -#ifndef RUMP_SYS_RENAME___POSIX_CHOWN -#define RUMP_SYS_RENAME___POSIX_CHOWN rump___sysimpl___posix_chown +#ifndef RUMP_SYS_RENAME_GETUID_WITH_EUID +#define RUMP_SYS_RENAME_GETUID_WITH_EUID rump___sysimpl_getuid #endif -#ifndef RUMP_SYS_RENAME_AIO_ERROR -#define RUMP_SYS_RENAME_AIO_ERROR rump___sysimpl_aio_error +#ifndef RUMP_SYS_RENAME_CHROOT +#define RUMP_SYS_RENAME_CHROOT rump___sysimpl_chroot #endif -#ifndef RUMP_SYS_RENAME_FHSTATVFS1 -#define RUMP_SYS_RENAME_FHSTATVFS1 rump___sysimpl_fhstatvfs140 +#ifndef RUMP_SYS_RENAME_FCHMOD +#define RUMP_SYS_RENAME_FCHMOD rump___sysimpl_fchmod #endif -#ifndef RUMP_SYS_RENAME_SETSOCKOPT -#define RUMP_SYS_RENAME_SETSOCKOPT rump___sysimpl_setsockopt +#ifndef RUMP_SYS_RENAME_FPATHCONF +#define RUMP_SYS_RENAME_FPATHCONF rump___sysimpl_fpathconf #endif #ifndef RUMP_SYS_RENAME_UNMOUNT #define RUMP_SYS_RENAME_UNMOUNT rump___sysimpl_unmount #endif -#ifndef RUMP_SYS_RENAME_MKDIRAT -#define RUMP_SYS_RENAME_MKDIRAT rump___sysimpl_mkdirat +#ifndef RUMP_SYS_RENAME_READLINK +#define RUMP_SYS_RENAME_READLINK rump___sysimpl_readlink #endif -#ifndef RUMP_SYS_RENAME_SETSID -#define RUMP_SYS_RENAME_SETSID rump___sysimpl_setsid +#ifndef RUMP_SYS_RENAME_FUTIMENS +#define RUMP_SYS_RENAME_FUTIMENS rump___sysimpl_futimens #endif -#ifndef RUMP_SYS_RENAME_FACCESSAT -#define RUMP_SYS_RENAME_FACCESSAT rump___sysimpl_faccessat +#ifndef RUMP_SYS_RENAME_LSETXATTR +#define RUMP_SYS_RENAME_LSETXATTR rump___sysimpl_lsetxattr #endif -#ifndef RUMP_SYS_RENAME_LSTAT -#define RUMP_SYS_RENAME_LSTAT rump___sysimpl_lstat50 +#ifndef RUMP_SYS_RENAME__KSEM_GETVALUE +#define RUMP_SYS_RENAME__KSEM_GETVALUE rump___sysimpl__ksem_getvalue #endif -#ifndef RUMP_SYS_RENAME_OPENAT -#define RUMP_SYS_RENAME_OPENAT rump___sysimpl_openat +#ifndef RUMP_SYS_RENAME___POSIX_CHOWN +#define RUMP_SYS_RENAME___POSIX_CHOWN rump___sysimpl___posix_chown #endif -#ifndef RUMP_SYS_RENAME_TRUNCATE -#define RUMP_SYS_RENAME_TRUNCATE rump___sysimpl_truncate +#ifndef RUMP_SYS_RENAME_AIO_READ +#define RUMP_SYS_RENAME_AIO_READ rump___sysimpl_aio_read #endif -#ifndef RUMP_SYS_RENAME_FSYNC -#define RUMP_SYS_RENAME_FSYNC rump___sysimpl_fsync +#ifndef RUMP_SYS_RENAME_READ +#define RUMP_SYS_RENAME_READ rump___sysimpl_read #endif -#ifndef RUMP_SYS_RENAME_GETTIMEOFDAY -#define RUMP_SYS_RENAME_GETTIMEOFDAY rump___sysimpl_gettimeofday50 +#ifndef RUMP_SYS_RENAME_RENAME +#define RUMP_SYS_RENAME_RENAME rump___sysimpl_rename #endif -#ifndef RUMP_SYS_RENAME_UMASK -#define RUMP_SYS_RENAME_UMASK rump___sysimpl_umask +#ifndef RUMP_SYS_RENAME_WRITEV +#define RUMP_SYS_RENAME_WRITEV rump___sysimpl_writev #endif -#ifndef RUMP_SYS_RENAME__KSEM_DESTROY -#define RUMP_SYS_RENAME__KSEM_DESTROY rump___sysimpl__ksem_destroy +#ifndef RUMP_SYS_RENAME_CLOSE +#define RUMP_SYS_RENAME_CLOSE rump___sysimpl_close #endif -#ifndef RUMP_SYS_RENAME_FLOCK -#define RUMP_SYS_RENAME_FLOCK rump___sysimpl_flock +#ifndef RUMP_SYS_RENAME_GETPGID +#define RUMP_SYS_RENAME_GETPGID rump___sysimpl_getpgid #endif -#ifndef RUMP_SYS_RENAME_SETREUID -#define RUMP_SYS_RENAME_SETREUID rump___sysimpl_setreuid +#ifndef RUMP_SYS_RENAME_NANOSLEEP +#define RUMP_SYS_RENAME_NANOSLEEP rump___sysimpl_nanosleep50 #endif -#ifndef RUMP_SYS_RENAME___GETLOGIN -#define RUMP_SYS_RENAME___GETLOGIN rump___sysimpl___getlogin +#ifndef RUMP_SYS_RENAME_IOCTL +#define RUMP_SYS_RENAME_IOCTL rump___sysimpl_ioctl #endif -#ifndef RUMP_SYS_RENAME_MKNOD -#define RUMP_SYS_RENAME_MKNOD rump___sysimpl_mknod50 +#ifndef RUMP_SYS_RENAME_FHSTAT +#define RUMP_SYS_RENAME_FHSTAT rump___sysimpl_fhstat50 #endif -#ifndef RUMP_SYS_RENAME_MKFIFOAT -#define RUMP_SYS_RENAME_MKFIFOAT rump___sysimpl_mkfifoat +#ifndef RUMP_SYS_RENAME_RECVFROM +#define RUMP_SYS_RENAME_RECVFROM rump___sysimpl_recvfrom #endif -#ifndef RUMP_SYS_RENAME_POSIX_FADVISE -#define RUMP_SYS_RENAME_POSIX_FADVISE rump___sysimpl_posix_fadvise50 +#ifndef RUMP_SYS_RENAME__KSEM_INIT +#define RUMP_SYS_RENAME__KSEM_INIT rump___sysimpl__ksem_init #endif -#ifndef RUMP_SYS_RENAME___POSIX_RENAME -#define RUMP_SYS_RENAME___POSIX_RENAME rump___sysimpl___posix_rename +#ifndef RUMP_SYS_RENAME__KSEM_CLOSE +#define RUMP_SYS_RENAME__KSEM_CLOSE rump___sysimpl__ksem_close #endif -#ifndef RUMP_SYS_RENAME_DUP2 -#define RUMP_SYS_RENAME_DUP2 rump___sysimpl_dup2 +#ifndef RUMP_SYS_RENAME_MOUNT +#define RUMP_SYS_RENAME_MOUNT rump___sysimpl_mount50 #endif -#ifndef RUMP_SYS_RENAME_DUP3 -#define RUMP_SYS_RENAME_DUP3 rump___sysimpl_dup3 +#ifndef RUMP_SYS_RENAME_UTIMES +#define RUMP_SYS_RENAME_UTIMES rump___sysimpl_utimes50 #endif -#ifndef RUMP_SYS_RENAME_CLOCK_GETRES -#define RUMP_SYS_RENAME_CLOCK_GETRES rump___sysimpl_clock_getres50 +#ifndef RUMP_SYS_RENAME_FCHMODAT +#define RUMP_SYS_RENAME_FCHMODAT rump___sysimpl_fchmodat #endif -#ifndef RUMP_SYS_RENAME_REMOVEXATTR -#define RUMP_SYS_RENAME_REMOVEXATTR rump___sysimpl_removexattr +#ifndef RUMP_SYS_RENAME_KTRACE +#define RUMP_SYS_RENAME_KTRACE rump___sysimpl_ktrace #endif -#ifndef RUMP_SYS_RENAME_GETSOCKOPT -#define RUMP_SYS_RENAME_GETSOCKOPT rump___sysimpl_getsockopt +#ifndef RUMP_SYS_RENAME_SYNC +#define RUMP_SYS_RENAME_SYNC rump___sysimpl_sync #endif -#ifndef RUMP_SYS_RENAME_SYMLINKAT -#define RUMP_SYS_RENAME_SYMLINKAT rump___sysimpl_symlinkat +#ifndef RUMP_SYS_RENAME_UNLINKAT +#define RUMP_SYS_RENAME_UNLINKAT rump___sysimpl_unlinkat #endif -#ifndef RUMP_SYS_RENAME_FDATASYNC -#define RUMP_SYS_RENAME_FDATASYNC rump___sysimpl_fdatasync +#ifndef RUMP_SYS_RENAME_LLISTXATTR +#define RUMP_SYS_RENAME_LLISTXATTR rump___sysimpl_llistxattr #endif -#ifndef RUMP_SYS_RENAME__KSEM_TRYWAIT -#define RUMP_SYS_RENAME__KSEM_TRYWAIT rump___sysimpl__ksem_trywait +#ifndef RUMP_SYS_RENAME__KSEM_POST +#define RUMP_SYS_RENAME__KSEM_POST rump___sysimpl__ksem_post #endif -#ifndef RUMP_SYS_RENAME_RECVMSG -#define RUMP_SYS_RENAME_RECVMSG rump___sysimpl_recvmsg +#ifndef RUMP_SYS_RENAME_STATVFS1 +#define RUMP_SYS_RENAME_STATVFS1 rump___sysimpl_statvfs1 #endif -#ifndef RUMP_SYS_RENAME_RMDIR -#define RUMP_SYS_RENAME_RMDIR rump___sysimpl_rmdir +#ifndef RUMP_SYS_RENAME_STAT +#define RUMP_SYS_RENAME_STAT rump___sysimpl_stat50 #endif -#ifndef RUMP_SYS_RENAME_LIO_LISTIO -#define RUMP_SYS_RENAME_LIO_LISTIO rump___sysimpl_lio_listio +#ifndef RUMP_SYS_RENAME_SETSOCKOPT +#define RUMP_SYS_RENAME_SETSOCKOPT rump___sysimpl_setsockopt #endif -#ifndef RUMP_SYS_RENAME_LGETXATTR -#define RUMP_SYS_RENAME_LGETXATTR rump___sysimpl_lgetxattr +#ifndef RUMP_SYS_RENAME_GETDENTS +#define RUMP_SYS_RENAME_GETDENTS rump___sysimpl_getdents30 #endif -#ifndef RUMP_SYS_RENAME_FSTATVFS1 -#define RUMP_SYS_RENAME_FSTATVFS1 rump___sysimpl_fstatvfs1 +#ifndef RUMP_SYS_RENAME_KQUEUE +#define RUMP_SYS_RENAME_KQUEUE rump___sysimpl_kqueue #endif -#ifndef RUMP_SYS_RENAME_PWRITEV -#define RUMP_SYS_RENAME_PWRITEV rump___sysimpl_pwritev +#ifndef RUMP_SYS_RENAME___SYSCTL +#define RUMP_SYS_RENAME___SYSCTL rump___sysimpl___sysctl #endif -#ifndef RUMP_SYS_RENAME__KSEM_GETVALUE -#define RUMP_SYS_RENAME__KSEM_GETVALUE rump___sysimpl__ksem_getvalue +#ifndef RUMP_SYS_RENAME_FREMOVEXATTR +#define RUMP_SYS_RENAME_FREMOVEXATTR rump___sysimpl_fremovexattr #endif -#ifndef RUMP_SYS_RENAME_GETPGRP -#define RUMP_SYS_RENAME_GETPGRP rump___sysimpl_getpgrp +#ifndef RUMP_SYS_RENAME_EXTATTRCTL +#define RUMP_SYS_RENAME_EXTATTRCTL rump___sysimpl_extattrctl #endif -#ifndef RUMP_SYS_RENAME_SENDMMSG -#define RUMP_SYS_RENAME_SENDMMSG rump___sysimpl_sendmmsg +#ifndef RUMP_SYS_RENAME_GETITIMER +#define RUMP_SYS_RENAME_GETITIMER rump___sysimpl_getitimer50 #endif -#ifndef RUMP_SYS_RENAME___SYSCTL -#define RUMP_SYS_RENAME___SYSCTL rump___sysimpl___sysctl +#ifndef RUMP_SYS_RENAME_GETPID_WITH_PPID +#define RUMP_SYS_RENAME_GETPID_WITH_PPID rump___sysimpl_getpid #endif -#ifndef RUMP_SYS_RENAME_MKFIFO -#define RUMP_SYS_RENAME_MKFIFO rump___sysimpl_mkfifo +#ifndef RUMP_SYS_RENAME_SETREUID +#define RUMP_SYS_RENAME_SETREUID rump___sysimpl_setreuid #endif -#ifndef RUMP_SYS_RENAME_CLOCK_SETTIME -#define RUMP_SYS_RENAME_CLOCK_SETTIME rump___sysimpl_clock_settime50 +#ifndef RUMP_SYS_RENAME_FSTATAT +#define RUMP_SYS_RENAME_FSTATAT rump___sysimpl_fstatat #endif -#ifndef RUMP_SYS_RENAME_ACCESS -#define RUMP_SYS_RENAME_ACCESS rump___sysimpl_access +#ifndef RUMP_SYS_RENAME_LINKAT +#define RUMP_SYS_RENAME_LINKAT rump___sysimpl_linkat #endif -#ifndef RUMP_SYS_RENAME_ISSETUGID -#define RUMP_SYS_RENAME_ISSETUGID rump___sysimpl_issetugid +#ifndef RUMP_SYS_RENAME_TIMER_SETTIME +#define RUMP_SYS_RENAME_TIMER_SETTIME rump___sysimpl_timer_settime50 #endif -#ifndef RUMP_SYS_RENAME_PREAD -#define RUMP_SYS_RENAME_PREAD rump___sysimpl_pread +#ifndef RUMP_SYS_RENAME_SOCKETPAIR +#define RUMP_SYS_RENAME_SOCKETPAIR rump___sysimpl_socketpair #endif -#ifndef RUMP_SYS_RENAME_REVOKE -#define RUMP_SYS_RENAME_REVOKE rump___sysimpl_revoke +#ifndef RUMP_SYS_RENAME_AIO_WRITE +#define RUMP_SYS_RENAME_AIO_WRITE rump___sysimpl_aio_write #endif -#ifndef RUMP_SYS_RENAME_FCHOWNAT -#define RUMP_SYS_RENAME_FCHOWNAT rump___sysimpl_fchownat +#ifndef RUMP_SYS_RENAME_WRITE +#define RUMP_SYS_RENAME_WRITE rump___sysimpl_write #endif -#ifndef RUMP_SYS_RENAME_FSTAT -#define RUMP_SYS_RENAME_FSTAT rump___sysimpl_fstat50 +#ifndef RUMP_SYS_RENAME___SETLOGIN +#define RUMP_SYS_RENAME___SETLOGIN rump___sysimpl___setlogin #endif -#ifndef RUMP_SYS_RENAME_UNLINK -#define RUMP_SYS_RENAME_UNLINK rump___sysimpl_unlink +#ifndef RUMP_SYS_RENAME_SOCKET +#define RUMP_SYS_RENAME_SOCKET rump___sysimpl_socket30 #endif -#ifndef RUMP_SYS_RENAME_UTIMENSAT -#define RUMP_SYS_RENAME_UTIMENSAT rump___sysimpl_utimensat +#ifndef RUMP_SYS_RENAME_TIMER_GETOVERRUN +#define RUMP_SYS_RENAME_TIMER_GETOVERRUN rump___sysimpl_timer_getoverrun #endif -#ifndef RUMP_SYS_RENAME_SETITIMER -#define RUMP_SYS_RENAME_SETITIMER rump___sysimpl_setitimer50 +#ifndef RUMP_SYS_RENAME__KSEM_TIMEDWAIT +#define RUMP_SYS_RENAME__KSEM_TIMEDWAIT rump___sysimpl__ksem_timedwait #endif -#ifndef RUMP_SYS_RENAME_FHOPEN -#define RUMP_SYS_RENAME_FHOPEN rump___sysimpl_fhopen40 +#ifndef RUMP_SYS_RENAME_FTRUNCATE +#define RUMP_SYS_RENAME_FTRUNCATE rump___sysimpl_ftruncate #endif -#ifndef RUMP_SYS_RENAME__KSEM_INIT -#define RUMP_SYS_RENAME__KSEM_INIT rump___sysimpl__ksem_init +#ifndef RUMP_SYS_RENAME_FCHROOT +#define RUMP_SYS_RENAME_FCHROOT rump___sysimpl_fchroot #endif -#ifndef RUMP_SYS_RENAME_AIO_CANCEL -#define RUMP_SYS_RENAME_AIO_CANCEL rump___sysimpl_aio_cancel +#ifndef RUMP_SYS_RENAME_SETEUID +#define RUMP_SYS_RENAME_SETEUID rump___sysimpl_seteuid #endif -#ifndef RUMP_SYS_RENAME_SETEGID -#define RUMP_SYS_RENAME_SETEGID rump___sysimpl_setegid +#ifndef RUMP_SYS_RENAME_REBOOT +#define RUMP_SYS_RENAME_REBOOT rump___sysimpl_reboot #endif -#ifndef RUMP_SYS_RENAME_RENAME -#define RUMP_SYS_RENAME_RENAME rump___sysimpl_rename +#ifndef RUMP_SYS_RENAME_ACCEPT +#define RUMP_SYS_RENAME_ACCEPT rump___sysimpl_accept #endif -#ifndef RUMP_SYS_RENAME_AIO_SUSPEND -#define RUMP_SYS_RENAME_AIO_SUSPEND rump___sysimpl_aio_suspend50 +#ifndef RUMP_SYS_RENAME_READLINKAT +#define RUMP_SYS_RENAME_READLINKAT rump___sysimpl_readlinkat #endif -#ifndef RUMP_SYS_RENAME_KEVENT -#define RUMP_SYS_RENAME_KEVENT rump___sysimpl_kevent50 +#ifndef RUMP_SYS_RENAME_GETXATTR +#define RUMP_SYS_RENAME_GETXATTR rump___sysimpl_getxattr #endif -#ifndef RUMP_SYS_RENAME_GETGID_WITH_EGID -#define RUMP_SYS_RENAME_GETGID_WITH_EGID rump___sysimpl_getgid +#ifndef RUMP_SYS_RENAME__KSEM_UNLINK +#define RUMP_SYS_RENAME__KSEM_UNLINK rump___sysimpl__ksem_unlink #endif -#ifndef RUMP_SYS_RENAME_OPEN -#define RUMP_SYS_RENAME_OPEN rump___sysimpl_open +#ifndef RUMP_SYS_RENAME_NFSSVC +#define RUMP_SYS_RENAME_NFSSVC rump___sysimpl_nfssvc #endif -#ifndef RUMP_SYS_RENAME_PACCEPT -#define RUMP_SYS_RENAME_PACCEPT rump___sysimpl_paccept +#ifndef RUMP_SYS_RENAME_POSIX_FALLOCATE +#define RUMP_SYS_RENAME_POSIX_FALLOCATE rump___sysimpl_posix_fallocate #endif -#ifndef RUMP_SYS_RENAME_LSETXATTR -#define RUMP_SYS_RENAME_LSETXATTR rump___sysimpl_lsetxattr +#ifndef RUMP_SYS_RENAME___POSIX_FCHOWN +#define RUMP_SYS_RENAME___POSIX_FCHOWN rump___sysimpl___posix_fchown #endif -#ifndef RUMP_SYS_RENAME_SETGROUPS -#define RUMP_SYS_RENAME_SETGROUPS rump___sysimpl_setgroups +#ifndef RUMP_SYS_RENAME_GETPPID +#define RUMP_SYS_RENAME_GETPPID rump___sysimpl_getppid #endif -#ifndef RUMP_SYS_RENAME_SENDMSG -#define RUMP_SYS_RENAME_SENDMSG rump___sysimpl_sendmsg +#ifndef RUMP_SYS_RENAME_GETTIMEOFDAY +#define RUMP_SYS_RENAME_GETTIMEOFDAY rump___sysimpl_gettimeofday50 #endif -#ifndef RUMP_SYS_RENAME_EXTATTRCTL -#define RUMP_SYS_RENAME_EXTATTRCTL rump___sysimpl_extattrctl +#ifndef RUMP_SYS_RENAME_EXTATTR_LIST_FD +#define RUMP_SYS_RENAME_EXTATTR_LIST_FD rump___sysimpl_extattr_list_fd #endif -#ifndef RUMP_SYS_RENAME_NFSSVC -#define RUMP_SYS_RENAME_NFSSVC rump___sysimpl_nfssvc +#ifndef RUMP_SYS_RENAME_EXTATTR_GET_FILE +#define RUMP_SYS_RENAME_EXTATTR_GET_FILE rump___sysimpl_extattr_get_file #endif -#ifndef RUMP_SYS_RENAME___POSIX_LCHOWN -#define RUMP_SYS_RENAME___POSIX_LCHOWN rump___sysimpl___posix_lchown +#ifndef RUMP_SYS_RENAME_FUTIMES +#define RUMP_SYS_RENAME_FUTIMES rump___sysimpl_futimes50 #endif struct msghdr; Index: sys/rump/librump/rumpkern/rump_syscalls.c =================================================================== RCS file: /cvsroot/src/sys/rump/librump/rumpkern/rump_syscalls.c,v retrieving revision 1.128 diff -u -p -u -r1.128 rump_syscalls.c --- sys/rump/librump/rumpkern/rump_syscalls.c 6 May 2016 10:19:40 -0000 1.128 +++ sys/rump/librump/rumpkern/rump_syscalls.c 23 Jun 2016 17:08:53 -0000 @@ -1,4 +1,4 @@ -/* $NetBSD: rump_syscalls.c,v 1.128 2016/05/06 10:19:40 pooka Exp $ */ +/* $NetBSD$ */ /* * System call vector and marshalling for rump. @@ -15,7 +15,7 @@ #ifdef __NetBSD__ #include -__KERNEL_RCSID(0, "$NetBSD: rump_syscalls.c,v 1.128 2016/05/06 10:19:40 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD$"); #include #include @@ -7866,9 +7866,8 @@ struct sysent rump_sysent[] = { .sy_call = (sy_call_t *)rumpns_enosys, }, /* 350 = sched_yield */ { - .sy_flags = SYCALL_NOSYS, .sy_call = (sy_call_t *)rumpns_enosys, - }, /* 351 = filler */ +}, /* 351 = _sched_protect */ { .sy_flags = SYCALL_NOSYS, .sy_call = (sy_call_t *)rumpns_enosys, Index: sys/sys/lwp.h =================================================================== RCS file: /cvsroot/src/sys/sys/lwp.h,v retrieving revision 1.171 diff -u -p -u -r1.171 lwp.h --- sys/sys/lwp.h 16 Jun 2016 02:34:33 -0000 1.171 +++ sys/sys/lwp.h 23 Jun 2016 17:08:53 -0000 @@ -105,6 +105,9 @@ struct lwp { pri_t l_kpribase; /* !: kernel priority base level */ pri_t l_priority; /* l: scheduler priority */ pri_t l_inheritedprio;/* l: inherited priority */ + pri_t l_protectprio; /* l: for PTHREAD_PRIO_PROTECT */ + pri_t l_auxprio; /* l: max(inherit,protect) priority */ + int l_protectdepth; /* l: for PTHREAD_PRIO_PROTECT */ SLIST_HEAD(, turnstile) l_pi_lenders; /* l: ts lending us priority */ uint64_t l_ncsw; /* l: total context switches */ uint64_t l_nivcsw; /* l: involuntary context switches */ @@ -403,9 +406,6 @@ lwp_lendpri(lwp_t *l, pri_t pri) { KASSERT(mutex_owned(l->l_mutex)); - if (l->l_inheritedprio == pri) - return; - (*l->l_syncobj->sobj_lendpri)(l, pri); KASSERT(l->l_inheritedprio == pri); } @@ -418,7 +418,7 @@ lwp_eprio(lwp_t *l) pri = l->l_priority; if ((l->l_flag & LW_SYSTEM) == 0 && l->l_kpriority && pri < PRI_KERNEL) pri = (pri >> 1) + l->l_kpribase; - return MAX(l->l_inheritedprio, pri); + return MAX(l->l_auxprio, pri); } int lwp_create(lwp_t *, struct proc *, vaddr_t, int, Index: sys/sys/sched.h =================================================================== RCS file: /cvsroot/src/sys/sys/sched.h,v retrieving revision 1.75 diff -u -p -u -r1.75 sched.h --- sys/sys/sched.h 21 Nov 2011 04:36:05 -0000 1.75 +++ sys/sys/sched.h 23 Jun 2016 17:08:53 -0000 @@ -124,6 +124,7 @@ int _sched_getaffinity(pid_t, lwpid_t, s int _sched_setaffinity(pid_t, lwpid_t, size_t, const cpuset_t *); int _sched_getparam(pid_t, lwpid_t, int *, struct sched_param *); int _sched_setparam(pid_t, lwpid_t, int, const struct sched_param *); +int _sched_protect(int); __END_DECLS /* Index: sys/sys/syscall.h =================================================================== RCS file: /cvsroot/src/sys/sys/syscall.h,v retrieving revision 1.295 diff -u -p -u -r1.295 syscall.h --- sys/sys/syscall.h 6 May 2016 10:19:40 -0000 1.295 +++ sys/sys/syscall.h 23 Jun 2016 17:08:53 -0000 @@ -1,4 +1,4 @@ -/* $NetBSD: syscall.h,v 1.295 2016/05/06 10:19:40 pooka Exp $ */ +/* $NetBSD$ */ /* * System call numbers. @@ -953,6 +953,9 @@ /* syscall: "sched_yield" ret: "int" args: */ #define SYS_sched_yield 350 +/* syscall: "_sched_protect" ret: "int" args: "int" */ +#define SYS__sched_protect 351 + /* syscall: "fsync_range" ret: "int" args: "int" "int" "off_t" "off_t" */ #define SYS_fsync_range 354 Index: sys/sys/syscallargs.h =================================================================== RCS file: /cvsroot/src/sys/sys/syscallargs.h,v retrieving revision 1.279 diff -u -p -u -r1.279 syscallargs.h --- sys/sys/syscallargs.h 6 May 2016 10:19:40 -0000 1.279 +++ sys/sys/syscallargs.h 23 Jun 2016 17:08:54 -0000 @@ -1,4 +1,4 @@ -/* $NetBSD: syscallargs.h,v 1.279 2016/05/06 10:19:40 pooka Exp $ */ +/* $NetBSD$ */ /* * System call argument lists. @@ -2188,6 +2188,13 @@ struct sys__sched_getaffinity_args { check_syscall_args(sys__sched_getaffinity) #endif /* !RUMP_CLIENT */ +#ifndef RUMP_CLIENT +struct sys__sched_protect_args { + syscallarg(int) priority; +}; +check_syscall_args(sys__sched_protect) +#endif /* !RUMP_CLIENT */ + struct sys_fsync_range_args { syscallarg(int) fd; syscallarg(int) flags; @@ -3778,6 +3785,8 @@ int sys__sched_getaffinity(struct lwp *, int sys_sched_yield(struct lwp *, const void *, register_t *); +int sys__sched_protect(struct lwp *, const struct sys__sched_protect_args *, register_t *); + int sys_fsync_range(struct lwp *, const struct sys_fsync_range_args *, register_t *); int sys_uuidgen(struct lwp *, const struct sys_uuidgen_args *, register_t *); Index: sys/sys/unistd.h =================================================================== RCS file: /cvsroot/src/sys/sys/unistd.h,v retrieving revision 1.58 diff -u -p -u -r1.58 unistd.h --- sys/sys/unistd.h 10 Jun 2016 23:29:20 -0000 1.58 +++ sys/sys/unistd.h 23 Jun 2016 17:08:54 -0000 @@ -146,6 +146,8 @@ /* pthread_attr for stack address */ #define _POSIX_THREAD_ATTR_STACKADDR 200112L /* _r functions */ +#define _POSIX_THREAD_PRIO_PROTECT 200112L + /* PTHREAD_PRIO_PROTECT */ #define _POSIX_THREAD_SAFE_FUNCTIONS 200112L /* timeouts */ #undef _POSIX_TIMEOUTS Index: tests/lib/libpthread/t_cond.c =================================================================== RCS file: /cvsroot/src/tests/lib/libpthread/t_cond.c,v retrieving revision 1.6 diff -u -p -u -r1.6 t_cond.c --- tests/lib/libpthread/t_cond.c 3 Sep 2014 16:23:24 -0000 1.6 +++ tests/lib/libpthread/t_cond.c 23 Jun 2016 17:08:54 -0000 @@ -547,6 +547,26 @@ ATF_TC_BODY(destroy_after_cancel, tc) PTHREAD_REQUIRE(pthread_mutex_destroy(&mutex)); } +ATF_TC(condattr); +ATF_TC_HEAD(condattr, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks Condattr"); +} +ATF_TC_BODY(condattr, tc) +{ + pthread_condattr_t condattr; + clockid_t clockid; + + PTHREAD_REQUIRE(pthread_condattr_init(&condattr)); + PTHREAD_REQUIRE(pthread_condattr_setclock(&condattr, CLOCK_REALTIME)); + PTHREAD_REQUIRE(pthread_condattr_getclock(&condattr, &clockid)); + ATF_REQUIRE_EQ(clockid, CLOCK_REALTIME); + + PTHREAD_REQUIRE(pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC)); + PTHREAD_REQUIRE(pthread_condattr_getclock(&condattr, &clockid)); + ATF_REQUIRE_EQ(clockid, CLOCK_MONOTONIC); +} + ATF_TP_ADD_TCS(tp) { @@ -558,6 +578,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, broadcast); ATF_TP_ADD_TC(tp, bogus_timedwaits); ATF_TP_ADD_TC(tp, destroy_after_cancel); + ATF_TP_ADD_TC(tp, condattr); return atf_no_error(); } Index: tests/lib/libpthread/t_mutex.c =================================================================== RCS file: /cvsroot/src/tests/lib/libpthread/t_mutex.c,v retrieving revision 1.7 diff -u -p -u -r1.7 t_mutex.c --- tests/lib/libpthread/t_mutex.c 4 Nov 2014 00:20:19 -0000 1.7 +++ tests/lib/libpthread/t_mutex.c 23 Jun 2016 17:08:54 -0000 @@ -34,7 +34,10 @@ __RCSID("$NetBSD: t_mutex.c,v 1.7 2014/1 #include #include #include +#include #include +#include +#include #include @@ -304,12 +307,130 @@ ATF_TC_BODY(mutex4, tc) PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex)); } +static pthread_mutexattr_t attr5; +static pthread_mutex_t mutex5; +static int min_fifo_prio, max_fifo_prio; + +static void * +child_func(void* arg) +{ + int res; + + printf("child is waiting\n"); + res = _sched_protect(-2); + ATF_REQUIRE_EQ(res, -1); + ATF_REQUIRE_EQ(errno, ENOENT); + PTHREAD_REQUIRE(pthread_mutex_lock(&mutex5)); + printf("child is owning resource\n"); + res = _sched_protect(-2); + ATF_REQUIRE_EQ(res, max_fifo_prio); + PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex5)); + printf("child is done\n"); + + return 0; +} + +ATF_TC(mutex5); +ATF_TC_HEAD(mutex5, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks mutexes for priority setting"); +} + +ATF_TC_BODY(mutex5, tc) +{ + int res; + struct sched_param param; + pthread_t child; + + min_fifo_prio = sched_get_priority_min(SCHED_FIFO); + max_fifo_prio = sched_get_priority_max(SCHED_FIFO); + printf("min prio for FIFO = %d\n", min_fifo_prio); + param.sched_priority = min_fifo_prio; + /* = 0 OTHER, 1 FIFO, 2 RR, -1 NONE */ + res = sched_setscheduler(getpid(), SCHED_FIFO, ¶m); + printf("previous policy used = %d\n", res); + + res = sched_getscheduler(getpid()); + ATF_REQUIRE_EQ(res, 1); + + PTHREAD_REQUIRE(pthread_mutexattr_init(&attr5)); + PTHREAD_REQUIRE(pthread_mutexattr_setprotocol(&attr5, + PTHREAD_PRIO_PROTECT)); + PTHREAD_REQUIRE(pthread_mutexattr_setprioceiling(&attr5, + max_fifo_prio)); + + PTHREAD_REQUIRE(pthread_mutex_init(&mutex5, &attr5)); + PTHREAD_REQUIRE(pthread_mutex_lock(&mutex5)); + printf("enter critical section for main\n"); + PTHREAD_REQUIRE(pthread_create(&child, NULL, child_func, NULL)); + printf("main starts to sleep\n"); + sleep(10); + printf("main completes\n"); + PTHREAD_REQUIRE(pthread_mutex_unlock(&mutex5)); + PTHREAD_REQUIRE(pthread_join(child, NULL)); +} + +ATF_TC(mutexattr1); +ATF_TC_HEAD(mutexattr1, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks mutexattr"); +} +ATF_TC_BODY(mutexattr1, tc) +{ + pthread_mutexattr_t mattr; + int protocol, target; + + PTHREAD_REQUIRE(pthread_mutexattr_init(&mattr)); + + target = PTHREAD_PRIO_NONE; + PTHREAD_REQUIRE(pthread_mutexattr_setprotocol(&mattr, target)); + PTHREAD_REQUIRE(pthread_mutexattr_getprotocol(&mattr, &protocol)); + ATF_REQUIRE_EQ(protocol, target); + + /* + target = PTHREAD_PRIO_INHERIT; + PTHREAD_REQUIRE(pthread_mutexattr_setprotocol(&mattr, target)); + PTHREAD_REQUIRE(pthread_mutexattr_getprotocol(&mattr, &protocol)); + ATF_REQUIRE_EQ(protocol, target); + */ + + target = PTHREAD_PRIO_PROTECT; + PTHREAD_REQUIRE(pthread_mutexattr_setprotocol(&mattr, target)); + PTHREAD_REQUIRE(pthread_mutexattr_getprotocol(&mattr, &protocol)); + ATF_REQUIRE_EQ(protocol, target); +} + +ATF_TC(mutexattr2); +ATF_TC_HEAD(mutexattr2, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks mutexattr"); +} + +ATF_TC_BODY(mutexattr2, tc) +{ + pthread_mutexattr_t mattr; + + PTHREAD_REQUIRE(pthread_mutexattr_init(&mattr)); + int max_prio = sched_get_priority_max(SCHED_FIFO); + int min_prio = sched_get_priority_min(SCHED_FIFO); + for (int i = min_prio; i <= max_prio; i++) { + int prioceiling; + PTHREAD_REQUIRE(pthread_mutexattr_setprioceiling(&mattr, i)); + PTHREAD_REQUIRE(pthread_mutexattr_getprioceiling(&mattr, + &prioceiling)); + ATF_REQUIRE_EQ(i, prioceiling); + } +} + ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, mutex1); ATF_TP_ADD_TC(tp, mutex2); ATF_TP_ADD_TC(tp, mutex3); ATF_TP_ADD_TC(tp, mutex4); - + ATF_TP_ADD_TC(tp, mutex5); + ATF_TP_ADD_TC(tp, mutexattr1); + ATF_TP_ADD_TC(tp, mutexattr2); + return atf_no_error(); }