diff options
Diffstat (limited to 'usr/src/lib/libc')
-rw-r--r-- | usr/src/lib/libc/inc/libc_int.h | 2 | ||||
-rw-r--r-- | usr/src/lib/libc/port/gen/ssignal.c | 23 | ||||
-rw-r--r-- | usr/src/lib/libc/port/threads/c11_thr.c | 3 | ||||
-rw-r--r-- | usr/src/lib/libc/port/threads/pthread.c | 10 | ||||
-rw-r--r-- | usr/src/lib/libc/port/threads/tls.c | 14 |
5 files changed, 31 insertions, 21 deletions
diff --git a/usr/src/lib/libc/inc/libc_int.h b/usr/src/lib/libc/inc/libc_int.h index 940636b49c..0bc8a16fa0 100644 --- a/usr/src/lib/libc/inc/libc_int.h +++ b/usr/src/lib/libc/inc/libc_int.h @@ -74,7 +74,7 @@ extern "C" { typedef struct { int ci_tag; union { - int (*ci_func)(); + void *ci_func; long ci_val; char *ci_ptr; } ci_un; diff --git a/usr/src/lib/libc/port/gen/ssignal.c b/usr/src/lib/libc/port/gen/ssignal.c index 6030626b17..ce74eb2a07 100644 --- a/usr/src/lib/libc/port/gen/ssignal.c +++ b/usr/src/lib/libc/port/gen/ssignal.c @@ -25,9 +25,7 @@ */ /* Copyright (c) 1988 AT&T */ -/* All Rights Reserved */ - -#pragma ident "%Z%%M% %I% %E% SMI" +/* All Rights Reserved */ /* * ssignal, gsignal: software signals @@ -54,8 +52,9 @@ ssignal(int sig, int (*action)(int)))(int) if (sig >= MINSIG && sig <= MAXSIGNUM) { savefn = sigs[sig-MINSIG]; sigs[sig-MINSIG] = action; - } else - savefn = (int(*)(int))SIG_DFL; + } else { + savefn = (int(*)(int))(uintptr_t)SIG_DFL; + } return (savefn); } @@ -66,12 +65,14 @@ gsignal(int sig) int (*sigfn)(int); if (sig < MINSIG || sig > MAXSIGNUM || - (sigfn = sigs[sig-MINSIG]) == (int(*)(int))SIG_DFL) + (sigfn = sigs[sig-MINSIG]) == (int(*)(int))(uintptr_t)SIG_DFL) { return (0); - else if (sigfn == (int(*)(int))SIG_IGN) - return (1); - else { - sigs[sig-MINSIG] = (int(*)(int))SIG_DFL; - return ((*sigfn)(sig)); + } else { + if (sigfn == (int(*)(int))(uintptr_t)SIG_IGN) { + return (1); + } else { + sigs[sig-MINSIG] = (int(*)(int))(uintptr_t)SIG_DFL; + return ((*sigfn)(sig)); + } } } diff --git a/usr/src/lib/libc/port/threads/c11_thr.c b/usr/src/lib/libc/port/threads/c11_thr.c index a33fa12743..98e72c9b04 100644 --- a/usr/src/lib/libc/port/threads/c11_thr.c +++ b/usr/src/lib/libc/port/threads/c11_thr.c @@ -195,7 +195,8 @@ thrd_create(thrd_t *thr, thrd_start_t func, void *arg) { int ret; - ret = pthread_create(thr, NULL, (void *(*)(void *))func, arg); + ret = pthread_create(thr, NULL, + (void *(*)(void *))(uintptr_t)func, arg); if (ret == 0) return (thrd_success); else if (ret == -1 && errno == EAGAIN) diff --git a/usr/src/lib/libc/port/threads/pthread.c b/usr/src/lib/libc/port/threads/pthread.c index 34b4b4c73c..dc0123361d 100644 --- a/usr/src/lib/libc/port/threads/pthread.c +++ b/usr/src/lib/libc/port/threads/pthread.c @@ -177,6 +177,14 @@ pthread_create(pthread_t *thread, const pthread_attr_t *attr, return (error); } +static void +_mutex_unlock_wrap(void *ptr) +{ + mutex_t *mp = ptr; + + (void) mutex_unlock(mp); +} + /* * pthread_once: calls given function only once. * it synchronizes via mutex in pthread_once_t structure @@ -192,7 +200,7 @@ pthread_once(pthread_once_t *once_control, void (*init_routine)(void)) if (once->once_flag == PTHREAD_ONCE_NOTDONE) { (void) mutex_lock(&once->mlock); if (once->once_flag == PTHREAD_ONCE_NOTDONE) { - pthread_cleanup_push(mutex_unlock, &once->mlock); + pthread_cleanup_push(_mutex_unlock_wrap, &once->mlock); (*init_routine)(); pthread_cleanup_pop(0); membar_producer(); diff --git a/usr/src/lib/libc/port/threads/tls.c b/usr/src/lib/libc/port/threads/tls.c index 9822cc5367..31fd1c5368 100644 --- a/usr/src/lib/libc/port/threads/tls.c +++ b/usr/src/lib/libc/port/threads/tls.c @@ -199,13 +199,13 @@ extern int _preexec_exit_handlers(); extern void libc_init(); const Lc_interface tls_rtldinfo[] = { - {CI_VERSION, (int(*)())CI_V_CURRENT}, - {CI_ATEXIT, (int(*)())_preexec_exit_handlers}, - {CI_TLS_MODADD, (int(*)())__tls_mod_add}, - {CI_TLS_MODREM, (int(*)())__tls_mod_remove}, - {CI_TLS_STATMOD, (int(*)())__tls_static_mods}, - {CI_THRINIT, (int(*)())libc_init}, - {CI_NULL, (int(*)())NULL} + { .ci_tag = CI_VERSION, .ci_un.ci_val = CI_V_CURRENT }, + { .ci_tag = CI_ATEXIT, .ci_un.ci_func = _preexec_exit_handlers }, + { .ci_tag = CI_TLS_MODADD, .ci_un.ci_func = __tls_mod_add }, + { .ci_tag = CI_TLS_MODREM, .ci_un.ci_func = __tls_mod_remove }, + { .ci_tag = CI_TLS_STATMOD, .ci_un.ci_func = __tls_static_mods }, + { .ci_tag = CI_THRINIT, .ci_un.ci_func = libc_init }, + { .ci_tag = CI_NULL, .ci_un.ci_func = NULL } }; /* |