mirror of
https://github.com/troglobit/libuev.git
synced 2026-10-23 11:24:34 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e6fac00bb | ||
|
|
8a3ab17435 | ||
|
|
aa62e60137 | ||
|
|
69c5b7f538 | ||
|
|
e765e42eb9 | ||
|
|
56a2e7ff30 | ||
|
|
b6f92e2b15 | ||
|
|
604afc6cec | ||
|
|
73ae8ba098 | ||
|
|
6a19fa7e93 | ||
|
|
737ceb4398 | ||
|
|
a8798ea6a7 | ||
|
|
d976171a14 | ||
|
|
398251ade6 | ||
|
|
628565b746 | ||
|
|
de4d969ca0 | ||
|
|
389c3b27ab | ||
|
|
03a29440ef | ||
|
|
9b3af80082 | ||
|
|
8f2c9f7f0e | ||
|
|
6a21b7a90b |
No files matched your search
@@ -27,3 +27,4 @@ bench
|
||||
libuev*.tar.*
|
||||
libuev.pc
|
||||
!libuev.pc.in
|
||||
test-driver
|
||||
+4
-5
@@ -2,7 +2,7 @@
|
||||
# Defaults to GNU GCC and autotools: ./configure && make && make test
|
||||
language: c
|
||||
|
||||
# We don't need to install packages, use dockerized build, quicker
|
||||
# Use docker for quicker builds, it now allows https://docs.travis-ci.com/user/apt/
|
||||
sudo: false
|
||||
|
||||
env:
|
||||
@@ -17,14 +17,13 @@ addons:
|
||||
name: "troglobit/libuev"
|
||||
description: "libuEv | Simple event loop for Linux"
|
||||
notification_email: troglobit@gmail.com
|
||||
build_command_prepend: "./autogen && ./configure --enable-examples"
|
||||
build_command_prepend: "./autogen && ./configure"
|
||||
build_command: "make clean all"
|
||||
branch_pattern: dev
|
||||
|
||||
# We don't use configure, so we must define our own build script.
|
||||
script:
|
||||
- ./autogen.sh
|
||||
- ./configure --disable-silent-rules --enable-examples
|
||||
- ./configure --disable-silent-rules
|
||||
- make clean
|
||||
- make -j5
|
||||
- make test
|
||||
- make check
|
||||
@@ -3,6 +3,20 @@ Change Log
|
||||
|
||||
All notable changes to the project are documented in this file.
|
||||
|
||||
[v1.5.2][] - 2016-11-27
|
||||
-----------------------
|
||||
|
||||
### Fixes
|
||||
- Fix build regression in v1.5.1
|
||||
|
||||
|
||||
[v1.5.1][] - 2016-11-27
|
||||
-----------------------
|
||||
|
||||
### Changes
|
||||
- Add support for checking if a watcher is active.
|
||||
- Refactor unit testing framework
|
||||
|
||||
|
||||
[v1.5.0][] - 2016-10-30
|
||||
-----------------------
|
||||
|
||||
+8
-24
@@ -1,39 +1,23 @@
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
lib_LTLIBRARIES = libuev.la
|
||||
pkgincludedir = $(includedir)/uev
|
||||
pkginclude_HEADERS = uev.h private.h queue.h
|
||||
libuev_la_SOURCES = uev.c io.c timer.c signal.c cron.c
|
||||
|
||||
check_PROGRAMS = bench
|
||||
bench_CPPFLAGS = -D_GNU_SOURCE
|
||||
bench_LDADD = $(top_srcdir)/libuev.la
|
||||
|
||||
libuev_la_CPPFLAGS = -D_GNU_SOURCE
|
||||
libuev_la_CFLAGS = -W -Wall -Wextra
|
||||
libuev_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:2:0
|
||||
|
||||
noinst_PROGRAMS = bench
|
||||
bench_CPPFLAGS = -D_GNU_SOURCE
|
||||
bench_LDADD = libuev.la
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgincludedir = $(includedir)/uev
|
||||
pkgconfig_DATA = libuev.pc
|
||||
pkginclude_HEADERS = uev.h private.h queue.h
|
||||
doc_DATA = README.md LICENSE
|
||||
EXTRA_DIST = README.md LICENSE AUTHORS ChangeLog.md
|
||||
|
||||
DIST_SUBDIRS = examples
|
||||
SUBDIRS = .
|
||||
if ENABLE_EXAMPLES
|
||||
SUBDIRS += examples
|
||||
endif
|
||||
|
||||
test joystick: all-recursive
|
||||
./examples/$@
|
||||
|
||||
check-local:
|
||||
@echo " BENCH $(PACKAGE)"
|
||||
@./bench
|
||||
if ENABLE_EXAMPLES
|
||||
@echo " TEST $(PACKAGE)"
|
||||
@./examples/test
|
||||
endif
|
||||
DIST_SUBDIRS = examples tests
|
||||
SUBDIRS = tests
|
||||
|
||||
## Generate MD5 checksum file
|
||||
MD5 = md5sum
|
||||
|
||||
@@ -140,7 +140,8 @@ static struct timeval *run_once(uev_ctx_t *ctx)
|
||||
|
||||
gettimeofday(&te, NULL);
|
||||
|
||||
// if (xcount != count) fprintf(stderr, "Xcount: %d, Rcount: %d\n", xcount, count);
|
||||
if (xcount != count)
|
||||
fprintf(stderr, "Xcount: %d, Rcount: %d\n", xcount, count);
|
||||
}
|
||||
|
||||
timersub(&te, &ta, &ta);
|
||||
|
||||
+2
-7
@@ -1,19 +1,14 @@
|
||||
AC_INIT(libuev, 1.5.0, https://github.com/troglobit/libuev/issues)
|
||||
AC_INIT(libuev, 1.5.2, https://github.com/troglobit/libuev/issues)
|
||||
AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz])
|
||||
AM_SILENT_RULES([yes])
|
||||
|
||||
AC_CONFIG_SRCDIR(uev.c)
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
AC_CONFIG_FILES([Makefile libuev.pc examples/Makefile])
|
||||
AC_CONFIG_FILES([Makefile libuev.pc examples/Makefile tests/Makefile])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
AC_PROG_CC
|
||||
AM_PROG_AR
|
||||
LT_INIT
|
||||
|
||||
AC_ARG_ENABLE([examples],
|
||||
[AS_HELP_STRING([--enable-examples], [build examples])],
|
||||
[enable_examples=yes], [])
|
||||
AM_CONDITIONAL([ENABLE_EXAMPLES], [test "$enable_examples" = yes])
|
||||
|
||||
AC_OUTPUT
|
||||
@@ -1,4 +1,4 @@
|
||||
noinst_PROGRAMS = signal test joystick cronrun
|
||||
noinst_PROGRAMS = joystick
|
||||
AM_CPPFLAGS = -I$(top_srcdir)
|
||||
AM_LDFLAGS = -L$(top_srcdir)
|
||||
LIBS = $(LTLIBINTL)
|
||||
|
||||
@@ -81,11 +81,12 @@ struct uev;
|
||||
uev_type_t
|
||||
|
||||
/* Internal API for dealing with generic watchers */
|
||||
int uev_watcher_init (uev_ctx_t *ctx, struct uev *w, uev_type_t type,
|
||||
void (*cb)(struct uev *, void *, int), void *arg,
|
||||
int fd, int events);
|
||||
int uev_watcher_start(struct uev *w);
|
||||
int uev_watcher_stop (struct uev *w);
|
||||
int uev_watcher_init (uev_ctx_t *ctx, struct uev *w, uev_type_t type,
|
||||
void (*cb)(struct uev *, void *, int), void *arg,
|
||||
int fd, int events);
|
||||
int uev_watcher_start (struct uev *w);
|
||||
int uev_watcher_stop (struct uev *w);
|
||||
int uev_watcher_active(struct uev *w);
|
||||
|
||||
#endif /* LIBUEV_PRIVATE_H_ */
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
*.trs
|
||||
*.log
|
||||
active
|
||||
complete
|
||||
cronrun
|
||||
signal
|
||||
timer
|
||||
@@ -0,0 +1,16 @@
|
||||
EXTRA_DIST = check.h
|
||||
CLEANFILES = *~ *.trs *.log
|
||||
|
||||
TESTS =
|
||||
TESTS += active
|
||||
TESTS += complete
|
||||
TESTS += cronrun
|
||||
TESTS += signal
|
||||
TESTS += timer
|
||||
|
||||
check_PROGRAMS = $(TESTS)
|
||||
|
||||
# Ignore warnings about unused result, in e.g. write()
|
||||
CFLAGS = -W -Wall -Wextra -Wno-unused-result
|
||||
CPPFLAGS = -D_GNU_SOURCE
|
||||
LDADD = -L../ ../libuev.la
|
||||
@@ -0,0 +1,51 @@
|
||||
#include "check.h"
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#define TIMEOUT1 2 /* 2 sec */
|
||||
#define TIMEOUT2 4 /* 4 sec */
|
||||
#define DAYLY (24 * 60 * 60) /* Seconds in one day */
|
||||
|
||||
uev_t timer1;
|
||||
uev_t timer2;
|
||||
uev_t timer3;
|
||||
uev_t cron1;
|
||||
uev_t cron2;
|
||||
|
||||
static void cb(uev_t *w, void *UNUSED(arg), int UNUSED(events))
|
||||
{
|
||||
fail_unless(w == &timer1);
|
||||
|
||||
fail_unless(uev_timer_active(&timer2));
|
||||
fail_unless(!uev_timer_active(&timer3));
|
||||
fail_unless(uev_cron_active(&cron1));
|
||||
fail_unless(uev_cron_active(&cron2));
|
||||
|
||||
uev_timer_stop(&timer2);
|
||||
uev_timer_stop(&cron2);
|
||||
|
||||
fail_unless(!uev_timer_active(&timer2));
|
||||
fail_unless(!uev_cron_active(&cron2));
|
||||
|
||||
uev_exit(w->ctx);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
uev_ctx_t ctx;
|
||||
struct timeval tomorrow;
|
||||
|
||||
gettimeofday(&tomorrow, NULL);
|
||||
tomorrow.tv_sec += 24 * 60 * 60;
|
||||
|
||||
uev_init(&ctx);
|
||||
uev_timer_init(&ctx, &timer1, cb, NULL, TIMEOUT1 * 1000, 0);
|
||||
uev_timer_init(&ctx, &timer2, cb, NULL, TIMEOUT2 * 1000, 0);
|
||||
uev_timer_init(&ctx, &timer3, cb, NULL, TIMEOUT2 * 1000, 0);
|
||||
uev_timer_stop(&timer3);
|
||||
|
||||
uev_cron_init(&ctx, &cron1, cb, NULL, tomorrow.tv_sec, 24 * 60 * 60);
|
||||
uev_cron_init(&ctx, &cron2, cb, NULL, tomorrow.tv_sec, 24 * 60 * 60);
|
||||
|
||||
return uev_run(&ctx, 0);
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
#ifndef UEV_TESTS_CHECK_H_
|
||||
#define UEV_TESTS_CHECK_H_
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../uev.h"
|
||||
|
||||
#define UNUSED(arg) arg __attribute__ ((unused))
|
||||
|
||||
#define fail_unless(test) \
|
||||
do { \
|
||||
if (!(test)) { \
|
||||
fprintf(stderr, \
|
||||
"----------------------------------------------\n" \
|
||||
"%s:%d: test FAILED:\nFailed test: %s\n" \
|
||||
"----------------------------------------------\n", \
|
||||
__FILE__, __LINE__, #test); \
|
||||
exit(1); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static inline int test(int result, const char *fmt, ...)
|
||||
{
|
||||
char buf[80];
|
||||
size_t len;
|
||||
va_list ap;
|
||||
const char success[] = " \033[1m[ OK ]\033[0m\n";
|
||||
const char failure[] = " \033[7m[FAIL]\033[0m\n";
|
||||
const char dots[] = " .....................................................................";
|
||||
|
||||
va_start(ap, fmt);
|
||||
len = vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
write(STDERR_FILENO, buf, len);
|
||||
write(STDERR_FILENO, dots, 60 - len); /* pad with dots. */
|
||||
|
||||
if (!result)
|
||||
write(STDERR_FILENO, success, strlen(success));
|
||||
else
|
||||
write(STDERR_FILENO, failure, strlen(failure));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline int timespec_newer(const struct timespec *a, const struct timespec *b)
|
||||
{
|
||||
if (a->tv_sec != b->tv_sec)
|
||||
return a->tv_sec > b->tv_sec;
|
||||
|
||||
return a->tv_nsec > b->tv_nsec;
|
||||
}
|
||||
|
||||
static inline char *timespec2str(struct timespec *ts, char *buf, size_t len)
|
||||
{
|
||||
size_t ret, pos;
|
||||
struct tm t;
|
||||
|
||||
memset(buf, 0, len);
|
||||
|
||||
tzset();
|
||||
if (localtime_r(&(ts->tv_sec), &t) == NULL)
|
||||
return buf;
|
||||
|
||||
ret = strftime(buf, len, "%F %T", &t);
|
||||
if (ret == 0)
|
||||
return buf;
|
||||
len -= ret - 1;
|
||||
|
||||
pos = strlen(buf);
|
||||
len -= pos;
|
||||
snprintf(&buf[pos], len, ".%09ld", ts->tv_nsec);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
#endif /* UEV_TESTS_CHECK_H_ */
|
||||
@@ -22,14 +22,8 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "check.h"
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h> /* intptr_t */
|
||||
|
||||
#include "uev.h"
|
||||
|
||||
#define UNUSED(arg) arg __attribute__ ((unused))
|
||||
|
||||
typedef struct {
|
||||
int counter;
|
||||
@@ -138,8 +132,7 @@ int main(void)
|
||||
uev_run(&ctx, 0);
|
||||
|
||||
fprintf(stderr, "Period is %d must be 10: %s\n", period, 10 == period ? "OK" : "ERROR!");
|
||||
if (10 != period)
|
||||
return 1;
|
||||
fail_unless(10 == period);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -21,20 +21,29 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "check.h"
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include "uev.h"
|
||||
|
||||
#define UNUSED(arg) arg __attribute__ ((unused))
|
||||
#define TIMEOUT 2
|
||||
#define INTERVAL 2
|
||||
|
||||
struct timeval tv;
|
||||
|
||||
static void cron_job(uev_t *w, void *arg, int events)
|
||||
static void cron_job(uev_t *w, void *UNUSED(arg), int UNUSED(events))
|
||||
{
|
||||
struct timeval tv;
|
||||
static int laps = 3;
|
||||
struct timeval now;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
printf("Cron job HELO %s", ctime(&tv.tv_sec));
|
||||
/* Update timer every lap */
|
||||
tv.tv_sec += TIMEOUT;
|
||||
|
||||
gettimeofday(&now, NULL);
|
||||
printf("Cron job HELO %s", ctime(&now.tv_sec));
|
||||
fail_unless(now.tv_sec == tv.tv_sec);
|
||||
|
||||
if (!laps--)
|
||||
uev_exit(w->ctx);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
@@ -42,20 +51,16 @@ int main(void)
|
||||
uev_t cron_watcher;
|
||||
uev_ctx_t ctx;
|
||||
time_t when, interval;
|
||||
struct timeval tv;
|
||||
|
||||
/* Initialize libuEv */
|
||||
uev_init(&ctx);
|
||||
|
||||
/* Cron job */
|
||||
gettimeofday(&tv, NULL);
|
||||
when = tv.tv_sec + 30;
|
||||
interval = 30;
|
||||
uev_cron_init(&ctx, &cron_watcher, cron_job, NULL, when, interval);
|
||||
|
||||
/* Start event loop */
|
||||
printf("Start of test %s", ctime(&tv.tv_sec));
|
||||
printf("Expected cron %s", ctime(&when));
|
||||
|
||||
when = tv.tv_sec + TIMEOUT;
|
||||
interval = INTERVAL;
|
||||
uev_cron_init(&ctx, &cron_watcher, cron_job, NULL, when, interval);
|
||||
|
||||
return uev_run(&ctx, 0);
|
||||
}
|
||||
@@ -21,7 +21,7 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include "check.h"
|
||||
#include <err.h>
|
||||
#include <sched.h>
|
||||
#include <signal.h>
|
||||
@@ -33,8 +33,6 @@
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "uev.h"
|
||||
|
||||
#define UNUSED(arg) arg __attribute__ ((unused))
|
||||
#define DO_SEGFAULT 1
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
#include "check.h"
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#define TIMEOUT 2 /* 2 sec */
|
||||
struct timeval start;
|
||||
|
||||
static void cb(uev_t *w, void *UNUSED(arg), int UNUSED(events))
|
||||
{
|
||||
struct timeval now;
|
||||
|
||||
gettimeofday(&now, NULL);
|
||||
fail_unless(now.tv_sec == start.tv_sec + TIMEOUT);
|
||||
|
||||
uev_exit(w->ctx);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
uev_t w;
|
||||
uev_ctx_t ctx;
|
||||
|
||||
uev_init(&ctx);
|
||||
uev_timer_init(&ctx, &w, cb, NULL, TIMEOUT * 1000, 0);
|
||||
gettimeofday(&start, NULL);
|
||||
|
||||
return uev_run(&ctx, 0);
|
||||
}
|
||||
@@ -124,6 +124,15 @@ int uev_watcher_stop(uev_t *w)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Private to libuEv, do not use directly! */
|
||||
int uev_watcher_active(uev_t *w)
|
||||
{
|
||||
if (!w)
|
||||
return 0;
|
||||
|
||||
return w->active;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an event loop context
|
||||
* @param ctx Pointer to an uev_ctx_t context to be initialized
|
||||
|
||||
@@ -41,6 +41,12 @@
|
||||
#define UEV_ONCE 1
|
||||
#define UEV_NONBLOCK 2
|
||||
|
||||
/* Macros */
|
||||
#define uev_io_active(w) uev_watcher_active(w)
|
||||
#define uev_timer_active(w) uev_watcher_active(w)
|
||||
#define uev_cron_active(w) uev_watcher_active(w)
|
||||
#define uev_signal_active(w) uev_watcher_active(w)
|
||||
|
||||
/* Event watcher */
|
||||
typedef struct uev {
|
||||
/* Private data for libuEv internal engine */
|
||||
|
||||
Reference in new issue
Block a user