From f7366b6c91b256bcf6a2547aa6aa6d4fae71a0b6 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 1 Nov 2012 12:25:29 -0500 Subject: [PATCH] loop on eintr on pop and trypop --- src/switch_apr.c | 69 ++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/src/switch_apr.c b/src/switch_apr.c index aeb10185a9..db6f075bed 100644 --- a/src/switch_apr.c +++ b/src/switch_apr.c @@ -614,34 +614,9 @@ SWITCH_DECLARE(const char *) switch_dir_next_file(switch_dir_t *thedir, char *bu /* thread stubs */ -#ifndef WIN32 -struct apr_threadattr_t { - apr_pool_t *pool; - pthread_attr_t attr; - int priority; -}; -#else -/* this needs to be revisited when apr for windows supports thread priority settings */ -/* search for WIN32 in this file */ -struct apr_threadattr_t { - apr_pool_t *pool; - apr_int32_t detach; - apr_size_t stacksize; -}; -#endif - - SWITCH_DECLARE(switch_status_t) switch_threadattr_create(switch_threadattr_t ** new_attr, switch_memory_pool_t *pool) { - switch_status_t status; - - if ((status = apr_threadattr_create(new_attr, pool)) == SWITCH_STATUS_SUCCESS) { -#ifndef WIN32 - (*new_attr)->priority = SWITCH_PRI_LOW; -#endif - } - - return status; + return apr_threadattr_create(new_attr, pool); } SWITCH_DECLARE(switch_status_t) switch_threadattr_detach_set(switch_threadattr_t *attr, int32_t on) @@ -654,12 +629,29 @@ SWITCH_DECLARE(switch_status_t) switch_threadattr_stacksize_set(switch_threadatt return apr_threadattr_stacksize_set(attr, stacksize); } -SWITCH_DECLARE(switch_status_t) switch_threadattr_priority_set(switch_threadattr_t *attr, switch_thread_priority_t priority) -{ #ifndef WIN32 - attr->priority = priority; +struct apr_threadattr_t { + apr_pool_t *pool; + pthread_attr_t attr; +}; #endif - return SWITCH_STATUS_SUCCESS; + +SWITCH_DECLARE(switch_status_t) switch_threadattr_priority_increase(switch_threadattr_t *attr) +{ + int stat = 0; +#ifndef WIN32 + struct sched_param param; + struct apr_threadattr_t *myattr = attr; + + pthread_attr_getschedparam(&myattr->attr, ¶m); + param.sched_priority = 1; + stat = pthread_attr_setschedparam(&myattr->attr, ¶m); + + if (stat == 0) { + return SWITCH_STATUS_SUCCESS; + } +#endif + return stat; } static char TT_KEY[] = "1"; @@ -1050,7 +1042,13 @@ SWITCH_DECLARE(unsigned int) switch_queue_size(switch_queue_t *queue) SWITCH_DECLARE(switch_status_t) switch_queue_pop(switch_queue_t *queue, void **data) { - return apr_queue_pop(queue, data); + apr_status_t s; + + do { + s = apr_queue_pop(queue, data); + } while (s == APR_EINTR); + + return s; } SWITCH_DECLARE(switch_status_t) switch_queue_pop_timeout(switch_queue_t *queue, void **data, switch_interval_time_t timeout) @@ -1072,7 +1070,14 @@ SWITCH_DECLARE(switch_status_t) switch_queue_push(switch_queue_t *queue, void *d SWITCH_DECLARE(switch_status_t) switch_queue_trypop(switch_queue_t *queue, void **data) { - return apr_queue_trypop(queue, data); + apr_status_t s; + + do { + s = apr_queue_trypop(queue, data); + } while (s == APR_EINTR); + + return s; + } SWITCH_DECLARE(switch_status_t) switch_queue_interrupt_all(switch_queue_t *queue)