Skip to content

Commit

Permalink
libevent: Add libevent main loop adapter
Browse files Browse the repository at this point in the history
Glue for dispatching via libevent.  Requires 2.0.21 or later.

Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com>
  • Loading branch information
pprindeville committed Jul 5, 2018
1 parent e468634 commit 998e20c
Show file tree
Hide file tree
Showing 10 changed files with 573 additions and 2 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Expand Up @@ -10,3 +10,4 @@ before_install:
- sudo apt-get install python-gi-dev gir1.2-gtk-3.0
- sudo apt-get install mono-mcs qtbase5-dev
- sudo apt-get install intltool
- sudo apt-get install libevent-dev
12 changes: 12 additions & 0 deletions Makefile.am
Expand Up @@ -40,6 +40,7 @@ EXTRA_DIST = \
avahi-core.pc.in \
avahi-client.pc.in \
avahi-glib.pc.in \
avahi-libevent.pc.in \
avahi-gobject.pc.in \
avahi-qt3.pc.in \
avahi-qt4.pc.in \
Expand Down Expand Up @@ -77,6 +78,7 @@ SUBDIRS = \
avahi-autoipd \
avahi-ui \
avahi-ui-sharp \
avahi-libevent \
po

DX_INPUT = \
Expand Down Expand Up @@ -155,6 +157,11 @@ DX_INPUT += \
$(srcdir)/avahi-ui/avahi-ui.h
endif

if HAVE_LIBEVENT
DX_INPUT += \
$(srcdir)/avahi-libevent/libevent-watch.h
endif

pkgconfigdir = $(libdir)/pkgconfig

%.pc: %.pc.in
Expand Down Expand Up @@ -226,6 +233,11 @@ pkgconfig_DATA += avahi-qt5.pc
CLEANFILES += avahi-qt5.pc
endif

if HAVE_LIBEVENT
pkgconfig_DATA += avahi-libevent.pc
CLEANFILES += avahi-libevent.pc
endif

CLEANFILES += avahi.devhelp

avahi.devhelp: doxygen-run
Expand Down
11 changes: 11 additions & 0 deletions avahi-libevent.pc.in
@@ -0,0 +1,11 @@
prefix=@prefix@
exec_prefix=${prefix}
libdir=@libdir@
includedir=${prefix}/include

Name: avahi-libevent
Description: Avahi Multicast DNS Responder (libevent Support)
Version: @PACKAGE_VERSION@
Requires: libevent-2.1.5
Libs: -L${libdir} -lavahi-libevent
Cflags: -D_REENTRANT -I${includedir}
8 changes: 8 additions & 0 deletions avahi-libevent/.gitignore
@@ -0,0 +1,8 @@
*.o
*.lo
*.la
Makefile
Makefile.in
.deps
.libs
libevent-watch-test
51 changes: 51 additions & 0 deletions avahi-libevent/Makefile.am
@@ -0,0 +1,51 @@
# This file is part of avahi.
#
# avahi is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# avahi is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with avahi; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA.

AM_CFLAGS=-I$(top_srcdir)

# This cool debug trap works on i386/gcc only
AM_CFLAGS+='-DDEBUG_TRAP=__asm__("int $$3")'

if HAVE_LIBEVENT

avahilibeventincludedir=$(includedir)/avahi-libevent

avahilibeventinclude_HEADERS = \
libevent-watch.h

lib_LTLIBRARIES = \
libavahi-libevent.la

if ENABLE_TESTS
noinst_PROGRAMS = \
libevent-watch-test
endif

libavahi_libevent_la_SOURCES = \
libevent-watch.c libevent-watch.h

libavahi_libevent_la_CFLAGS = $(AM_CFLAGS) $(LIBEVENT_CFLAGS)
libavahi_libevent_la_LIBADD = $(AM_LDADD) ../avahi-common/libavahi-common.la $(LIBEVENT_LIBS)
libavahi_libevent_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LIBAVAHI_LIBEVENT_VERSION_INFO)

libevent_watch_test_SOURCES = \
libevent-watch.c libevent-watch.h \
libevent-watch-test.c
libevent_watch_test_CFLAGS = $(AM_CFLAGS) $(LIBEVENT_CFLAGS)
libevent_watch_test_LDADD = $(AM_LDADD) ../avahi-common/libavahi-common.la $(LIBEVENT_LIBS)

endif
96 changes: 96 additions & 0 deletions avahi-libevent/libevent-watch-test.c
@@ -0,0 +1,96 @@
/***
This file is part of avahi.
avahi is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
avahi is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with avahi; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.
***/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <errno.h>
#include <string.h>

#include <event2/event.h>

#include <avahi-common/watch.h>
#include <avahi-common/timeval.h>
#include <avahi-common/gccmacro.h>

#include "libevent-watch.h"

static const AvahiPoll *api = NULL;
static struct event_base *base = NULL;

static void callback(AvahiWatch *w, int fd, AvahiWatchEvent event, AVAHI_GCC_UNUSED void *userdata)
{
if (event & AVAHI_WATCH_IN) {
ssize_t r;
char c;

if ((r = read(fd, &c, 1)) <= 0) {
fprintf(stderr, "read() failed: %s\n", r < 0 ? strerror(errno) : "EOF");
api->watch_free(w);
return;
}

printf("Read: %c\n", c >= 32 && c < 127 ? c : '.');
}
}

static void wakeup(AvahiTimeout *t, AVAHI_GCC_UNUSED void *userdata)
{
struct timeval tv;
static unsigned i = 0;

printf("Wakeup #%u\n", i++);

if (i > 10)
event_base_loopbreak(base);

avahi_elapse_time(&tv, 1000, 0);
api->timeout_update(t, &tv);
}

int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char *argv[])
{
AvahiLibeventPoll *ep;
struct timeval tv;

base = event_base_new();
assert(base);

ep = avahi_libevent_poll_new(base);
assert(ep);

api = avahi_libevent_poll_get(ep);

api->watch_new(api, 0, AVAHI_WATCH_IN, callback, NULL);

avahi_elapse_time(&tv, 1000, 0);
api->timeout_new(api, &tv, wakeup, NULL);

event_base_dispatch(base);

avahi_libevent_poll_free(ep);

event_base_free(base);

return 0;
}

0 comments on commit 998e20c

Please sign in to comment.