summaryrefslogtreecommitdiff
path: root/usr/src/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libc')
-rw-r--r--usr/src/lib/libc/inc/libc_int.h2
-rw-r--r--usr/src/lib/libc/port/gen/ssignal.c23
-rw-r--r--usr/src/lib/libc/port/threads/c11_thr.c3
-rw-r--r--usr/src/lib/libc/port/threads/pthread.c10
-rw-r--r--usr/src/lib/libc/port/threads/tls.c14
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 }
};
/*