=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/include/pthread.h,v retrieving revision 1.1 retrieving revision 1.2 diff -c -r1.1 -r1.2 *** src/include/pthread.h 2017/10/15 23:40:33 1.1 --- src/include/pthread.h 2017/10/28 21:23:14 1.2 *************** *** 1,4 **** ! /* $OpenBSD: pthread.h,v 1.1 2017/10/15 23:40:33 guenther Exp $ */ /* * Copyright (c) 1993, 1994 by Chris Provenzano, proven@mit.edu --- 1,4 ---- ! /* $OpenBSD: pthread.h,v 1.2 2017/10/28 21:23:14 guenther Exp $ */ /* * Copyright (c) 1993, 1994 by Chris Provenzano, proven@mit.edu *************** *** 180,188 **** --- 180,219 ---- #define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_STRICT_NP /* + * On-stack structure for the pthread_cleanup_{push,pop} macros + * The actual values are xor'ed with random cookies. + */ + struct __thread_cleanup { + __uintptr_t __tc_magic; + __uintptr_t __tc_next; + __uintptr_t __tc_fn; + __uintptr_t __tc_arg; + }; + + /* + * These macro must be used in pairs in the same scope, such that + * pthread_cleanup_push() can start a block declaring a variable and + * pthread_cleanup_pop() closes that same block. Any other usage + * violates the requirements of the POSIX and Single UNIX standards. + */ + #define pthread_cleanup_push(cb, arg) \ + { /* MATCHED BY CLOSE BRACKET IN pthread_cleanup_pop() */ \ + struct __thread_cleanup __tc; \ + _thread_cleanup_push(cb, arg, &__tc); + + #define pthread_cleanup_pop(execute) \ + _thread_cleanup_pop(execute, &__tc); \ + } /* MATCHED BY OPEN BRACKET IN pthread_cleanup_push() */ + + + + /* * Thread function prototype definitions: */ __BEGIN_DECLS + void _thread_cleanup_pop(int _execute, struct __thread_cleanup *_tc); + void _thread_cleanup_push(void (*_fn)(void *), void *_arg, + struct __thread_cleanup *_tc); int pthread_atfork(void (*)(void), void (*)(void), void (*)(void)); int pthread_attr_destroy(pthread_attr_t *); int pthread_attr_getstack(const pthread_attr_t *, *************** *** 197,204 **** int pthread_attr_setstackaddr(pthread_attr_t *, void *); int pthread_attr_setguardsize(pthread_attr_t *, size_t); int pthread_attr_setdetachstate(pthread_attr_t *, int); - void pthread_cleanup_pop(int); - void pthread_cleanup_push(void (*) (void *), void *routine_arg); int pthread_condattr_destroy(pthread_condattr_t *); int pthread_condattr_init(pthread_condattr_t *); --- 228,233 ----