X-Git-Url: https://git.saurik.com/apple/libpthread.git/blobdiff_plain/f1a1da6cf65a9d0e6858678f6c259025cf5d27fd..235d2f0e8fa84839307390481219c77389440e1b:/private/private.h?ds=sidebyside diff --git a/private/private.h b/private/private.h index d59f161..b321442 100644 --- a/private/private.h +++ b/private/private.h @@ -42,7 +42,7 @@ _pthread_set_errno_direct(int value) *((int*)_pthread_getspecific_direct(_PTHREAD_TSD_SLOT_ERRNO)) = value; } -__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0) +__API_AVAILABLE(macos(10.9), ios(7.0)) pthread_t pthread_main_thread_np(void); struct _libpthread_functions { @@ -52,4 +52,76 @@ struct _libpthread_functions { void (*free)(void *); // added with version=2 }; +/*! + * @function pthread_chdir_np + * + * @abstract + * Sets the per-thread current working directory. + * + * @discussion + * This will set the per-thread current working directory to the provided path. + * If this is used on a workqueue (dispatch) thread, it MUST be unset with + * pthread_fchdir_np(-1) before returning. + * + * @param path + * The path of the new working directory. + * + * @result + * 0 upon success, -1 upon error and errno is set. + */ +__API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) +int pthread_chdir_np(char *path); + +/*! + * @function pthread_fchdir_np + * + * @abstract + * Sets the per-thread current working directory. + * + * @discussion + * This will set the per-thread current working directory to the provided + * directory fd. If this is used on a workqueue (dispatch) thread, it MUST be + * unset with pthread_fchdir_np(-1) before returning. + * + * @param fd + * A file descriptor to the new working directory. Pass -1 to unset the + * per-thread working directory. + * + * @result + * 0 upon success, -1 upon error and errno is set. + */ +__API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) +int pthread_fchdir_np(int fd); + +__API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) +int pthread_attr_setcpupercent_np(pthread_attr_t * __restrict, int, unsigned long); + +#ifdef _os_tsd_get_base + +#ifdef __LP64__ +#define _PTHREAD_STRUCT_DIRECT_THREADID_OFFSET -8 +#else +#define _PTHREAD_STRUCT_DIRECT_THREADID_OFFSET -16 +#endif + +/* N.B. DO NOT USE UNLESS YOU ARE REBUILT AS PART OF AN OS TRAIN WORLDBUILD */ +__header_always_inline uint64_t +_pthread_threadid_self_np_direct(void) +{ +#ifndef __i386__ + if (_pthread_has_direct_tsd()) { +#ifdef OS_GS_RELATIVE + return *(uint64_t OS_GS_RELATIVE *)(_PTHREAD_STRUCT_DIRECT_THREADID_OFFSET); +#else + return *(uint64_t*)((char *)_os_tsd_get_base() + _PTHREAD_STRUCT_DIRECT_THREADID_OFFSET); +#endif + } +#endif + uint64_t threadid = 0; + pthread_threadid_np(NULL, &threadid); + return threadid; +} + +#endif // _os_tsd_get_base + #endif // __PTHREAD_PRIVATE_H__