From: hsbt@... Date: 2017-09-08T09:13:11+00:00 Subject: [ruby-core:82716] [Ruby trunk Feature#13881] Use getcontext/setcontext on OS X Issue #13881 has been updated by hsbt (Hiroshi SHIBATA). I found `getcontext` on High Sierra(10.17) beta. ``` ~ > grep getcontext /usr/include/ucontext.h int getcontext(ucontext_t *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_2_0, __IPHONE_2_0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED; ``` ---------------------------------------- Feature #13881: Use getcontext/setcontext on OS X https://bugs.ruby-lang.org/issues/13881#change-66553 * Author: naruse (Yui NARUSE) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- getcontext/setcontext is first appeared on OS X 10.5 but deprecated on 10.6. It seems because POSIX removed them from recent specs. IEEE Std 1003.1, 2004 Edition says makecontext's use of function declarators with empty parentheses is an obsolescent feature. http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html Then POSIX.1-2008 removed those functions. But OS X 10.13 still has them maybe because some essential applications uses them for co-routines. Therefore we can use them for performance. ``` diff --git a/configure.in b/configure.in index 08e109317f..3e75eb3cf2 100644 --- a/configure.in +++ b/configure.in @@ -1142,8 +1142,6 @@ AS_CASE(["$target_os"], ac_cv_header_syscall_h=no ]) AS_IF([test $macosx_10_5 = yes], [ - ac_cv_func_getcontext=no - ac_cv_func_setcontext=no ], [ AC_DEFINE(BROKEN_SETREUID, 1) AC_DEFINE(BROKEN_SETREGID, 1) diff --git a/cont.c b/cont.c index c86095775c..f94883ef02 100644 --- a/cont.c +++ b/cont.c @@ -65,7 +65,15 @@ #ifndef _WIN32 #include #include -#include +# ifdef __APPLE__ +/* avoid deprecated maks on ucontext.h */ +int getcontext(ucontext_t *); +void makecontext(ucontext_t *, void (*)(), int, ...); +int setcontext(const ucontext_t *); +int swapcontext(ucontext_t * __restrict, const ucontext_t * __restrict); +# else +# include +# endif #endif #define RB_PAGE_SIZE (pagesize) #define RB_PAGE_MASK (~(RB_PAGE_SIZE - 1)) ``` -- https://bugs.ruby-lang.org/ Unsubscribe: