Author: dlee Date: Mon Jan 26 08:50:40 2015 New Revision: 431093 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=431093 Log: Various fixes for OS X
This patch addresses compilation errors on OS X. It's been a while, so there's quite a few things. * Fixed __attribute__ decls in route.h to be portable. * Fixed htonll and ntohll to work when they are defined as macros. * Replaced sem_t usage with our ast_sem wrapper. * Added ast_sem_timedwait to our ast_sem wrapper. * Fixed some GCC 4.9 warnings using sig*set() functions. * Fixed some format strings for portability. * Fixed compilation issues with res_timing_kqueue (although tests still fail on OS X). * Fixed menuconfig /sbin/launchd detection, which disables res_timing_kqueue on OS X). ASTERISK-24539 #close Reported by: George Joseph ASTERISK-24544 #close Reported by: George Joseph Review: https://reviewboard.asterisk.org/r/4327/ ........ Merged revisions 431092 from http://svn.asterisk.org/svn/asterisk/branches/13 Modified: trunk/ (props changed) trunk/channels/sip/include/route.h trunk/configure trunk/configure.ac trunk/funcs/func_presencestate.c trunk/include/asterisk/autoconfig.h.in trunk/include/asterisk/sem.h trunk/main/app.c trunk/main/asterisk.c trunk/main/bridge_channel.c trunk/main/rtp_engine.c trunk/main/sem.c trunk/res/res_timing_kqueue.c Propchange: trunk/ ------------------------------------------------------------------------------ Binary property 'branch-13-merged' - no diff available. Modified: trunk/channels/sip/include/route.h URL: http://svnview.digium.com/svn/asterisk/trunk/channels/sip/include/route.h?view=diff&rev=431093&r1=431092&r2=431093 ============================================================================== --- trunk/channels/sip/include/route.h (original) +++ trunk/channels/sip/include/route.h Mon Jan 26 08:50:40 2015 @@ -98,7 +98,7 @@ * \retval NULL on failure */ struct ast_str *sip_route_list(const struct sip_route *route, int formatcli, int skip) - __attribute_malloc__ __attribute_warn_unused_result__; + __attribute__((__malloc__)) __attribute__((__warn_unused_result__)); /*! * \brief Check if the route is strict Modified: trunk/configure.ac URL: http://svnview.digium.com/svn/asterisk/trunk/configure.ac?view=diff&rev=431093&r1=431092&r2=431093 ============================================================================== --- trunk/configure.ac (original) +++ trunk/configure.ac Mon Jan 26 08:50:40 2015 @@ -660,7 +660,25 @@ AC_FUNC_STRTOD AC_FUNC_UTIME_NULL AC_FUNC_VPRINTF -AC_CHECK_FUNCS([asprintf atexit closefrom dup2 eaccess endpwent euidaccess ffsll ftruncate getcwd gethostbyname gethostname getloadavg gettimeofday glob htonll ioperm inet_ntoa isascii memchr memmove memset mkdir mkdtemp munmap ntohll newlocale ppoll putenv re_comp regcomp select setenv socket strcasecmp strcasestr strchr strcspn strdup strerror strlcat strlcpy strncasecmp strndup strnlen strrchr strsep strspn strstr strtod strtol strtold strtoq unsetenv utime vasprintf getpeereid sysctl swapctl]) +AC_CHECK_FUNCS([asprintf atexit closefrom dup2 eaccess endpwent euidaccess ffsll ftruncate getcwd gethostbyname gethostname getloadavg gettimeofday glob ioperm inet_ntoa isascii memchr memmove memset mkdir mkdtemp munmap newlocale ppoll putenv re_comp regcomp select setenv socket strcasecmp strcasestr strchr strcspn strdup strerror strlcat strlcpy strncasecmp strndup strnlen strrchr strsep strspn strstr strtod strtol strtold strtoq unsetenv utime vasprintf getpeereid sysctl swapctl]) + +AC_MSG_CHECKING(for htonll) +AC_LINK_IFELSE( + [AC_LANG_PROGRAM([#include <arpa/inet.h>], + [return htonll(0);])], + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_HTONLL, 1, [Define to 1 if arpa/inet.h includes a htonll definition.]), + AC_MSG_RESULT(no) +) + +AC_MSG_CHECKING(for ntohll) +AC_LINK_IFELSE( + [AC_LANG_PROGRAM([#include <arpa/inet.h>], + [return ntohll(0);])], + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_NTOHLL, 1, [Define to 1 if arpa/inet.h includes a ntohll definition.]), + AC_MSG_RESULT(no) +) # NOTE: we use AC_CHECK_LIB to get -lm into the arguments for later checks, # so that AC_CHECK_FUNCS can detect functions in that library. @@ -2432,10 +2450,9 @@ PBX_LAUNCHD=0 if test "${cross_compiling}" = "no"; then - AC_CHECK_FILE(/sbin/launchd, AC_DEFINE([HAVE_SBIN_LAUNCHD], 1, [Define to 1 if your system has /sbin/launchd.])) - if test "${HAVE_SBIN_LAUNCHD}" = 1; then - PBX_LAUNCHD=1 - fi + AC_CHECK_FILE(/sbin/launchd, + [PBX_LAUNCHD=1] + AC_DEFINE([HAVE_SBIN_LAUNCHD], 1, [Define to 1 if your system has /sbin/launchd.])) fi AC_SUBST(PBX_LAUNCHD) Modified: trunk/funcs/func_presencestate.c URL: http://svnview.digium.com/svn/asterisk/trunk/funcs/func_presencestate.c?view=diff&rev=431093&r1=431092&r2=431093 ============================================================================== --- trunk/funcs/func_presencestate.c (original) +++ trunk/funcs/func_presencestate.c Mon Jan 26 08:50:40 2015 @@ -41,7 +41,7 @@ #include "asterisk/app.h" #ifdef TEST_FRAMEWORK #include "asterisk/test.h" -#include <semaphore.h> +#include "asterisk/sem.h" #endif /*** DOCUMENTATION @@ -664,7 +664,7 @@ struct test_cb_data { struct ast_presence_state_message *presence_state; /* That's right. I'm using a semaphore */ - sem_t sem; + struct ast_sem sem; }; static struct test_cb_data *test_cb_data_alloc(void) @@ -675,7 +675,7 @@ return NULL; } - if (sem_init(&cb_data->sem, 0, 0)) { + if (ast_sem_init(&cb_data->sem, 0, 0)) { ast_free(cb_data); return NULL; } @@ -686,7 +686,7 @@ static void test_cb_data_destroy(struct test_cb_data *cb_data) { ao2_cleanup(cb_data->presence_state); - sem_destroy(&cb_data->sem); + ast_sem_destroy(&cb_data->sem); ast_free(cb_data); } @@ -699,7 +699,7 @@ cb_data->presence_state = stasis_message_data(msg); ao2_ref(cb_data->presence_state, +1); - sem_post(&cb_data->sem); + ast_sem_post(&cb_data->sem); } static enum ast_test_result_state presence_change_common(struct ast_test *test, @@ -727,7 +727,7 @@ return AST_TEST_FAIL; } - sem_wait(&cb_data->sem); + ast_sem_wait(&cb_data->sem); ast_copy_string(out_state, ast_presence_state2str(cb_data->presence_state->state), out_state_size); ast_copy_string(out_subtype, cb_data->presence_state->subtype, out_subtype_size); Modified: trunk/include/asterisk/autoconfig.h.in URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/autoconfig.h.in?view=diff&rev=431093&r1=431092&r2=431093 ============================================================================== --- trunk/include/asterisk/autoconfig.h.in (original) +++ trunk/include/asterisk/autoconfig.h.in Mon Jan 26 08:50:40 2015 @@ -324,7 +324,7 @@ /* Define to 1 if you have the Hoard Memory Allocator library. */ #undef HAVE_HOARD -/* Define to 1 if you have the `htonll' function. */ +/* Define to 1 if arpa/inet.h includes a htonll definition. */ #undef HAVE_HTONLL /* Define to 1 if you have the iCal library. */ @@ -524,7 +524,7 @@ /* Define to 1 if you have the newt library. */ #undef HAVE_NEWT -/* Define to 1 if you have the `ntohll' function. */ +/* Define to 1 if arpa/inet.h includes a ntohll definition. */ #undef HAVE_NTOHLL /* Define to 1 if your C library can safely print NULL to string formats. */ @@ -1299,6 +1299,11 @@ /* Define to 1 if running on Darwin. */ #undef _DARWIN_UNLIMITED_SELECT +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS Modified: trunk/include/asterisk/sem.h URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/sem.h?view=diff&rev=431093&r1=431092&r2=431093 ============================================================================== --- trunk/include/asterisk/sem.h (original) +++ trunk/include/asterisk/sem.h Mon Jan 26 08:50:40 2015 @@ -57,6 +57,11 @@ static force_inline int ast_sem_wait(struct ast_sem *sem) { return sem_wait(&sem->real_sem); +} + +static force_inline int ast_sem_timedwait(struct ast_sem *sem, const struct timespec *abs_timeout) +{ + return sem_timedwait(&sem->real_sem, abs_timeout); } static force_inline int ast_sem_getvalue(struct ast_sem *sem, int *sval) @@ -137,6 +142,20 @@ int ast_sem_wait(struct ast_sem *sem); /*! + * \brief Decrements the semaphore, waiting until abs_timeout. + * + * If the semaphore's current value is zero, this function blocks until another + * thread posts (ast_sem_post()) to the semaphore (or is interrupted by a signal + * handler, which sets errno to EINTR). + * + * \param sem Semaphore to decrement. + * + * \return 0 on success. + * \return -1 on error, errno set to indicate error. + */ +int ast_sem_timedwait(struct ast_sem *sem, const struct timespec *abs_timeout); + +/*! * \brief Gets the current value of the semaphore. * * If threads are blocked on this semaphore, POSIX allows the return value to be Modified: trunk/main/app.c URL: http://svnview.digium.com/svn/asterisk/trunk/main/app.c?view=diff&rev=431093&r1=431092&r2=431093 ============================================================================== --- trunk/main/app.c (original) +++ trunk/main/app.c Mon Jan 26 08:50:40 2015 @@ -2911,7 +2911,9 @@ ast_replace_sigchld(); } - sigfillset(&signal_set); + /* GCC 4.9 gives a bogus "right-hand operand of comma expression has + * no effect" warning */ + (void) sigfillset(&signal_set); pthread_sigmask(SIG_BLOCK, &signal_set, &old_set); pid = fork(); Modified: trunk/main/asterisk.c URL: http://svnview.digium.com/svn/asterisk/trunk/main/asterisk.c?view=diff&rev=431093&r1=431092&r2=431093 ============================================================================== --- trunk/main/asterisk.c (original) +++ trunk/main/asterisk.c Mon Jan 26 08:50:40 2015 @@ -4366,12 +4366,14 @@ } ast_makesocket(); - sigemptyset(&sigs); - sigaddset(&sigs, SIGHUP); - sigaddset(&sigs, SIGTERM); - sigaddset(&sigs, SIGINT); - sigaddset(&sigs, SIGPIPE); - sigaddset(&sigs, SIGWINCH); + /* GCC 4.9 gives a bogus "right-hand operand of comma expression has + * no effect" warning */ + (void) sigemptyset(&sigs); + (void) sigaddset(&sigs, SIGHUP); + (void) sigaddset(&sigs, SIGTERM); + (void) sigaddset(&sigs, SIGINT); + (void) sigaddset(&sigs, SIGPIPE); + (void) sigaddset(&sigs, SIGWINCH); pthread_sigmask(SIG_BLOCK, &sigs, NULL); sigaction(SIGURG, &urg_handler, NULL); signal(SIGINT, __quit_handler); Modified: trunk/main/bridge_channel.c URL: http://svnview.digium.com/svn/asterisk/trunk/main/bridge_channel.c?view=diff&rev=431093&r1=431092&r2=431093 ============================================================================== --- trunk/main/bridge_channel.c (original) +++ trunk/main/bridge_channel.c Mon Jan 26 08:50:40 2015 @@ -35,7 +35,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include <signal.h> -#include <semaphore.h> #include "asterisk/heap.h" #include "asterisk/astobj2.h" @@ -56,6 +55,7 @@ #include "asterisk/parking.h" #include "asterisk/causes.h" #include "asterisk/test.h" +#include "asterisk/sem.h" /*! * \brief Used to queue an action frame onto a bridge channel and write an action frame into a bridge. @@ -101,7 +101,7 @@ /*! Unique ID of this synchronization object. Corresponds with ID in synchronous frame payload */ unsigned int id; /*! Semaphore used for synchronization */ - sem_t sem; + struct ast_sem sem; /*! Pointer to next entry in the list */ AST_LIST_ENTRY(bridge_sync) list; }; @@ -124,7 +124,7 @@ { memset(sync_struct, 0, sizeof(*sync_struct)); sync_struct->id = id; - sem_init(&sync_struct->sem, 0, 0); + ast_sem_init(&sync_struct->sem, 0, 0); AST_RWLIST_WRLOCK(&sync_structs); AST_RWLIST_INSERT_TAIL(&sync_structs, sync_struct, list); @@ -157,7 +157,7 @@ AST_LIST_TRAVERSE_SAFE_END; AST_RWLIST_UNLOCK(&sync_structs); - sem_destroy(&sync_struct->sem); + ast_sem_destroy(&sync_struct->sem); } /*! @@ -189,7 +189,7 @@ .tv_nsec = timeout_val.tv_usec * 1000, }; - sem_timedwait(&sync_struct->sem, &timeout_spec); + ast_sem_timedwait(&sync_struct->sem, &timeout_spec); } /*! @@ -204,7 +204,7 @@ */ static void bridge_sync_signal(struct bridge_sync *sync_struct) { - sem_post(&sync_struct->sem); + ast_sem_post(&sync_struct->sem); } void ast_bridge_channel_lock_bridge(struct ast_bridge_channel *bridge_channel) Modified: trunk/main/rtp_engine.c URL: http://svnview.digium.com/svn/asterisk/trunk/main/rtp_engine.c?view=diff&rev=431093&r1=431092&r2=431093 ============================================================================== --- trunk/main/rtp_engine.c (original) +++ trunk/main/rtp_engine.c Mon Jan 26 08:50:40 2015 @@ -1948,7 +1948,7 @@ char sec[32]; char usec[32]; snprintf(sec, sizeof(sec), "%lu", payload->report->sender_information.ntp_timestamp.tv_sec); - snprintf(usec, sizeof(usec), "%lu", payload->report->sender_information.ntp_timestamp.tv_usec); + snprintf(usec, sizeof(usec), "%lu", (unsigned long)payload->report->sender_information.ntp_timestamp.tv_usec); json_rtcp_sender_info = ast_json_pack("{s: s, s: s, s: i, s: i, s: i}", "ntp_timestamp_sec", sec, "ntp_timestamp_usec", usec, Modified: trunk/main/sem.c URL: http://svnview.digium.com/svn/asterisk/trunk/main/sem.c?view=diff&rev=431093&r1=431092&r2=431093 ============================================================================== --- trunk/main/sem.c (original) +++ trunk/main/sem.c Mon Jan 26 08:50:40 2015 @@ -85,6 +85,7 @@ int ast_sem_wait(struct ast_sem *sem) { + int res; SCOPED_MUTEX(lock, &sem->mutex); ast_assert(sem->count >= 0); @@ -92,7 +93,37 @@ /* Wait for a non-zero count */ ++sem->waiters; while (sem->count == 0) { - ast_cond_wait(&sem->cond, &sem->mutex); + res = ast_cond_wait(&sem->cond, &sem->mutex); + /* Give up on error */ + if (res != 0) { + --sem->waiters; + return res; + } + } + --sem->waiters; + + /* Take it! */ + --sem->count; + + return 0; +} + +int ast_sem_timedwait(struct ast_sem *sem, const struct timespec *abs_timeout) +{ + int res; + SCOPED_MUTEX(lock, &sem->mutex); + + ast_assert(sem->count >= 0); + + /* Wait for a non-zero count */ + ++sem->waiters; + while (sem->count == 0) { + res = ast_cond_timedwait(&sem->cond, &sem->mutex, abs_timeout); + /* Give up on error */ + if (res != 0) { + --sem->waiters; + return res; + } } --sem->waiters; Modified: trunk/res/res_timing_kqueue.c URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_timing_kqueue.c?view=diff&rev=431093&r1=431092&r2=431093 ============================================================================== --- trunk/res/res_timing_kqueue.c (original) +++ trunk/res/res_timing_kqueue.c Mon Jan 26 08:50:40 2015 @@ -91,12 +91,12 @@ if (!(timer = ao2_alloc(sizeof(*timer), timer_destroy))) { ast_log(LOG_ERROR, "Could not allocate memory for kqueue_timer structure\n"); - return -1; + return NULL; } if ((timer->handle = kqueue()) < 0) { ast_log(LOG_ERROR, "Failed to create kqueue timer: %s\n", strerror(errno)); ao2_ref(timer, -1); - return -1; + return NULL; } return timer; @@ -201,6 +201,8 @@ if (timer->unacked == 0) { if (kevent(timer->handle, NULL, 0, &kev, 1, &sixty_seconds) > 0) { timer->unacked += kev.data; + } else { + perror("kevent"); } } @@ -250,7 +252,7 @@ } do { - pfd.fd = ast_timer_fd(kt); + pfd.fd = kqueue_timer_fd(kt); if (kqueue_timer_set_rate(kt, 1000)) { ast_test_status_update(test, "Cannot set timer rate to 1000/s\n"); res = AST_TEST_FAIL; @@ -271,13 +273,12 @@ res = AST_TEST_FAIL; break; } -#if 0 if (kt->unacked == 0) { ast_test_status_update(test, "Unacked events is 0, but there should be at least 1.\n"); res = AST_TEST_FAIL; break; } -#endif + kqueue_timer_enable_continuous(kt); start = ast_tvnow(); for (i = 0; i < 100; i++) { -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits