[asterisk-commits] tilghman: trunk r251262 - in /trunk: ./ funcs/ include/asterisk/ main/ main/s...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sun Mar 7 23:13:00 CST 2010
Author: tilghman
Date: Sun Mar 7 23:12:55 2010
New Revision: 251262
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=251262
Log:
Change needed to make Mac OS X 10.6 happy
Modified:
trunk/configure
trunk/configure.ac
trunk/funcs/func_pitchshift.c
trunk/include/asterisk/autoconfig.h.in
trunk/main/Makefile
trunk/main/stdtime/localtime.c
Modified: trunk/configure.ac
URL: http://svnview.digium.com/svn/asterisk/trunk/configure.ac?view=diff&rev=251262&r1=251261&r2=251262
==============================================================================
--- trunk/configure.ac (original)
+++ trunk/configure.ac Sun Mar 7 23:12:55 2010
@@ -317,6 +317,7 @@
AST_EXT_LIB_SETUP([IODBC], [iODBC], [iodbc])
AST_EXT_LIB_SETUP([ISDNNET], [ISDN4Linux Library], [isdnnet])
AST_EXT_LIB_SETUP([JACK], [Jack Audio Connection Kit], [jack])
+AST_EXT_LIB_SETUP([KQUEUE], [kqueue support], [kqueue])
AST_EXT_LIB_SETUP([LDAP], [OpenLDAP], [ldap])
AST_EXT_LIB_SETUP([LIBXML2], [LibXML2], [libxml2])
AST_EXT_LIB_SETUP([LTDL], [libtool], [ltdl])
@@ -1405,6 +1406,9 @@
AST_EXT_LIB_CHECK([JACK], [jack], [jack_activate], [jack/jack.h])
+# BSD (and OS X) equivalent of inotify
+AST_EXT_LIB_CHECK([KQUEUE], [c], [kqueue], [sys/event.h])
+
# Needed by unixodbc
AST_EXT_LIB_CHECK([LTDL], [ltdl], [lt_dlinit], [ltdl.h], [])
Modified: trunk/funcs/func_pitchshift.c
URL: http://svnview.digium.com/svn/asterisk/trunk/funcs/func_pitchshift.c?view=diff&rev=251262&r1=251261&r2=251262
==============================================================================
--- trunk/funcs/func_pitchshift.c (original)
+++ trunk/funcs/func_pitchshift.c Sun Mar 7 23:12:55 2010
@@ -108,7 +108,9 @@
</function>
***/
+#ifndef M_PI
#define M_PI 3.14159265358979323846
+#endif
#define MAX_FRAME_LENGTH 256
#define HIGHEST 2
Modified: trunk/include/asterisk/autoconfig.h.in
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/autoconfig.h.in?view=diff&rev=251262&r1=251261&r2=251262
==============================================================================
--- trunk/include/asterisk/autoconfig.h.in (original)
+++ trunk/include/asterisk/autoconfig.h.in Sun Mar 7 23:12:55 2010
@@ -424,6 +424,12 @@
/* Define to the version of the Jack Audio Connection Kit library. */
#undef HAVE_JACK_VERSION
+
+/* Define to 1 if you have the kqueue support library. */
+#undef HAVE_KQUEUE
+
+/* Define to the version of the kqueue support library. */
+#undef HAVE_KQUEUE_VERSION
/* Define to 1 if you have the OpenLDAP library. */
#undef HAVE_LDAP
Modified: trunk/main/Makefile
URL: http://svnview.digium.com/svn/asterisk/trunk/main/Makefile?view=diff&rev=251262&r1=251261&r2=251262
==============================================================================
--- trunk/main/Makefile (original)
+++ trunk/main/Makefile Sun Mar 7 23:12:55 2010
@@ -46,6 +46,9 @@
ifneq ($(findstring darwin,$(OSARCH)),)
AST_LIBS+=-lresolv
ASTLINK=-Xlinker -macosx_version_min -Xlinker 10.4 -Xlinker -undefined -Xlinker dynamic_lookup -force_flat_namespace
+ ifeq ($(shell /usr/bin/sw_vers -productVersion | cut -c1-4),10.6)
+ ASTLINK+=/usr/lib/bundle1.o
+ endif
else
# These are used for all but Darwin
ifneq ($(findstring LOADABLE_MODULES,$(MENUSELECT_CFLAGS)),)
Modified: trunk/main/stdtime/localtime.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/stdtime/localtime.c?view=diff&rev=251262&r1=251261&r2=251262
==============================================================================
--- trunk/main/stdtime/localtime.c (original)
+++ trunk/main/stdtime/localtime.c Sun Mar 7 23:12:55 2010
@@ -53,6 +53,13 @@
#include <float.h>
#ifdef HAVE_INOTIFY
#include <sys/inotify.h>
+#elif HAVE_KQUEUE
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/event.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <fcntl.h>
#endif
#include "private.h"
@@ -152,6 +159,9 @@
struct lsinfo lsis[TZ_MAX_LEAPS];
#ifdef HAVE_INOTIFY
int wd[2];
+#elif defined(HAVE_KQUEUE)
+ int fd;
+ DIR *dir;
#else
time_t mtime[2];
#endif
@@ -316,6 +326,129 @@
| IN_DONT_FOLLOW
#endif
);
+ }
+}
+#elif HAVE_KQUEUE
+static int queue_fd = -1;
+
+static void *kqueue_daemon(void *data)
+{
+ struct kevent kev;
+ struct state *sp;
+ struct timespec no_wait = { 0, 1 };
+
+ if ((queue_fd = kqueue()) < 0) {
+ ast_log(LOG_ERROR, "Unable to initialize kqueue(): %s\n", strerror(errno));
+ inotify_thread = AST_PTHREADT_NULL;
+ ast_cond_signal(&initialization);
+ return NULL;
+ }
+
+ for (;/*ever*/;) {
+ if (kevent(queue_fd, NULL, 0, &kev, 1, NULL) < 0) {
+ continue;
+ }
+
+ sp = kev.udata;
+
+ /*!\note
+ * If the file event fired, then the file was removed, so we'll need
+ * to reparse the entry. The directory event is a bit more
+ * interesting. Unfortunately, the queue doesn't contain information
+ * about the file that changed (only the directory itself), so unless
+ * we kept a record of the directory state before, it's not really
+ * possible to know what change occurred. But if we act paranoid and
+ * just purge the associated file, then it will get reparsed, and
+ * everything works fine. It may be more work, but it's a vast
+ * improvement over the alternative implementation, which is to stat
+ * the file repeatedly in what is essentially a busy loop. */
+ AST_LIST_REMOVE(&zonelist, sp, list);
+
+#ifndef EV_RECEIPT
+#define EV_RECEIPT 0
+#endif
+ /* If the directory event fired, remove the file event */
+ EV_SET(&kev, sp->fd, EVFILT_VNODE, EV_DELETE | EV_RECEIPT, 0, 0, NULL);
+ kevent(queue_fd, &kev, 1, NULL, 0, &no_wait);
+ close(sp->fd);
+
+ if (sp->dir) {
+ /* If the file event fired, remove the directory event */
+ EV_SET(&kev, dirfd(sp->dir), EVFILT_VNODE, EV_DELETE | EV_RECEIPT, 0, 0, NULL);
+ kevent(queue_fd, &kev, 1, NULL, 0, &no_wait);
+ closedir(sp->dir);
+ }
+ free(sp);
+ }
+}
+
+static void add_notify(struct state *sp, const char *path)
+{
+ struct kevent kev;
+ struct timespec no_wait = { 0, 1 };
+ char watchdir[PATH_MAX + 1];
+
+ if (inotify_thread == AST_PTHREADT_NULL) {
+ ast_cond_init(&initialization, NULL);
+ ast_mutex_init(&initialization_lock);
+ ast_mutex_lock(&initialization_lock);
+ if (!(ast_pthread_create_background(&inotify_thread, NULL, kqueue_daemon, NULL))) {
+ /* Give the thread a chance to initialize */
+ ast_cond_wait(&initialization, &initialization_lock);
+ }
+ ast_mutex_unlock(&initialization_lock);
+ }
+
+ if (queue_fd < 0) {
+ /* Error already sent */
+ return;
+ }
+
+ if (readlink(path, watchdir, sizeof(watchdir) - 1) != -1) {
+ /* Special -- watch the directory for changes, because we cannot directly watch a symlink */
+ char *slash;
+ DIR *dir;
+
+ if ((slash = strrchr(watchdir, '/'))) {
+ *slash = '\0';
+ }
+ if (!(sp->dir = opendir(watchdir))) {
+ ast_log(LOG_ERROR, "Unable to watch directory with symlink '%s': %s\n", path, strerror(errno));
+ goto watch_file;
+ }
+
+ /*!\note
+ * You may be wondering about whether there is a potential conflict
+ * with the kqueue interface, because we might be watching the same
+ * directory for multiple zones. The answer is no, because kqueue
+ * looks at the descriptor to know if there's a duplicate. Since we
+ * (may) have opened the directory multiple times, each represents a
+ * different event, so no replacement of an existing event will occur.
+ * Likewise, there's no potential leak of a descriptor.
+ */
+ EV_SET(&kev, dirfd(sp->dir), EVFILT_VNODE, EV_ADD | EV_RECEIPT | EV_ONESHOT,
+ NOTE_WRITE | NOTE_EXTEND | NOTE_REVOKE, 0, sp);
+ if (kevent(queue_fd, &kev, 1, NULL, 0, &no_wait) < 0 && errno != 0) {
+ ast_log(LOG_ERROR, "Unable to watch '%s': %s\n", watchdir, strerror(errno));
+ closedir(dir);
+ goto watch_file;
+ }
+ }
+
+watch_file:
+ if ((sp->fd = open(path, O_RDONLY)) < 0) {
+ ast_log(LOG_ERROR, "Unable to watch '%s' for changes: %s\n", path, strerror(errno));
+ return;
+ }
+
+ EV_SET(&kev, sp->fd, EVFILT_VNODE, EV_ADD | EV_RECEIPT | EV_ONESHOT, NOTE_DELETE, 0, sp);
+ if (kevent(queue_fd, &kev, 1, NULL, 0, &no_wait) < 0 && errno != 0) {
+ /* According to the API docs, we may get -1 return value, due to the
+ * NULL space for a returned event, but errno should be 0 unless
+ * there's a real error. Otherwise, kevent will return 0 to indicate
+ * that the time limit expired. */
+ ast_log(LOG_ERROR, "Unable to watch '%s': %s\n", path, strerror(errno));
+ close(sp->fd);
}
}
#else
More information about the asterisk-commits
mailing list