"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "locks/unix/thread_mutex.c" between
apr-1.6.5.tar.bz2 and apr-1.7.0.tar.bz2

About: APR (Apache Portable Runtime) project offers software libraries that provide a predictable and consistent interface to underlying platform-specific implementations (APR core library).

thread_mutex.c  (apr-1.6.5.tar.bz2):thread_mutex.c  (apr-1.7.0.tar.bz2)
skipping to change at line 80 skipping to change at line 80
#endif #endif
rv = pthread_mutex_init(&new_mutex->mutex, NULL); rv = pthread_mutex_init(&new_mutex->mutex, NULL);
if (rv) { if (rv) {
#ifdef HAVE_ZOS_PTHREADS #ifdef HAVE_ZOS_PTHREADS
rv = errno; rv = errno;
#endif #endif
return rv; return rv;
} }
#ifndef HAVE_PTHREAD_MUTEX_TIMEDLOCK
if (flags & APR_THREAD_MUTEX_TIMED) {
rv = apr_thread_cond_create(&new_mutex->cond, pool);
if (rv) {
#ifdef HAVE_ZOS_PTHREADS
rv = errno;
#endif
pthread_mutex_destroy(&new_mutex->mutex);
return rv;
}
}
#endif
apr_pool_cleanup_register(new_mutex->pool, apr_pool_cleanup_register(new_mutex->pool,
new_mutex, thread_mutex_cleanup, new_mutex, thread_mutex_cleanup,
apr_pool_cleanup_null); apr_pool_cleanup_null);
*mutex = new_mutex; *mutex = new_mutex;
return APR_SUCCESS; return APR_SUCCESS;
} }
APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex) APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex)
{ {
apr_status_t rv; apr_status_t rv;
if (mutex->cond) {
apr_status_t rv2;
rv = pthread_mutex_lock(&mutex->mutex);
if (rv) {
#ifdef HAVE_ZOS_PTHREADS
rv = errno;
#endif
return rv;
}
if (mutex->locked) {
mutex->num_waiters++;
rv = apr_thread_cond_wait(mutex->cond, mutex);
mutex->num_waiters--;
}
else {
mutex->locked = 1;
}
rv2 = pthread_mutex_unlock(&mutex->mutex);
if (rv2 && !rv) {
#ifdef HAVE_ZOS_PTHREADS
rv = errno;
#else
rv = rv2;
#endif
}
return rv;
}
rv = pthread_mutex_lock(&mutex->mutex); rv = pthread_mutex_lock(&mutex->mutex);
#ifdef HAVE_ZOS_PTHREADS #ifdef HAVE_ZOS_PTHREADS
if (rv) { if (rv) {
rv = errno; rv = errno;
} }
#endif #endif
return rv; return rv;
} }
APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex) APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex)
{ {
apr_status_t rv; apr_status_t rv;
if (mutex->cond) {
apr_status_t rv2;
rv = pthread_mutex_lock(&mutex->mutex);
if (rv) {
#ifdef HAVE_ZOS_PTHREADS
rv = errno;
#endif
return rv;
}
if (mutex->locked) {
rv = APR_EBUSY;
}
else {
mutex->locked = 1;
}
rv2 = pthread_mutex_unlock(&mutex->mutex);
if (rv2) {
#ifdef HAVE_ZOS_PTHREADS
rv = errno;
#else
rv = rv2;
#endif
}
return rv;
}
rv = pthread_mutex_trylock(&mutex->mutex); rv = pthread_mutex_trylock(&mutex->mutex);
if (rv) { if (rv) {
#ifdef HAVE_ZOS_PTHREADS #ifdef HAVE_ZOS_PTHREADS
rv = errno; rv = errno;
#endif #endif
return (rv == EBUSY) ? APR_EBUSY : rv; return (rv == EBUSY) ? APR_EBUSY : rv;
} }
return APR_SUCCESS; return APR_SUCCESS;
} }
APR_DECLARE(apr_status_t) apr_thread_mutex_timedlock(apr_thread_mutex_t *mutex,
apr_interval_time_t timeout)
{
apr_status_t rv = APR_ENOTIMPL;
#if APR_HAS_TIMEDLOCKS
#ifdef HAVE_PTHREAD_MUTEX_TIMEDLOCK
if (timeout <= 0) {
rv = pthread_mutex_trylock(&mutex->mutex);
if (rv) {
#ifdef HAVE_ZOS_PTHREADS
rv = errno;
#endif
if (rv == EBUSY) {
rv = APR_TIMEUP;
}
}
}
else {
struct timespec abstime;
timeout += apr_time_now();
abstime.tv_sec = apr_time_sec(timeout);
abstime.tv_nsec = apr_time_usec(timeout) * 1000; /* nanoseconds */
rv = pthread_mutex_timedlock(&mutex->mutex, &abstime);
if (rv) {
#ifdef HAVE_ZOS_PTHREADS
rv = errno;
#endif
if (rv == ETIMEDOUT) {
rv = APR_TIMEUP;
}
}
}
#else /* HAVE_PTHREAD_MUTEX_TIMEDLOCK */
if (mutex->cond) {
rv = pthread_mutex_lock(&mutex->mutex);
if (rv) {
#ifdef HAVE_ZOS_PTHREADS
rv = errno;
#endif
return rv;
}
if (mutex->locked) {
if (timeout <= 0) {
rv = APR_TIMEUP;
}
else {
mutex->num_waiters++;
do {
rv = apr_thread_cond_timedwait(mutex->cond, mutex,
timeout);
if (rv) {
#ifdef HAVE_ZOS_PTHREADS
rv = errno;
#endif
break;
}
} while (mutex->locked);
mutex->num_waiters--;
}
if (rv) {
pthread_mutex_unlock(&mutex->mutex);
return rv;
}
}
mutex->locked = 1;
rv = pthread_mutex_unlock(&mutex->mutex);
if (rv) {
#ifdef HAVE_ZOS_PTHREADS
rv = errno;
#endif
return rv;
}
}
#endif /* HAVE_PTHREAD_MUTEX_TIMEDLOCK */
#endif /* APR_HAS_TIMEDLOCKS */
return rv;
}
APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex) APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex)
{ {
apr_status_t status; apr_status_t status;
if (mutex->cond) {
status = pthread_mutex_lock(&mutex->mutex);
if (status) {
#ifdef HAVE_ZOS_PTHREADS
status = errno;
#endif
return status;
}
if (!mutex->locked) {
status = APR_EINVAL;
}
else if (mutex->num_waiters) {
status = apr_thread_cond_signal(mutex->cond);
}
if (status) {
pthread_mutex_unlock(&mutex->mutex);
return status;
}
mutex->locked = 0;
}
status = pthread_mutex_unlock(&mutex->mutex); status = pthread_mutex_unlock(&mutex->mutex);
#ifdef HAVE_ZOS_PTHREADS #ifdef HAVE_ZOS_PTHREADS
if (status) { if (status) {
status = errno; status = errno;
} }
#endif #endif
return status; return status;
} }
APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex) APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex)
{ {
return apr_pool_cleanup_run(mutex->pool, mutex, thread_mutex_cleanup); apr_status_t rv, rv2 = APR_SUCCESS;
if (mutex->cond) {
rv2 = apr_thread_cond_destroy(mutex->cond);
}
rv = apr_pool_cleanup_run(mutex->pool, mutex, thread_mutex_cleanup);
if (rv == APR_SUCCESS) {
rv = rv2;
}
return rv;
} }
APR_POOL_IMPLEMENT_ACCESSOR(thread_mutex) APR_POOL_IMPLEMENT_ACCESSOR(thread_mutex)
#endif /* APR_HAS_THREADS */ #endif /* APR_HAS_THREADS */
 End of changes. 6 change blocks. 
1 lines changed or deleted 197 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)