# HG changeset patch # User Tero Marttila # Date 1236472550 -7200 # Node ID 9f7ecf7bf699a9dc5bfbf819b0d76006c4e0f106 # Parent b17d2cf35504d8434526f20596f3abc72905e7ca wrangle evsql_test to work diff -r b17d2cf35504 -r 9f7ecf7bf699 CMakeLists.txt --- a/CMakeLists.txt Sun Mar 08 02:00:06 2009 +0200 +++ b/CMakeLists.txt Sun Mar 08 02:35:50 2009 +0200 @@ -9,6 +9,7 @@ # dependancies find_package(LibEvent REQUIRED) +find_package(LibPQ REQUIRED) # add the src subdir add_subdirectory (src) diff -r b17d2cf35504 -r 9f7ecf7bf699 cmake/Modules/FindLibEvent.cmake --- a/cmake/Modules/FindLibEvent.cmake Sun Mar 08 02:00:06 2009 +0200 +++ b/cmake/Modules/FindLibEvent.cmake Sun Mar 08 02:35:50 2009 +0200 @@ -12,13 +12,11 @@ # include dir find_path (LibEvent_INCLUDE_DIR NAMES "event2/event.h" - PATHS "$ENV{LIBEVENT_PREFIX}/include" ) # library find_library (LibEvent_LIBRARY NAMES "event" - PATHS "$ENV{LIBEVENT_PREFIX}/lib" ) # set the external vars diff -r b17d2cf35504 -r 9f7ecf7bf699 cmake/Modules/FindLibPQ.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmake/Modules/FindLibPQ.cmake Sun Mar 08 02:35:50 2009 +0200 @@ -0,0 +1,27 @@ +# Find libevent +# Once done, this will define: +# +# LibPQ_FOUND +# LibPQ_INCLUDE_DIRS +# LibPQ_LIBRARIES +# +# Currently, this only supports libevent-svn (i.e. 1.5/2.0), so it's kind of useless for real use :) + +include (LibFindMacros) + +# include dir +find_path (LibPQ_INCLUDE_DIR + NAMES "postgresql/libpq-fe.h" + PATHS "$ENV{POSTGRESQL_PREFIX}/include" +) + +# library +find_library (LibPQ_LIBRARY + NAMES "pq" + PATHS "$ENV{POSTGRESQL_PREFIX}/lib" +) + +# set the external vars +set (LibPQ_PROCESS_INCLUDES LibPQ_INCLUDE_DIR) +set (LibPQ_PROCESS_LIBS LibPQ_LIBRARY) +libfind_process (LibPQ) diff -r b17d2cf35504 -r 9f7ecf7bf699 src/CMakeLists.txt --- a/src/CMakeLists.txt Sun Mar 08 02:00:06 2009 +0200 +++ b/src/CMakeLists.txt Sun Mar 08 02:35:50 2009 +0200 @@ -1,5 +1,5 @@ # add our include path -include_directories (${evsql_SOURCE_DIR}/include ${LibEvent_INCLUDE_DIRS}) +include_directories (${LibEvent_INCLUDE_DIRS}) # define our source code modules set (LIB_SOURCES "lib/log.c") @@ -8,13 +8,17 @@ # XXX: silly cmake does silly things when you SET with only one arg set (EVSQL_SOURCES lib/log.c evpq.c core.c query.c result.c util.c) +set (EVSQL_LIBRARIES ${LibEvent_LIBRARIES} ${LibPQ_LIBRARIES}) + +set (CFLAGS "-Wall -Wextra") # add our library add_library (evsql ${EVSQL_SOURCES}) # set target attributes -target_link_libraries (evsql ${LibEvent_LIBRARIES}) +target_link_libraries (evsql ${EVSQL_LIBRARIES}) set_target_properties (evsql PROPERTIES + COMPILE_FLAGS ${CFLAGS} FRAMEWORK True PUBLIC_HEADER include/evsql.h ) @@ -25,3 +29,11 @@ ARCHIVE DESTINATION lib/static PUBLIC_HEADER DESTINATION include ) + +# test stuff +add_executable (evsql_test EXCLUDE_FROM_ALL lib/log.c lib/signals.c evsql_test.c) +target_link_libraries (evsql_test evsql) +set_target_properties (evsql_test PROPERTIES + COMPILE_FLAGS ${CFLAGS} +) + diff -r b17d2cf35504 -r 9f7ecf7bf699 src/evsql_test.c --- a/src/evsql_test.c Sun Mar 08 02:00:06 2009 +0200 +++ b/src/evsql_test.c Sun Mar 08 02:35:50 2009 +0200 @@ -31,8 +31,9 @@ static struct event ev; struct timeval tv = { 5, 0 }; - evperiodic_assign(&ev, base, &tv, &query_timer, db); - event_add(&ev, &tv); +// XXX: disabled as evperiod_assign has gone missing +// evperiodic_assign(&ev, base, &tv, &query_timer, db); +// event_add(&ev, &tv); INFO("[evsql_test.timer_start] started timer"); } @@ -275,5 +276,7 @@ if (ev_base) event_base_free(ev_base); + // XXX: err + return 0; } diff -r b17d2cf35504 -r 9f7ecf7bf699 src/lib/log.h --- a/src/lib/log.h Sun Mar 08 02:00:06 2009 +0200 +++ b/src/lib/log.h Sun Mar 08 02:35:50 2009 +0200 @@ -25,7 +25,7 @@ __attribute__ ((format (printf, 4, 5))) __attribute__ ((noreturn)); -static inline void debug_dummy (int dummy, ...) { /* no-op */ } +static inline void debug_dummy (int dummy, ...) { (void) dummy; /* no-op */ } enum _debug_level { DEBUG_FATAL, diff -r b17d2cf35504 -r 9f7ecf7bf699 src/lib/signals.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/signals.c Sun Mar 08 02:35:50 2009 +0200 @@ -0,0 +1,114 @@ +#define _GNU_SOURCE +#include +#include +#include +#include + +#include "signals.h" +#include "log.h" + +struct signals { + struct event_base *ev_base; + + struct signal { + struct event *ev; + } sig_list[MAX_SIGNALS]; + + int sig_count; +}; + +void signals_loopexit (int signal, short event, void *arg) { + struct signals *signals = arg; + + (void) event; + + INFO("[signal] caught %s: exiting the event loop", strsignal(signal)); + + if (event_base_loopexit(signals->ev_base, NULL)) + FATAL("event_base_loopexit"); +} + +void signals_ignore (int signal, short event, void *arg) { + struct signals *signals = arg; + + (void) signal; + (void) event; + (void) arg; + (void) signals; + + /* ignore */ +} + +struct signals *signals_alloc (struct event_base *ev_base) { + struct signals *signals = NULL; + + if ((signals = calloc(1, sizeof(*signals))) == NULL) + ERROR("calloc"); + + // simple attributes + signals->ev_base = ev_base; + + // done + return signals; + +error: + return NULL; +} + +int signals_add (struct signals *signals, int sigval, void (*sig_handler)(evutil_socket_t, short, void *)) { + struct signal *sig_info; + + // find our sig_info + assert(signals->sig_count < MAX_SIGNALS); + sig_info = &signals->sig_list[signals->sig_count++]; + + // set up the libevent signal events + if ((sig_info->ev = evsignal_new(signals->ev_base, sigval, sig_handler, signals)) == NULL) + PERROR("signal_new"); + + if (evsignal_add(sig_info->ev, NULL)) + PERROR("signal_add"); + + // success + return 0; + +error: + return -1; +} + +struct signals *signals_default (struct event_base *ev_base) { + struct signals *signals = NULL; + + // alloc signals + if ((signals = signals_alloc(ev_base)) == NULL) + return NULL; + + // add the set of default signals + if ( signals_add(signals, SIGPIPE, &signals_ignore) + || signals_add(signals, SIGINT, &signals_loopexit) + ) ERROR("signals_add"); + + // success + return signals; + +error: + if (signals) + signals_free(signals); + + return NULL; +} + +void signals_free (struct signals *signals) { + int i; + + // free all events + for (i = 0; i < signals->sig_count; i++) { + if (evsignal_del(signals->sig_list[i].ev)) + PWARNING("signal_del"); + + } + + // free the info itself + free(signals); +} + diff -r b17d2cf35504 -r 9f7ecf7bf699 src/lib/signals.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/signals.h Sun Mar 08 02:35:50 2009 +0200 @@ -0,0 +1,54 @@ +#ifndef LIB_SIGNAL_H +#define LIB_SIGNAL_H + +/* + * Handle signals in a libevent-sane way + */ + +#include + +/* + * How many signals we can define actions for + */ +#define MAX_SIGNALS 8 + +/* + * info about a set of signals + */ +struct signals; + +/* + * Used as a handler for signals that should cause a loopexit. + */ +void signals_loopexit (int signal, short event, void *arg); + +/* + * Used to receive signals, but discard them. + */ +void signals_ignore (int signal, short event, void *arg); + +/* + * Allocate a signals struct, acting on the given ev_base. + * + * Returns NULL on failure + */ +struct signals *signals_alloc (struct event_base *ev_base); + +/* + * Add a signal to be handled by the given signals struct with the given handler. + */ +int signals_add (struct signals *signals, int sigval, void (*sig_handler)(evutil_socket_t, short, void *)); + +/* + * Add a set of default signals + * SIGPIPE signals_ignore + * SIGINT signals_loopexit + */ +struct signals *signals_default (struct event_base *ev_base); + +/* + * Free the resources/handlers associated with the given signal handler + */ +void signals_free (struct signals *signals); + +#endif /* LIB_SIGNAL_H */