summaryrefslogtreecommitdiff
path: root/usr/src/lib/libc/port/aio/aio.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libc/port/aio/aio.c')
-rw-r--r--usr/src/lib/libc/port/aio/aio.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/usr/src/lib/libc/port/aio/aio.c b/usr/src/lib/libc/port/aio/aio.c
index c1f7b51875..2e346907b9 100644
--- a/usr/src/lib/libc/port/aio/aio.c
+++ b/usr/src/lib/libc/port/aio/aio.c
@@ -20,7 +20,7 @@
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -152,10 +152,13 @@ __uaio_init(void)
{
int ret = -1;
int i;
+ int cancel_state;
lmutex_lock(&__aio_initlock);
+ (void) pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancel_state);
while (__aio_initbusy)
- (void) _cond_wait(&__aio_initcv, &__aio_initlock);
+ (void) cond_wait(&__aio_initcv, &__aio_initlock);
+ (void) pthread_setcancelstate(cancel_state, NULL);
if (__uaio_ok) { /* already initialized */
lmutex_unlock(&__aio_initlock);
return (0);
@@ -271,10 +274,13 @@ _kaio_init()
{
int error;
sigset_t oset;
+ int cancel_state;
lmutex_lock(&__aio_initlock);
+ (void) pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancel_state);
while (__aio_initbusy)
- (void) _cond_wait(&__aio_initcv, &__aio_initlock);
+ (void) cond_wait(&__aio_initcv, &__aio_initlock);
+ (void) pthread_setcancelstate(cancel_state, NULL);
if (_kaio_ok) { /* already initialized */
lmutex_unlock(&__aio_initlock);
return;
@@ -488,8 +494,17 @@ aiocancel(aio_result_t *resultp)
return (ret);
}
+/* ARGSUSED */
+static void
+_aiowait_cleanup(void *arg)
+{
+ sig_mutex_lock(&__aio_mutex);
+ _aiowait_flag--;
+ sig_mutex_unlock(&__aio_mutex);
+}
+
/*
- * This must be asynch safe
+ * This must be asynch safe and cancel safe
*/
aio_result_t *
aiowait(struct timeval *uwait)
@@ -570,8 +585,12 @@ aiowait(struct timeval *uwait)
kaio_errno = EINVAL;
} else {
sig_mutex_unlock(&__aio_mutex);
+ pthread_cleanup_push(_aiowait_cleanup, NULL);
+ _cancel_prologue();
kresultp = (aio_result_t *)_kaio(AIOWAIT,
wait, dontblock);
+ _cancel_epilogue();
+ pthread_cleanup_pop(0);
sig_mutex_lock(&__aio_mutex);
kaio_errno = errno;
}