97 Commits
Author SHA1 Message Date
Joachim Nilsson 4255ebb9c6 Update ChangeLog and bump version for v1.4.2 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-06-25 11:38:26 +02:00
Joachim Nilsson 930cce21fa Add reference to Mark Heily's libkqueue
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-06-22 14:49:54 +02:00
Joachim Nilsson addd60db22 Merge pull request #8 from westermo/master
Check timer period and timeout arguments
2016-06-17 13:51:02 +02:00
Joachim Nilsson e3d40ef010 Check timer period and timeout arguments
The uev_timer_init() and uev_timer_set() functions allow timeout and
period to be set < 0, which is not supported.  This patch adds a very
simple range check.

Signed-off-by: Joachim Nilsson <joachim.nilsson@westermo.se>
2016-06-17 13:45:11 +02:00
Joachim Nilsson 618b50ee88 Play around a bit more with the intro.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-25 22:17:47 +02:00
Joachim Nilsson f64301194a Move rant to end of README and simplify intro
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-25 20:23:03 +02:00
Joachim Nilsson bdbfe809ab Start planning for uEv 1.5 -- support Lua bindings
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-23 15:01:19 +02:00
Joachim Nilsson 2742adfe98 Add missing Markdown link to v1.4.1 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-22 14:57:16 +02:00
Joachim Nilsson 35d3a0f185 Update ChangeLog for v1.4.1 bug fix release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-22 14:54:53 +02:00
Joachim Nilsson 441d53e46e Bump ABI revision, v1.0.1, slight semantic change (CLOEXEC)
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-22 14:53:29 +02:00
Joachim Nilsson 0b19880f80 Bump version to v1.4.1 for CLOEXEC fix
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-22 14:37:48 +02:00
Joachim Nilsson 852bd506e8 Fix Markdown syntax in older releases
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-22 14:34:46 +02:00
Joachim Nilsson 98c8e9f8b1 Fix leaking descriptors, use CLOEXEC
The signal and timer fd's used in libuEv were not created properly with
the CLOEXEC flag.  Hence, all forked off children calling exec*() could
access all file descriptor, sockets, etc., used by the parent process.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-22 14:31:51 +02:00
Joachim Nilsson 9fc5227343 Update copyright years
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-22 14:30:56 +02:00
Joachim Nilsson e613248392 Minor style changes and whitespace fixes
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-22 14:30:07 +02:00
Joachim Nilsson ac5f01ea22 Remove Emacs version-control handling
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-22 14:29:19 +02:00
Joachim Nilsson a0ddb4eae3 Simplify configure script
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-17 00:42:43 +02:00
Joachim Nilsson 1e7720735f Remove bogus autoconf version requirement
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-17 00:42:25 +02:00
Joachim Nilsson 8010d76133 Remove superfluous space
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-17 00:41:32 +02:00
Joachim Nilsson 73459ca609 Add some integration tips when using GNU autotools
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-04-17 00:27:54 +02:00
Joachim Nilsson bd6d519315 Update ChangeLog and bump version for v1.4.0 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-03-22 20:26:28 +01:00
Joachim Nilsson ece9788f5a Merge pull request #7 from villains/master
Add support for EPOLLPRI events for i/o watchers

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-03-16 16:28:36 +01:00
Markus Svilans a9a78e8bf0 Add support for EPOLLPRI events for i/o watchers 2016-03-16 09:21:07 -04:00
Joachim Nilsson 71697266ed Simplify and clean up joystick example
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-03-13 22:36:46 +01:00
Joachim Nilsson d5d6f9d844 README: Explicitly link to Summary section about caveat on signalfd
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-03-13 02:22:14 +01:00
Joachim Nilsson 57a7bbe1b0 README: Minor polish and clarifications
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-03-13 02:14:58 +01:00
Joachim Nilsson acb6d82ccf Minor update, mention when namespacing was silently introduced
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-03-13 01:55:59 +01:00
Joachim Nilsson 7de9dafacc Bump version to v1.4.0-dev and update ChangeLog
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-03-13 01:32:07 +01:00
Joachim Nilsson 2a1561b449 Update README with new header namespace and some basic housekeeping
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-03-13 01:30:36 +01:00
Joachim Nilsson 7704e46b48 Change namespace for header files libuev/uev.h --> uev/uev.h
The `libuev/` namespace for header files was introduced in v1.2.1.  This
patch changes it to the less surprising `uev/`.  Hopefully there aren't
that many users of this library out there yet, apart from myself.

Apologies if you are affected!

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-03-13 01:20:40 +01:00
Joachim Nilsson 8e3225999c Add pkg-config support
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-03-13 01:10:38 +01:00
Joachim Nilsson f856f299e4 Update ChangeLog and bump version for v1.3.1 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-02-02 09:41:10 +01:00
Joachim Nilsson 7012ab4779 Update ChangeLog in preparation for v1.3.1 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-02-02 08:21:02 +01:00
Joachim Nilsson 23a7773f5c Makefile.am: Update to install and distribute README.md, LICENSE, etc.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-02-02 08:15:31 +01:00
Joachim Nilsson 232e476429 Remove confusing symlinks, it's a brave Markdown world
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-02-02 08:11:47 +01:00
Joachim Nilsson 33ad2f5e87 Bump version for 1.3.1-dev cycle
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-22 01:00:11 +01:00
Joachim Nilsson ae52fbdf2e Update ChangeLog with GIT diff links and fix minor Markdown formatting
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-22 00:59:33 +01:00
Joachim Nilsson b3541da7cb Update ChangeLog and bump version for v1.3.0 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-22 00:54:06 +01:00
Joachim Nilsson 315bd4558a Use pkginclude_HEADERS for libuEv include files
Fix include file namespace lost in initial conversion to GNU autotools,
use $(prefix)/include/$(PACKAGE)/*.h

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-22 00:52:13 +01:00
Joachim Nilsson a0bed33445 Drop -Werror from default CFLAGS, for maintainer(s) only
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-22 00:31:12 +01:00
Joachim Nilsson bf127b0dab Updates and cleanup of README
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-22 00:24:32 +01:00
Joachim Nilsson 7d6d90cdb1 Remove AM_MAINTAINER_MODE from configure script, not recommended anymore
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-21 22:31:58 +01:00
Joachim Nilsson 78b7d0962a Make sure to distribute examples as well, even if --disable-examples
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-15 00:58:05 +01:00
Joachim Nilsson 1370275e61 Run clean pass first, then parallel build test
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-14 21:45:16 +01:00
Joachim Nilsson d01cd60dae Update .gitignore to mask out all generated files from GNU build system
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-14 21:41:14 +01:00
Joachim Nilsson fb942fcea9 Makefile.am: Prune unused libuev_la_LIBADD
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-14 21:38:32 +01:00
Joachim Nilsson f49232cce0 README: Further updates after conversion to GNU configure and build
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-12 21:40:30 +01:00
Joachim Nilsson 6933f7f7c2 README: Small update about the new GNU configure and build system
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-11 17:30:38 +01:00
Joachim Nilsson cd522704c7 Create empty m4 directory for the benefit of autogen.sh and Travis-CI
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-10 19:00:16 +01:00
Joachim Nilsson a0ebd468b6 Debug Travis-CI, fails to run autogen.sh
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-10 18:57:58 +01:00
Joachim Nilsson b621062719 Fix Travis-CI build script
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-10 18:51:07 +01:00
Joachim Nilsson f3e12a98a0 Update build script for Travis-CI with GNU configure and build system
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-10 18:49:30 +01:00
Joachim Nilsson acf6bbcbaf Initial conversion to the GNU configure and build system
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-10 18:21:52 +01:00
Joachim Nilsson a8604938e9 Remove default -Os optimization and add -Wextra
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-08 21:06:20 +01:00
Joachim Nilsson cbb7455603 Correct Markdown syntax to version links
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-05 12:58:55 +01:00
Joachim Nilsson cf5e729dd3 Update ChangeLog and bump version for v1.2.4 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-11-23 00:41:33 +01:00
Joachim Nilsson 352baa8270 Make sure we don't inherit LDFLAGS from environment.
To pass custom LDFLAGS to libite, use EXTRA_LDFLAGS.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-10-22 18:36:37 +02:00
Joachim Nilsson 8721566d74 Do not allow VERSION to be overloaded by build system.
When integrating libuEv as a component in another piece of software,
that build system may set VERSION as an environment variable.  We do
not want that version to be set as the version of libuEv.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-10-03 09:14:31 +02:00
Joachim Nilsson a8d8705c34 Bump version for v1.2.3 release.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-17 11:13:12 +02:00
Joachim Nilsson 4c03342c77 ChangeLog: Fix minor Markdown syntax error.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-17 11:11:33 +02:00
Joachim Nilsson c1fe3be3e7 README: Further simplifications.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-17 11:09:41 +02:00
Joachim Nilsson 861bf14d71 Update ChangeLog for v1.2.3 release.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-17 10:58:15 +02:00
Joachim Nilsson 395d2df573 README: Add more sub-sections to API chapter, readability.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-17 10:21:11 +02:00
Joachim Nilsson 2132ab1bd5 Let make test also run the test, like in the automake world.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-16 22:55:15 +02:00
Joachim Nilsson d62ae8f041 Rename CHANGELOG.md --> ChangeLog.md
- Rename to more common ChangeLog
- Drop TODO from distribution, only for devs

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-16 18:07:40 +02:00
Joachim Nilsson 1b1397b4ee Bump version to 1.2.3-beta1, prepare for upcoming v1.2.3 release.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-16 18:06:10 +02:00
Joachim Nilsson 7bf5c8d8d7 Let Travis run some tests as well.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-16 18:05:31 +02:00
Joachim Nilsson 1374661d4b README: Fix syntax error in example.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-16 18:05:04 +02:00
Joachim Nilsson 694e2b5ab9 Silence annoying warnings from GNU ar
In (very) modern versions of binutils, for instance v2.25.1 in Ubuntu
15.10, complain about VERY common `crus` argument.  This patch attempts
to silence this noise:

    $ make -j5
      CC      uev.o
      CC      io.o
      CC      timer.o
      CC      signal.o
      ARCHIVE libuev.a
      LINK    libuev.so.1
    ar: `u' modifier ignored since `D' is the default (see `U')

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-16 18:04:06 +02:00
Joachim Nilsson c2751af452 README: Further fixes to missing Markdown links.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-13 01:10:02 +02:00
Joachim Nilsson 1ce9fde395 README: Fix Markdown for code blocks.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-13 00:51:49 +02:00
Joachim Nilsson 7e9f8c4913 README: Fix Travis-CI and Coverity Markdown links.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-13 00:49:31 +02:00
Joachim Nilsson dd09c7c3a9 README: More Markdown syntax fixes.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-13 00:47:49 +02:00
Joachim Nilsson fe04723353 README: Markdown syntax (non-GitHub) fixes.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-13 00:46:20 +02:00
Joachim Nilsson 78995951ae Update ChangeLog and bump version for v1.2.2 release.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-08-30 18:19:22 +02:00
Joachim Nilsson 3adc7a03c0 Fix issue #6: Segfault when stopping timer before calling uev_exit()
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-08-30 18:02:47 +02:00
Joachim Nilsson 2abeb39fe8 Use dockerized build, quicker and less resource intensive for Travis-CI
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-08-22 16:06:21 +02:00
Joachim Nilsson 1480976724 Fix data ordering bug causing problems on Debian Jessie
Got very odd results on Debian Jessie when having the uev_private_t last
in uev_t.  Turns out that when uev.c set "w->active = 0;" the w->fd data
member was written to instead.

Placing the private data first in uev_t is better practise, generally a
good thing for linked lists built on the BSD sys/queue.h API, looks a
lot better, but foremost works.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-07-19 04:40:30 +02:00
Joachim Nilsson 6ffa76c2f8 Remove STATIC ifdef, always build .a and .so files
It is non-trivial to set a separate environment variable (STATIC=1) when
descending into the libuEv subdirectory from an autoconf/automake based
project.

It is better to instead simplify the build process and always build both
.a and .so files.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-07-12 23:13:04 +02:00
Joachim Nilsson 8a4e8c4af6 ChangeLog: Fix cut-and-paste error in Markdown link.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-07-02 13:21:21 +02:00
Joachim Nilsson 950015715d Update ChangeLog and bump version for v1.2.1 release!
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-07-02 13:19:32 +02:00
Joachim Nilsson fb6ac1ecac Also install queue.h, dito needed by external plugins.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-06-18 08:43:20 +02:00
Joachim Nilsson 0909decabc Make sure to also install new private.h, unfortunately necessary.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-06-18 08:37:37 +02:00
Joachim Nilsson 3452fbd381 Default to -fPIC, bloats archives slightly, but works for everyone.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-06-18 02:24:14 +02:00
Joachim Nilsson f64561b708 Cleanup: fix install/uninstall of both static and dynamic builds.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-06-18 02:14:15 +02:00
Joachim Nilsson b94023faed Reflow paragraphs to match original line breaks, no change in licensing terms!
While comparing the library layout with libite, I noticed how the
formatting of the license paragraphs in all source files had been
garbled.  This patch restores the orginal line breaks.

Note: Only whitespace changes, no change in licensing terms!

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-06-18 01:36:48 +02:00
Joachim Nilsson 6637804b80 Merge pull request #5 from vonj/master
O_CLOEXEC does not exist in Debian 6 GLIBC/EGLIBC, use EPOLL_CLOEXEC instead.
2015-06-13 19:42:27 +02:00
jakob 361b013da5 O_CLOEXEC does not exist in Debian 6, and apparently EPOLL_CLOEXEC is the correct to use anyway. 2015-06-13 19:32:34 +02:00
Joachim Nilsson 052b08e0b5 Followup to fix indentation, leading tabs, then spaces.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-06-09 15:51:07 +02:00
Joachim Nilsson ca803bb12f Move private data members and methods from uev.h to private.h
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-06-09 15:46:19 +02:00
Joachim Nilsson 6397edc2c4 Update ChangeLog and bump version for v1.2.0 release.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-06-09 13:18:39 +02:00
Joachim Nilsson cbd962c5b6 Fix bench.c so it actually reads from the pipe/socket, update callback API
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-06-09 13:14:49 +02:00
Joachim Nilsson 1f9558059a API change -- Remove first ctx argument and add event mask to callback
There really does not exist a good reason for us sending a `uev_ctx_t *`
pointer as the first argument to event callbacks.  If the callback needs
to reference the context, it can find the ctx pointer in the `uev_t *w`.

This patch removes the first argument from all callbacks and also fixes
a slight bug in that the event loop never returned the actual event that
triggered the callback!

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-06-09 13:10:20 +02:00
Joachim Nilsson 9e7f6865fc uev_timer_set(): Bugfix, call uev_watcher_start() even if not running yet!
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-06-09 13:05:55 +02:00
Joachim Nilsson 3b31079a1c README: Refactor API section in an attempt to make it more accessible.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-03-29 09:31:14 +02:00
Joachim Nilsson 63697e9eda Add support for building static-only libuev.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-03-06 21:33:49 +01:00
Joachim Nilsson ce3930f0cf Update .gitignore, dep files now named *.d
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-03-04 15:55:44 +01:00
29 changed files with 996 additions and 776 deletions

No files matched your search

+27 -5
View File
@@ -1,7 +1,29 @@
*~
*.d
*.o
*.so
*.so.*
*.a
*.la
*.lo
.deps
.libs
compile
config.*
configure
depcomp
install-sh
libtool
ltmain.sh
missing
stamp-h1
Makefile
Makefile.in
aclocal.m4
ar-lib
autom4te.cache
bench bench
test test
.*.d libuev*.tar.*
*.o libuev.pc
*~ !libuev.pc.in
libuev.a
libuev.so.1
+13 -4
View File
@@ -1,7 +1,9 @@
# Travis CI integration -- https://travis-ci.org/troglobit/libuev # Travis CI integration -- https://travis-ci.org/troglobit/libuev
# Defaults to GNU GCC and autotools: ./configure && make && make test
language: c language: c
compiler:
- gcc # We don't need to install packages, use dockerized build, quicker
sudo: false
env: env:
global: global:
@@ -15,7 +17,14 @@ addons:
name: "troglobit/libuev" name: "troglobit/libuev"
description: "libuEv | Simple event loop for Linux" description: "libuEv | Simple event loop for Linux"
notification_email: troglobit@gmail.com notification_email: troglobit@gmail.com
build_command: "make" build_command_prepend: "./autogen && ./configure --enable-examples"
build_command: "make clean all"
branch_pattern: dev branch_pattern: dev
script: make # We don't use configure, so we must define our own build script.
script:
- ./autogen.sh
- ./configure --disable-silent-rules --enable-examples
- make clean
- make -j5
- make test
-1
View File
@@ -1 +0,0 @@
CHANGELOG.md
-133
View File
@@ -1,133 +0,0 @@
Change Log
==========
All notable changes to the project are documented in this file.
[v1.1.0]
--------
Massively improved error handling.
### Changes
- Handle case when user closes a descriptor *before* stopping a watcher.
- Handle `EPOLLHUP` and `EPOLLERR`. Restart `epoll(7)` descriptor and
all watchers when an error count reaches a MAX value -- handles stale
descriptors or cases when kernel does not notice updated descriptors.
- Return error when stopping a watcher fails.
- Update [README.md] with new `uev_*_start()` functions.
- Bump dev version to 1.1 due to the number of significant changes.
### Fixes
- Remove `test.c` from `DISTFILES` in `Makefile`. You need the
comeplete sources to build the examples now. Thanks to @karasz for
the heads up on this and the musl libc issue with missing `queue.h`!
- Fix broken link to [v1.0.5] in this file.
[v1.0.5]
--------
### Changes
- Add `uev_*_start()` functions.
- Add slightly odd `examples/signal.c` example that utilises `fork()`
and causes segfault in child.
- Renamed `main.c` to `uev.c`
- Move examples to `examples/` subdirectory
- Simplify automatic dependency calculation
- Add [TODO.md] for wishlist items
- Add [CHANGELOG.md], attempt to align with http://keepachangelog.com
- Further updates to [README.md]
[v1.0.4] - 2015-01-24
---------------------
Minor documentation and build fixes.
Release mainly targeted for [Finit development](https://github.com/troglobit/finit/).
### Changes
* `test.c` has been simplified/clarified
* Further updates to [README.md]
* Minor update to Makefile, change how build progress is echoed
[v1.0.3] - 2015-01-24
---------------------
This is a very minor release, with a strong focus on documentation.
### Changes
- [README.md], massively updated
- API documentation, updated
- Travis CI integration added, https://travis-ci.org/troglobit/libuev
- Coverity Scan integration, https://scan.coverity.com/projects/3846
- Clang scan-build support added
[v1.0.2] - 2015-01-07
---------------------
### Fixes
- Fix broken `make dist` target in [v1.0.1].
[v1.0.1] - 2015-01-07
---------------------
### Changes
- Cleanup and rewrite of [README.md] after first audit by @vonj
- Added API and example section to [README.md]
- New [joystick.c] example added
- `main.c:uev_run()`: Document mysterious flags parameter
[v1.0.0] - 2013-08-06
---------------------
First release in the new guise and API.
### Changes
- Add support for timers, using `timerfd_*()` and `epoll()` API's
- Add support for signals using `signalfd()` API
- Convert to use BSD `sys/queue.h` API in GLIBC instead of homebrew
linked list implementation
- Massive changes to code structure, API naming
- Reindent to use Linux KNF
- Change library name to libuev
- Lua support removed
- Make sure to state the [MIT license] correctly in all files
- Import [Niels Provos]' `bench.c`, the [libev version]
v0.0.1 - 2012-03-17
-------------------
[Initial announcement] of [libuevent] by [Flemming Madsen] to the Lua
users mailing list.
[UNRELEASED]: https://github.com/troglobit/libuev/compare/v1.1,0...HEAD
[v1.1.0]: https://github.com/troglobit/libuev/compare/v1.0.5...v1.1.0
[v1.0.5]: https://github.com/troglobit/libuev/compare/v1.0.4...v1.0.5
[v1.0.4]: https://github.com/troglobit/libuev/compare/v1.0.3...v1.0.4
[v1.0.3]: https://github.com/troglobit/libuev/compare/v1.0.2...v1.0.3
[v1.0.2]: https://github.com/troglobit/libuev/compare/v1.0.1...v1.0.2
[v1.0.1]: https://github.com/troglobit/libuev/compare/v1.0.0...v1.0.1
[v1.0.0]: https://github.com/troglobit/libuev/compare/v0.0.1...v1.0.0
[TODO.md]: https://github.com/troglobit/libuev/blob/master/TODO.md
[README.md]: https://github.com/troglobit/libuev/blob/master/README.md
[CHANGLOG.md]: https://github.com/troglobit/libuev/blob/master/CHANGELOG.md
[joystick.c]: https://github.com/troglobit/libuev/blob/master/joystick.c
[Niels Provos]: http://en.wikipedia.org/wiki/Niels_Provos
[MIT license]: http://en.wikipedia.org/wiki/MIT_License
[libev version]: http://libev.schmorp.de/bench.c
[libuevent]: https://code.google.com/p/libuevent/
[Flemming Madsen]: http://www.madsensoft.dk
[Initial announcement]: http://lua-users.org/lists/lua-l/2012-03/msg00510.html
<!--
-- Local Variables:
-- mode: markdown
-- End:
-->
+276
View File
@@ -0,0 +1,276 @@
Change Log
==========
All notable changes to the project are documented in this file.
[v1.4.2][] - 2016-06-25
-----------------------
### Changes
- Add range checks for `period` and `timeout` to `uev_timer_init()` and
`uev_timer_set()`. If either on is `< 0` libuEv now return `ERANGE`.
[v1.4.1][] - 2016-04-22
-----------------------
### Changes
- Add some `pkg-config` integration tips for developers using libuEv
with GNU autotools in their projects.
### Fixes
- Add missing `SFD_CLOEXEC` and `TFD_CLOEXEC` to signal and timer file
descriptors. This prevents these file descriptors from "leaking" into
sub-processes of the parent thread. The kernel will atomically close
these descriptors for forked-off children calling the exec*() family
of syscalls.
- Minor coding style fixes and simplification of build scripts.
[v1.4.0][] - 2016-03-22
-----------------------
This release changes the header file namespace, which was silently
introduced in [v1.2.1][]. Apologies for any problems this may cause!
### Changes
- Change namespace for header files: `libuev/` to `uev/`, e.g. using
`pkg-config` your C program must now `#include <uev/uev.h>`
- Support for `EPOLLPRI` events for I/O watchers, thanks to Markus Svilans
- Simplified joystick example
- Updated `README` slightly
[v1.3.1][] - 2016-02-02
-----------------------
### Fixes
- Remove symlinks to Markdown files from GIT
- Distribute and install Markdown files: README.md, etc.
[v1.3.0][] - 2016-01-22
-----------------------
### Changes
- Change to GNU configure and build system
- Default optimization is now `-O2`, not `-Os`, which can be a bit
unpredictable with some cross compiler toolchains. `-O2` is the
tried and tested path, and default in autotools
- Added `-Wextra` to the previous `-W -Wall`, drop `-Werror`
which is supposed to be used by maintainer(s) only.
[v1.2.4][] - 2015-11-23
-----------------------
### Fixes
- Do not allow `VERSION` to be overloaded by build system.
- Make sure we don't inherit `LDFLAGS` from environment.
[v1.2.3][] - 2015-09-17
-----------------------
Very minor release.
### Changes
- [README.md][] updates, mostly cleanup and readability improvements
- `make test` now runs the test case, on behalf of Travis-CI
- Renamed CHANGELOG.md to [ChangeLog.md][]
- Dropped [TODO.md][] from distribution archives, only for devs
### Fixes
- Lots of Markdown syntax fixes in both README and ChangeLog
- Silence annoying warning from newer GNU ar in Ubuntu 15.10
[v1.2.2][] - 2015-08-30
-----------------------
Minor bugfix release.
### Changes
- The `ifdef STATIC` in the Makefile has been removed. Now both the
.a and .so libraries are built. The user may then select what to
install. This is a change for convenience when using libuEv from
a GNU Configure & Build based project.
### Fixes
- Fix odd data ordering issue on Debian Jessie in new `uev_private_t`
- Fix issue #6: Segfault when stopping timer before calling `uev_exit()`
[v1.2.1][] - 2015-07-02
-----------------------
### Changes
- Private data members in `uev.h` have now been moved to a new file
called `private.h`. This will hopefully make it easier to understand
what a user of libuEv is allowed to play around with. Thanks to @vonj
for the discussions around this!
- All builds of libuEv now default to use `-fPIC`, this bloats the code
slightly, but ensures that linking works for all use cases, withouth
introducing unnecessary complexity.
### Fixes
- Fix install/uninstall Makefile recipes so they work for both static
and dynamic builds. Also, make sure to install all required headers.
- Jakob Eriksson noticed that `O_CLOEXEC` does not exist in the Debian 6
EGLIBC, but `EPOLL_CLOEXEC` does, and is also what `epoll_create1()`
should use. Thank you @vonj!
[v1.2.0][] - 2015-06-09
-----------------------
API change in event callbacks and fix timers that never start.
### Changes
- Remove first `uev_ctx_t *` argument in callbacks, incompatible API
change! Please update all your callbacks if you upgrade.
### Fixes
- Fix timers that accidentally broke in [v1.1.0][].
- Fixes to `bench.c`, it now actually listens to the pipe/socket.
[v1.1.0][] - 2015-03-04
-----------------------
Massively improved error handling.
### Changes
- Handle case when user closes a descriptor *before* stopping a watcher.
- Handle `EPOLLHUP` and `EPOLLERR`. Restart `epoll(7)` descriptor and
all watchers when an error count reaches a MAX value -- handles stale
descriptors or cases when kernel does not notice updated descriptors.
- Return error when stopping a watcher fails.
- Update [README.md][] with new `uev_*_start()` functions.
- Bump dev version to 1.1 due to the number of significant changes.
### Fixes
- Remove `test.c` from `DISTFILES` in `Makefile`. You need the
comeplete sources to build the examples now. Thanks to @karasz for
the heads up on this and the musl libc issue with missing `queue.h`!
- Fix broken link to [v1.0.5][] in this file.
[v1.0.5][] - 2015-02-15
-----------------------
### Changes
- Add `uev_*_start()` functions.
- Add slightly odd `examples/signal.c` example that utilises `fork()`
and causes segfault in child.
- Renamed `main.c` to `uev.c`
- Move examples to `examples/` subdirectory
- Simplify automatic dependency calculation
- Add [TODO.md][] for wishlist items
- Add [CHANGELOG.md][ChangeLog.md], to align with http://keepachangelog.com
- Further updates to [README.md][]
[v1.0.4][] - 2015-01-24
-----------------------
Minor documentation and build fixes.
Release mainly targeted for [Finit development](https://github.com/troglobit/finit/).
### Changes
* `test.c` has been simplified/clarified
* Further updates to [README.md][]
* Minor update to Makefile, change how build progress is echoed
[v1.0.3][] - 2015-01-24
-----------------------
This is a very minor release, with a strong focus on documentation.
### Changes
- [README.md][], massively updated
- API documentation, updated
- Travis CI integration added, https://travis-ci.org/troglobit/libuev
- Coverity Scan integration, https://scan.coverity.com/projects/3846
- Clang scan-build support added
[v1.0.2][] - 2015-01-07
-----------------------
### Fixes
- Fix broken `make dist` target in [v1.0.1][].
[v1.0.1][] - 2015-01-07
-----------------------
### Changes
- Cleanup and rewrite of [README.md][] after first audit by @vonj
- Added API and example section to [README.md][]
- New [joystick.c][] example added
- `main.c:uev_run()`: Document mysterious flags parameter
[v1.0.0][] - 2013-08-06
-----------------------
First release in the new guise and API.
### Changes
- Add support for timers, using `timerfd_*()` and `epoll()` API's
- Add support for signals using `signalfd()` API
- Convert to use BSD `sys/queue.h` API in GLIBC instead of homebrew
linked list implementation
- Massive changes to code structure, API naming
- Reindent to use Linux KNF
- Change library name to libuev
- Lua support removed
- Make sure to state the [MIT license][] correctly in all files
- Import [Niels Provos][]' `bench.c`, the [libev version][]
v0.0.1 - 2012-03-17
-------------------
[Initial announcement][] of [libuevent][] by [Flemming Madsen][] to the
Lua users mailing list.
[UNRELEASED]: https://github.com/troglobit/libuev/compare/v1.4.2...HEAD
[v1.4.2]: https://github.com/troglobit/libuev/compare/v1.4.1...v1.4.2
[v1.4.1]: https://github.com/troglobit/libuev/compare/v1.4.0...v1.4.1
[v1.4.0]: https://github.com/troglobit/libuev/compare/v1.3.1...v1.4.0
[v1.3.1]: https://github.com/troglobit/libuev/compare/v1.3.0...v1.3.1
[v1.3.0]: https://github.com/troglobit/libuev/compare/v1.2.3...v1.3.0
[v1.2.3]: https://github.com/troglobit/libuev/compare/v1.2.2...v1.2.3
[v1.2.2]: https://github.com/troglobit/libuev/compare/v1.2.1...v1.2.2
[v1.2.1]: https://github.com/troglobit/libuev/compare/v1.2.0...v1.2.1
[v1.2.0]: https://github.com/troglobit/libuev/compare/v1.1.0...v1.2.0
[v1.1.0]: https://github.com/troglobit/libuev/compare/v1.0.5...v1.1.0
[v1.0.5]: https://github.com/troglobit/libuev/compare/v1.0.4...v1.0.5
[v1.0.4]: https://github.com/troglobit/libuev/compare/v1.0.3...v1.0.4
[v1.0.3]: https://github.com/troglobit/libuev/compare/v1.0.2...v1.0.3
[v1.0.2]: https://github.com/troglobit/libuev/compare/v1.0.1...v1.0.2
[v1.0.1]: https://github.com/troglobit/libuev/compare/v1.0.0...v1.0.1
[v1.0.0]: https://github.com/troglobit/libuev/compare/v0.0.1...v1.0.0
[TODO.md]: https://github.com/troglobit/libuev/blob/master/TODO.md
[README.md]: https://github.com/troglobit/libuev/blob/master/README.md
[ChangeLog.md]: https://github.com/troglobit/libuev/blob/master/ChangeLog.md
[joystick.c]: https://github.com/troglobit/libuev/blob/master/joystick.c
[Niels Provos]: http://en.wikipedia.org/wiki/Niels_Provos
[MIT license]: http://en.wikipedia.org/wiki/MIT_License
[libev version]: http://libev.schmorp.de/bench.c
[libuevent]: https://code.google.com/p/libuevent/
[Flemming Madsen]: http://www.madsensoft.dk
[Initial announcement]: http://lua-users.org/lists/lua-l/2012-03/msg00510.html
<!--
-- Local Variables:
-- mode: markdown
-- End:
-->
+1 -1
View File
@@ -1,5 +1,5 @@
Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk> Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com> Copyright (c) 2013-2016 Joachim Nilsson <troglobit()gmail!com>
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
-128
View File
@@ -1,128 +0,0 @@
# libuEv main build file
#
# Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
# Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com>
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
.PHONY: all test clean joystick test examples
#VERSION = $(shell git tag -l | tail -1)
VERSION ?= 1.1.0
NAME = libuev
PKG = $(NAME)-$(VERSION)
ARCHIVE = $(PKG).tar.xz
CC ?= $(CROSS)gcc
AR ?= $(CROSS)ar
STRIP ?= $(CROSS)strip
CFLAGS += -fPIC -Os
CPPFLAGS += -W -Wall -Werror
ARFLAGS = crus
JUNK = *~ *.bak *.map .*.d DEADJOE *.gdb *.elf core core.* *.html
MAKEFLAGS = --no-print-directory
ROOTDIR ?= $(shell pwd)
LIBNAME = $(NAME)
prefix ?= /usr/local
libdir ?= $(prefix)/lib
datadir ?= $(prefix)/share/doc/$(LIBNAME)
incdir ?= $(prefix)/include
DISTFILES = README CHANGELOG TODO LICENSE
HEADER = uev.h
OBJS := uev.o io.o timer.o signal.o
SRCS := $(OBJS:.o=.c)
DEPS := $(SRCS:.c=.d)
VER = 1
SOLIB = $(LIBNAME).so.$(VER)
SYMLIB = $(LIBNAME).so
STATICLIB = $(LIBNAME).a
TARGET = $(STATICLIB) $(SOLIB)
export STATICLIB JUNK ROOTDIR CFLAGS CPPFLAGS
# This magic trick looks like a comment, but works on BSD PMake
#include <rules.mk>
include rules.mk
# Build rules
all: $(TARGET)
$(SOLIB): Makefile $(OBJS)
@printf " LINK $@\n"
@$(CC) $(LDFLAGS) -shared -Wl,-soname=$@ -o $@ $(OBJS)
$(STATICLIB): Makefile $(OBJS)
@printf " ARCHIVE $@\n"
@$(AR) $(ARFLAGS) $@ $(OBJS)
install: strip
@install -d $(DESTDIR)$(libdir)
@install $(SOLIB) $(DESTDIR)$(prefix)/lib/$(SOLIB)
@install $(STATICLIB) $(DESTDIR)$(prefix)/lib/$(STATICLIB)
@ln -sf $(SOLIB) $(DESTDIR)$(prefix)/lib/$(SYMLIB)
@install -d $(DESTDIR)$(incdir)
@install -m 0644 $(HEADER) $(DESTDIR)$(incdir)/$(HEADER)
@install -d $(DESTDIR)$(datadir)
@for file in $(DISTFILES); do \
install -m 0644 $$file $(DESTDIR)$(datadir)/$$file; \
done
uninstall:
-@$(RM) -r $(DESTDIR)$(datadir)
-@$(RM) -r $(DESTDIR)$(incdir)
-@$(RM) $(DESTDIR)$(prefix)/lib/$(LIBNAME)*
strip: $(TARGET)
@printf " STRIP %s\n" $(TARGET)
@$(STRIP) --strip-unneeded $(TARGET)
@size $(TARGET)
bench: Makefile bench.o $(STATICLIB)
@printf " BENCH %s\n" $(STATICLIB)
@$(CC) $(CPPFLAGS) -g -o bench bench.c $(STATICLIB) && ./bench
examples: all
@$(MAKE) -C examples
test joystick:
@$(MAKE) -C examples $@
# Runs Clang scan-build on the whole tree
check: clean
@scan-build $(MAKE) all
clean:
-@$(MAKE) -C examples $@
-@$(RM) $(TARGET) *.o test joystick bench
distclean: clean
-@$(MAKE) -C examples $@
-@$(RM) $(DEPS) $(JUNK)
dist:
@echo "Building .xz tarball of $(PKG) in parent dir..."
git archive --format=tar --prefix=$(PKG)/ v$(VERSION) | xz >../$(ARCHIVE)
@(cd ..; md5sum $(ARCHIVE) | tee $(ARCHIVE).md5)
# Include automatically generated rules
-include $(DEPS)
+69
View File
@@ -0,0 +1,69 @@
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
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:1:0
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libuev.pc
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
## Generate MD5 checksum file
MD5 = md5sum
md5-dist:
@for file in $(DIST_ARCHIVES); do \
$(MD5) $$file > $$file.md5; \
done
## Check if tagged in git
release-hook:
if [ ! `git tag | grep $(PACKAGE_VERSION)` ]; then \
echo; \
printf "\e[1m\e[41mCannot find release tag $(PACKAGE_VERSION)\e[0m\n"; \
printf "\e[1m\e[5mDo release anyway?\e[0m "; read yorn; \
if [ "$$yorn" != "y" -a "$$yorn" != "Y" ]; then \
printf "OK, aborting release.\n"; \
exit 1; \
fi; \
echo; \
else \
echo; \
printf "\e[1m\e[42mFound GIT release tag $(PACKAGE_VERSION)\e[0m\n"; \
printf "\e[1m\e[44m>>Remember to push tags!\e[0m\n"; \
echo; \
fi
## Target to run when building a release
release: dist release-hook md5-dist
@for file in $(DIST_ARCHIVES); do \
printf "$$file \tDistribution tarball\n"; \
printf "$$file.md5\t"; cat $$file.md5 | cut -f1 -d' '; \
mv $$file* ../; \
done
-1
View File
@@ -1 +0,0 @@
README.md
+295 -209
View File
@@ -1,21 +1,296 @@
libuEv | Simple event loop for Linux libuEv | Simple event loop for Linux
==================================== ====================================
[![Travis Status]][Travis] [![Coverity Status]][Coverity Scan] [![Travis Status][]][Travis] [![Coverity Status][]][Coverity Scan]
Table of Contents
-----------------
* [Introduction](#introduction) * [Introduction](#introduction)
* [API](#api) * [API](#api)
* [Example](#example) * [Create an Event Context](#create-an-event-context)
* [Register an Event Watcher](#register-an-event-watcher)
* [Start Event Loop](#start-event-loop)
* [Summary](#summary)
* [Using -luev](#using--luev)
* [Joystick Example](#joystick-example)
* [Build & Install](#build--install) * [Build & Install](#build--install)
* [Background](#background)
* [Origin & References](#origin--references) * [Origin & References](#origin--references)
Introduction Introduction
------------ ------------
[libuEv][] is a simple event loop in the style of the more established
[libevent][1], [libev][2] and the venerable [Xt(3)][3] event loop. The
*u* (micro) in the name refers to both the small feature set and the
small size overhead impact of the library.
Experienced developers may appreciate that [libuEv][] is built on top of
modern Linux APIs: epoll, timerfd and signalfd. Note however, a certain
amount of care is needed when dealing with APIs that employ signalfd.
For details, see [this article][4] at [lwn.net](http://lwn.net).
> “Event driven software improves concurrency” -- [Dave Zarzycki, Apple][]
API
---
The C interface to [libuEv][] is listed in `uev.h`. It handles three
different types of events: I/O (files, sockets, message queues, etc.),
timers, and signals. With a slight caveat on signals detailed below
in the [Summary](#summary).
```C
/*
* Callback example, arg is passed from watcher's *_init()
* w->fd holds the file descriptor, events is set by libuEv
* to indicate if any of UEV_READ and/or UEV_WRITE is ready.
*/
void callback (uev_t *w, void *arg, int events);
/* Event loop: Notice the use of flags! */
int uev_init (uev_ctx_t *ctx);
int uev_exit (uev_ctx_t *ctx);
int uev_run (uev_ctx_t *ctx, int flags); /* UEV_NONE, UEV_ONCE, and/or UEV_NONBLOCK */
/* I/O watcher: fd is non-blocking, events is UEV_READ and/or UEV_WRITE */
int uev_io_init (uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int fd, int events);
int uev_io_set (uev_t *w, int fd, int events);
int uev_io_start (uev_t *w);
int uev_io_stop (uev_t *w);
/* Timer watcher: timeout and period in milliseconds */
int uev_timer_init (uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int timeout, int period);
int uev_timer_set (uev_t *w, int timeout, int period); /* Change timeout or period */
int uev_timer_start (uev_t *w); /* Restart a stopped timer */
int uev_timer_stop (uev_t *w); /* Stop a timer */
/* Signal watcher: signo is the signal to wait for, e.g., SIGTERM */
int uev_signal_init (uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int signo);
int uev_signal_set (uev_t *w, int signo); /* Change signal to wait for */
int uev_signal_start(uev_t *w); /* Restart a stopped signal watcher */
int uev_signal_stop (uev_t *w); /* Stop signal watcher */
```
### Create an Event Context
To monitor events the developer first creates an *event context*, this
is achieved by calling `uev_init()` with a pointer to a (thread) local
`uev_ctx_t` variable.
```C
uev_ctx_t ctx;
uev_init(&ctx);
```
### Register an Event Watcher
For each event to monitor, be it a signal, timer or file descriptor, a
*watcher* must be registered with the event context. The watcher, an
`uev_t`, is registered by calling the event type's `_init()` function
with the `uev_ctx_t` context, the callback, and an optional argument.
Here is a signal example:
```C
void cleanup_exit(uev_t *w, void *arg, int events)
{
/* Graceful exit, with optional cleanup ... */
uev_exit(w->ctx);
}
int main(void)
{
uev_t sigterm_watcher;
.
.
.
uev_signal_init(&ctx, &sigterm_watcher, cleanup_exit, NULL, SIGTERM);
.
.
.
}
```
### Start Event Loop
When all watchers are registered, call the *event loop* with `uev_run()`
and the argument to the event context. The `flags` parameter can be
used to integrate [libuEv][] into another event loop.
In this example we set `flags` to none:
```C
uev_run(&ctx, UEV_NONE);
```
With `flags` set to `UEV_ONCE` the event loop returns as soon as it has
served the first event. If `flags` is set to `UEV_ONCE | UEV_NONBLOCK`
the event loop returns immediately if no event is available.
**Note:** libuEv handles many types of errors, stream close, or peer
shutdowns internally, but also lets the callback run. This is useful
for stateful connections to be able to detect EOF.
### Summary
1. Set up an event context with `uev_init()`
2. Register event callbacks with the event context using
`uev_io_init()`, `uev_signal_init()` or `uev_timer_init()`
3. Start the event loop with `uev_run()`
4. Exit the event loop with `uev_exit()`, possibly from a callback
**Note 1:** Make sure to use non-blocking stream I/O! Most hard to find
bugs in event driven applications are due to sockets and files being
opened in blocking mode. Be careful out there!
**Note 2:** When closing a descriptor or socket, make sure to first stop
your watcher, if possible. This will help prevent any nasty side
effects on your program.
**Note 3:** As mentioned above, a certain amount of care is needed when
dealing with signalfd. If your application use `system()` you replace
that with `fork()`, and then in the child, unblock all signals blocked
by your parent process, before you run `exec()`. This because Linux
does not unblock signals for your children, and neither does most (all?)
C-libraries. See the [finit][6] project's implementation of `run()` for
an example of this.
Using -luev
-----------
LibuEv is by default installed as a library with a few header files, you
should only ever need to include one:
#include <uev/uev.h>
The output from the `pkg-config` tool holds no surprises:
$ pkg-config --libs --static --cflags libuev
-I/usr/local/include -L/usr/local/lib -luev
The prefix path `/usr/local/` shown here is only the default. Use the
`configure` script to select a different prefix when installing libuEv.
For GNU autotools based projects, use the following in `configure.ac`:
# Check for required libraries
PKG_CHECK_MODULES([uev], [libuev >= 1.4.0])
and in your `Makefile.am`:
proggy_CFLAGS = $(uev_CFLAGS)
proggy_LDADD = $(uev_LIBS)
Joystick Example
----------------
Here follows a very brief example to illustrate how one can use libuEv
to act upon joystick input.
```C
#include <err.h>
#include <errno.h>
#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <uev/uev.h>
struct js_event {
uint32_t time; /* event timestamp in milliseconds */
int16_t value; /* value */
uint8_t type; /* event type */
uint8_t number; /* axis/button number */
} e;
static void joystick_cb(uev_t *w, void *arg, int events)
{
read(w->fd, &e, sizeof(e));
switch (e.type) {
case 1:
printf("Button %d %s\n", e.number, e.value ? "pressed" : "released");
break;
case 2:
printf("Joystick axis %d moved, value %d!\n", e.number, e.value);
break;
}
}
int main(void)
{
int fd;
uev_t watcher;
uev_ctx_t ctx;
fd = open("/dev/input/js1", O_RDONLY, O_NONBLOCK);
if (fd < 0)
errx(errno, "Cannot find a joystick attached.");
uev_init(&ctx);
uev_io_init(&ctx, &watcher, joystick_cb, NULL, fd, UEV_READ);
puts("Starting, press Ctrl-C to exit.");
return uev_run(&ctx, 0);
}
```
To build the example, follow installation instructions below, then save
the code as `joystick.c` and call GCC
gcc `pkg-config --libs --static --cflags libuev` -o joystick joystick.c
Alternatively, call the `Makefile` with <kbd>make joystick</kbd> from
the unpacked [libuEv][] distribution.
More complete and relevant example uses of [libuEv][] is the FTP/TFTP
server [uftpd][5], and the Linux `/sbin/init` replacement [finit][6].
Both successfully employ [libuEv][].
Also see the `bench.c` program (<kbd>make bench</kbd> from within the
library) for [reference benchmarks][7] against [libevent][1] and
[libev][2].
Build & Install
---------------
The library is built for and developed on GNU/Linux systems, patches to
support *BSD and its [kqueue][] interface are most welcome.
libuEv use the GNU configure and build system. To try out the bundled
examples, use the `--enable-examples` switch to the `configure` script.
./configure
make all
make test
make install
The resulting .so file is ~14 kiB (<kbd>make install-strip</kbd>).
Background
----------
> “Why an event loop, why not use threads?” > “Why an event loop, why not use threads?”
With the advent of light-weight processes (threads) programmers these With the advent of light-weight processes (threads) programmers these
@@ -44,211 +319,17 @@ core, even though they run Linux, with multiple threads a program may
actually run slower! Always profile your program, and if possible, test actually run slower! Always profile your program, and if possible, test
it on different architectures. it on different architectures.
[libuEv] is a simple event loop in the style of the more established
[libevent][1], [libev][2] and the venerable [Xt(3)][3] event loop. The
*u* (micro) in the name refers to both the small feature set and the
small size overhead impact of the library. The primary target of
[libuEv] is a modern Linux system.
Experienced developers may appreciate that [libuEv] is built on top of
modern Linux APIs: epoll, timerfd and signalfd. Note, a certain amount
of care is needed when dealing with APIs that employ signalfd. For
details, see [this article][4] at [lwn.net](http://lwn.net).
> “Event driven software improves concurrency” -- [Dave Zarzycki, Apple]
API
---
Here is the interface to [libuEv]. It handles three different types of
events: I/O (files, sockets, message queues, etc.), timers, and signals.
```C
/* Callback example, arg is passed from watcher's *_init()
* w->fd holds the file descriptor, events is set by libuEv
* to indicate if any of UEV_READ and/or UEV_WRITE is ready.
*/
void callback (uev_ctx_t *ctx, uev_t *w, void *arg, int events);
/* Event loop functions, notice use of flags! */
int uev_init (uev_ctx_t *ctx);
int uev_exit (uev_ctx_t *ctx);
int uev_run (uev_ctx_t *ctx, int flags); /* UEV_NONE, UEV_ONCE, and/or UEV_NONBLOCK */
/* I/O watcher: fd is non-blocking, events is UEV_READ and/or UEV_WRITE */
int uev_io_init (uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int fd, int events);
int uev_io_set (uev_t *w, int fd, int events);
int uev_io_start (uev_t *w);
int uev_io_stop (uev_t *w);
/* Timer watcher: timeout and period in milliseconds */
int uev_timer_init (uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int timeout, int period);
int uev_timer_set (uev_t *w, int timeout, int period); /* Change timeout or period */
int uev_timer_start (uev_t *w); /* Restart a stopped timer */
int uev_timer_stop (uev_t *w); /* Stop a timer */
/* Signal watcher: signo is the signal to wait for, e.g., SIGTERM */
int uev_signal_init (uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int signo);
int uev_signal_set (uev_t *w, int signo); /* Change signal to wait for */
int uev_signal_start(uev_t *w); /* Restart a stopped signal watcher */
int uev_signal_stop (uev_t *w); /* Stop signal watcher */
```
To be able to set up callbacks to events the developer first need to
create an *event context*, achieved by calling `uev_init()` with a
pointer to a local `uev_ctx_t` variable.
Events are monitored by watchers in [libuEv]. A watcher is nothing more
than a mechnism that polls a file descriptor. Register a watcher with a
callback to the event context by passing the `uev_ctx_t` variable, along
with an `uev_t` variable to each event's `_init()` function.
When all watchers are registered call the event loop with `uev_run()`
and the argument to the event context. The `flags` parameter is slightly
mysterious, but can be used to integrate [libuEv] into another event loop.
With `flags` set to `UEV_ONCE` the event loop returns after having
served the first event. If `flags` is set to `UEV_ONCE | UEV_NONBLOCK`
the event loop returns immediately if no event is available.
In the case of errors, stream close, or peer shutdown libuEv handles
much internally, but also lets the callback run. This is useful for
stateful connections to be able to detect EOF.
Summary:
1. Prepare an event context with `uev_init()`
2. Register event callbacks with `uev_io_init()`, `uev_signal_init()`
or `uev_timer_init()`
3. Enter the event loop with `uev_run()`
4. Leave the event loop with `uev_exit()`, possibly from a callback
**Note 1:** Make sure to use non-blocking stream I/O! Most hard to find
bugs in event driven applications are due to sockets and files being
opened in blocking mode. Be careful out there!
**Note 2:** When closing a descriptor or socket, make sure to first stop
your watcher, if possible. This will help prevent any nasty side
effects on your program.
**Note 3:** As mentioned above, a certain amount of care is needed when
dealing with signalfd. This means that if your application, for
instance, uses `system()` you must redesign that to use `fork()`, and
then in the child, unblock all signals blocked by your parent process,
before you run `exec()`. This because Linux does not unblock signals
for your children, and neither does most (all?) C-libraries. An example
of this, from [finit][6], implementing `run()` as a better replacement
to `system()`, which sucks anyawy :)
Example
-------
Here follows a very brief example to illustrate how one can use [libuEv]
to act upon joystick input.
```C
#include <err.h>
#include <errno.h>
#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include "uev.h"
struct js_event {
uint32_t time; /* event timestamp in milliseconds */
int16_t value; /* value */
uint8_t type; /* event type */
uint8_t number; /* axis/button number */
} e;
static void joystick_cb(uev_ctx_t *ctx, uev_t *w, void *arg, int events)
{
read (w->fd, &e, sizeof(e));
switch (e.type) {
case 1:
if (e.value) printf("Button %d pressed\n", e.number);
else printf("Button %d released\n", e.number);
break;
case 2:
printf("Joystick axis %d moved, value %d!\n", e.number, e.value);
break;
}
}
int main(void)
{
int fd = open("/dev/input/js1", O_RDONLY, O_NONBLOCK);
uev_t js1_watcher;
uev_ctx_t ctx;
if (fd < 0)
errx(errno, "Cannot find a joystick attached.");
uev_init(&ctx);
uev_io_init(&ctx, &js1_watcher, joystick_cb, NULL, fd, UEV_READ);
puts("Starting, press Ctrl-C to exit.");
return uev_run(&ctx, 0);
}
```
To compile the program, save the code as `joystick.c` and call GCC with
`gcc -o joystick joystick.c io.c timer.c signal.c main.c` from this
directory, skips using a Makefile altogether. Alternatively, call the
`Makefile` with <kbd>make joystick</kbd> from this directory.
More complete and relevant example uses of [libuEv] is the TFTP/FTP
server [uftpd][5], and the Linux `/sbin/init` replacement [finit][6].
Both use [libuEv] as a GIT submodule.
Also, see the `bench.c` program (<kbd>make bench</kbd> from within the
library) for [reference benchmarks][7] against libevent and libev.
Build & Install
---------------
The library is built for and developed on GNU/Linux systems, so it may
use GCC and GNU Make specific extensions here and there. This is not on
purpose and patches to correct this are most welcome. Particularly
patches to support *BSD and its kqueue interface.
* <kbd>make all</kbd>: The library
* <kbd>make test</kbd>: Test and showcase
* <kbd>make install</kbd>: Honors `$prefix` and `$DESTDIR` environment variables
Size of [libuEv]:
$ make strip
CC main.o
CC io.o
CC timer.o
CC signal.o
ARCHIVE libuev.a
LINK libuev.so.1
STRIP libuev.a
STRIP libuev.so.1
text data bss dec hex filename
1177 0 0 1177 499 main.o (ex libuev.a)
308 0 0 308 134 io.o (ex libuev.a)
682 0 0 682 2aa timer.o (ex libuev.a)
563 0 0 563 233 signal.o (ex libuev.a)
6306 768 8 7082 1baa libuev.so.1
Origin & References Origin & References
-------------------- -------------------
[libuEv] was originally based on [LibUEvent][8] by [Flemming Madsen] but [libuEv][] was originally based on [LibUEvent][8] by [Flemming Madsen][]
has been completely rewritten with a much clearer API. Now more similar but has been completely rewritten with a much clearer API. Now more
to the famous [libev][2] by [Mark Lehmann]. Another small event library similar to the famous [libev][2] by [Mark Lehmann][]. Another small
used for inspiration is the very small [Picoev][9] by [Oku Kazuho]. event library used for inspiration is the very small [Picoev][9] by
[Oku Kazuho][].
[libuEv][] is developed and maintained by [Joachim Nilsson][].
[1]: http://libevent.org [1]: http://libevent.org
[2]: http://software.schmorp.de/pkg/libev.html [2]: http://software.schmorp.de/pkg/libev.html
@@ -263,11 +344,16 @@ used for inspiration is the very small [Picoev][9] by [Oku Kazuho].
[Travis Status]: https://travis-ci.org/troglobit/libuev.png?branch=master [Travis Status]: https://travis-ci.org/troglobit/libuev.png?branch=master
[Coverity Scan]: https://scan.coverity.com/projects/3846 [Coverity Scan]: https://scan.coverity.com/projects/3846
[Coverity Status]: https://scan.coverity.com/projects/3846/badge.svg [Coverity Status]: https://scan.coverity.com/projects/3846/badge.svg
[LibuEV]: https://github.com/troglobit/libuev [LibuEv]: https://github.com/troglobit/libuev
[kqueue]: https://github.com/mheily/libkqueue
[Oku Kazuho]: https://github.com/kazuho [Oku Kazuho]: https://github.com/kazuho
[Mark Lehmann]: http://software.schmorp.de [Mark Lehmann]: http://software.schmorp.de
[Joachim Nilsson]: http://troglobit.com [Joachim Nilsson]: http://troglobit.com
[Flemming Madsen]: http://www.madsensoft.dk [Flemming Madsen]: http://www.madsensoft.dk
[Dave Zarzycki, Apple]: http://www.youtube.com/watch?v=cD_s6Fjdri8 [Dave Zarzycki, Apple]: http://www.youtube.com/watch?v=cD_s6Fjdri8
[libuEv] is developed and maintained by [Joachim Nilsson] <!--
-- Local Variables:
-- mode: markdown
-- End:
-->
-1
View File
@@ -1 +0,0 @@
TODO.md
+3 -1
View File
@@ -1,5 +1,7 @@
LibuEv TODO LibuEv TODO
=========== ===========
* Make port to *BSD kqueue API, http://en.wikipedia.org/wiki/Kqueue * Port to *BSD kqueue API, http://en.wikipedia.org/wiki/Kqueue
Also in UNIX Network Progamming, by W. Richard Stevens 3rd ed.
* Restore Lua bindings now that libuEv itself has stabilized
Executable
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
autoreconf -W portability -visfm
+6 -6
View File
@@ -70,7 +70,7 @@ static int *pipes;
static uev_t *evio; static uev_t *evio;
static uev_t *evto; static uev_t *evto;
static void read_cb(uev_ctx_t *UNUSED(ctx), uev_t *w, void *arg, int UNUSED(events)) static void read_cb(uev_t *w, void *arg, int UNUSED(events))
{ {
int idx, widx; int idx, widx;
u_char ch; u_char ch;
@@ -96,7 +96,7 @@ static void read_cb(uev_ctx_t *UNUSED(ctx), uev_t *w, void *arg, int UNUSED(even
} }
} }
static void timer_cb(uev_ctx_t UNUSED(*ctx), uev_t UNUSED(*w), void UNUSED(*arg), int UNUSED(events)) static void timer_cb(uev_t UNUSED(*w), void UNUSED(*arg), int UNUSED(events))
{ {
/* nop */ /* nop */
} }
@@ -208,16 +208,17 @@ int main(int argc, char **argv)
if (timers) if (timers)
uev_timer_init(&ctx, &evto[i], timer_cb, NULL, 0, 0); uev_timer_init(&ctx, &evto[i], timer_cb, NULL, 0, 0);
args[i].index = i; args[i].index = i;
uev_io_init(&ctx, &evio[i], read_cb, &args[i], -1, UEV_READ);
#ifdef USE_PIPES #ifdef USE_PIPES
if (pipe(cp) == -1) { if (pipe2(cp, O_NONBLOCK) == -1) {
#else #else
if (socketpair(AF_UNIX, SOCK_STREAM, 0, cp) == -1) { if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0, cp) == -1) {
#endif #endif
perror("pipe"); perror("pipe");
exit(1); exit(1);
} }
uev_io_init(&ctx, &evio[i], read_cb, &args[i], cp[0], UEV_READ);
} }
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
@@ -228,7 +229,6 @@ int main(int argc, char **argv)
/** /**
* Local Variables: * Local Variables:
* version-control: t
* indent-tabs-mode: t * indent-tabs-mode: t
* c-file-style: "linux" * c-file-style: "linux"
* End: * End:
+19
View File
@@ -0,0 +1,19 @@
AC_INIT(libuev, 1.4.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_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
-54
View File
@@ -1,54 +0,0 @@
# libuEv examples
#
# Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
# Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com>
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
.PHONY: all clean
TARGET = signal test joystick
OBJS := $(addsuffix .o, $(TARGET))
SRCS := $(OBJS:.o=.c)
DEPS := $(SRCS:.c=.d)
CPPFLAGS += -I../
LDFLAGS := -L../
LDLIBS := ../$(STATICLIB)
# This magic trick looks like a comment, but works on BSD PMake
#include <../rules.mk>
include ../rules.mk
all: $(TARGET)
signal: signal.o
test: test.o
joystick: joystick.o
clean:
-@$(RM) $(TARGET) *.o
distclean: clean
-@$(RM) $(DEPS) $(JUNK)
# Include automatically generated rules
-include $(DEPS)
+5
View File
@@ -0,0 +1,5 @@
noinst_PROGRAMS = signal test joystick
AM_CPPFLAGS = -I$(top_srcdir)
AM_LDFLAGS = -L$(top_srcdir)
LIBS = $(LTLIBINTL)
LDADD = $(top_srcdir)/libuev.la
+23 -27
View File
@@ -1,25 +1,24 @@
/* Simple example of how to use libuEv with Linux joystick API /* Simple example of how to use libuEv with Linux joystick API
* *
* Copyright (c) 2014-2015 Joachim Nilsson <troglobit()gmail!com> * Copyright (c) 2014-2016 Joachim Nilsson <troglobit()gmail!com>
* *
* Permission is hereby granted, free of charge, to any person obtaining * Permission is hereby granted, free of charge, to any person obtaining a copy
* a copy of this software and associated documentation files (the * of this software and associated documentation files (the "Software"), to deal
* "Software"), to deal in the Software without restriction, including * in the Software without restriction, including without limitation the rights
* without limitation the rights to use, copy, modify, merge, publish, * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* distribute, sublicense, and/or sell copies of the Software, and to * copies of the Software, and to permit persons to whom the Software is
* permit persons to whom the Software is furnished to do so, subject to * furnished to do so, subject to the following conditions:
* the following conditions:
* *
* The above copyright notice and this permission notice shall be * The above copyright notice and this permission notice shall be included in
* included in all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <err.h> #include <err.h>
@@ -31,8 +30,6 @@
#include "uev.h" #include "uev.h"
#define UNUSED(arg) arg __attribute__ ((unused))
struct js_event { struct js_event {
uint32_t time; /* event timestamp in milliseconds */ uint32_t time; /* event timestamp in milliseconds */
int16_t value; /* value */ int16_t value; /* value */
@@ -40,15 +37,14 @@ struct js_event {
uint8_t number; /* axis/button number */ uint8_t number; /* axis/button number */
} e; } e;
static void joystick_cb(uev_ctx_t *UNUSED(ctx), uev_t *w, void *UNUSED(arg), int UNUSED(events)) static void joystick_cb(uev_t *w, void *arg, int events)
{ {
if (read (w->fd, &e, sizeof(e)) < 0) if (read(w->fd, &e, sizeof(e)) < 0)
errx(errno, "Failed reading joystick event"); errx(errno, "Failed reading joystick event");
switch (e.type) { switch (e.type) {
case 1: case 1:
if (e.value) printf("Button %d pressed\n", e.number); printf("Button %d %s\n", e.number, e.value ? "pressed" : "released");
else printf("Button %d released\n", e.number);
break; break;
case 2: case 2:
@@ -59,10 +55,11 @@ static void joystick_cb(uev_ctx_t *UNUSED(ctx), uev_t *w, void *UNUSED(arg), int
int main(void) int main(void)
{ {
int fd = open("/dev/input/js1", O_RDONLY, O_NONBLOCK); int fd;
uev_t js1_watcher; uev_t js1_watcher;
uev_ctx_t ctx; uev_ctx_t ctx;
fd = open("/dev/input/js1", O_RDONLY, O_NONBLOCK);
if (fd < 0) if (fd < 0)
errx(errno, "Cannot find a joystick attached."); errx(errno, "Cannot find a joystick attached.");
@@ -76,8 +73,7 @@ int main(void)
/** /**
* Local Variables: * Local Variables:
* compile-command: "gcc -o joystick joystick.c io.o timer.o signal.o main.o" * compile-command: "make joystick"
* version-control: t
* indent-tabs-mode: t * indent-tabs-mode: t
* c-file-style: "linux" * c-file-style: "linux"
* End: * End:
+25 -23
View File
@@ -2,24 +2,23 @@
* *
* Copyright (c) 2015 Joachim Nilsson <troglobit@gmail.com> * Copyright (c) 2015 Joachim Nilsson <troglobit@gmail.com>
* *
* Permission is hereby granted, free of charge, to any person obtaining * Permission is hereby granted, free of charge, to any person obtaining a copy
* a copy of this software and associated documentation files (the * of this software and associated documentation files (the "Software"), to deal
* "Software"), to deal in the Software without restriction, including * in the Software without restriction, including without limitation the rights
* without limitation the rights to use, copy, modify, merge, publish, * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* distribute, sublicense, and/or sell copies of the Software, and to * copies of the Software, and to permit persons to whom the Software is
* permit persons to whom the Software is furnished to do so, subject to * furnished to do so, subject to the following conditions:
* the following conditions:
* *
* The above copyright notice and this permission notice shall be * The above copyright notice and this permission notice shall be included in
* included in all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * THE SOFTWARE.
*/ */
#define _GNU_SOURCE #define _GNU_SOURCE
@@ -69,13 +68,13 @@ static int callback(arg_t *arg, int event, void *foo)
return 42; return 42;
} }
static void sigsegv_cb(uev_ctx_t *UNUSED(ctx), uev_t *UNUSED(w), void *UNUSED(arg), int UNUSED(events)) static void sigsegv_cb(uev_t *UNUSED(w), void *UNUSED(arg), int UNUSED(events))
{ {
warnx("PID %d caused segfault.", getpid()); warnx("PID %d caused segfault.", getpid());
exit(-1); exit(-1);
} }
static void sigchld_cb(uev_ctx_t *UNUSED(ctx), uev_t *UNUSED(w), void *UNUSED(arg), int UNUSED(events)) static void sigchld_cb(uev_t *UNUSED(w), void *UNUSED(arg), int UNUSED(events))
{ {
pid_t pid = waitpid(-1, NULL, WNOHANG); pid_t pid = waitpid(-1, NULL, WNOHANG);
@@ -83,7 +82,7 @@ static void sigchld_cb(uev_ctx_t *UNUSED(ctx), uev_t *UNUSED(w), void *UNUSED(ar
warnx("PID %d exited, bye.", pid); warnx("PID %d exited, bye.", pid);
} }
static void work_cb(uev_ctx_t *UNUSED(ctx), uev_t *UNUSED(w), void *arg, int UNUSED(events)) static void work_cb(uev_t *UNUSED(w), void *arg, int UNUSED(events))
{ {
int status = 0; int status = 0;
pid_t pid; pid_t pid;
@@ -102,15 +101,17 @@ static void work_cb(uev_ctx_t *UNUSED(ctx), uev_t *UNUSED(w), void *arg, int UNU
if (WIFEXITED(status)) if (WIFEXITED(status))
printf("Child exited normally => %d\n", WEXITSTATUS(status)); printf("Child exited normally => %d\n", WEXITSTATUS(status));
else if (WCOREDUMP(status)) else if (WCOREDUMP(status))
printf("Child crashed!\n"); printf("Child crashed! %s\n", DO_SEGFAULT
? "As expected, everything is OK."
: "This should not happen!");
else else
printf("Child did not exit normally!\n"); printf("Child did not exit normally!\n");
} }
static void exit_cb(uev_ctx_t *ctx, uev_t *UNUSED(w), void *UNUSED(arg), int UNUSED(events)) static void exit_cb(uev_t *w, void *UNUSED(arg), int UNUSED(events))
{ {
printf("Process deadline reached, exiting!\n"); printf("Process deadline reached, exiting!\n");
uev_exit(ctx); uev_exit(w->ctx);
} }
int main(void) int main(void)
@@ -120,6 +121,8 @@ int main(void)
/* Initialize libuEv */ /* Initialize libuEv */
uev_init(&ctx); uev_init(&ctx);
/* Setup callbacks */
uev_signal_init(&ctx, &sigsegv_watcher, sigsegv_cb, NULL, SIGSEGV); uev_signal_init(&ctx, &sigsegv_watcher, sigsegv_cb, NULL, SIGSEGV);
uev_signal_init(&ctx, &sigchld_watcher, sigchld_cb, NULL, SIGCHLD); uev_signal_init(&ctx, &sigchld_watcher, sigchld_cb, NULL, SIGCHLD);
uev_timer_init(&ctx, &timeout_watcher, work_cb, &arg, 400, 0); uev_timer_init(&ctx, &timeout_watcher, work_cb, &arg, 400, 0);
@@ -131,7 +134,6 @@ int main(void)
/** /**
* Local Variables: * Local Variables:
* version-control: t
* indent-tabs-mode: t * indent-tabs-mode: t
* c-file-style: "linux" * c-file-style: "linux"
* End: * End:
+23 -25
View File
@@ -3,24 +3,23 @@
* Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk> * Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
* Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com> * Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com>
* *
* Permission is hereby granted, free of charge, to any person obtaining * Permission is hereby granted, free of charge, to any person obtaining a copy
* a copy of this software and associated documentation files (the * of this software and associated documentation files (the "Software"), to deal
* "Software"), to deal in the Software without restriction, including * in the Software without restriction, including without limitation the rights
* without limitation the rights to use, copy, modify, merge, publish, * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* distribute, sublicense, and/or sell copies of the Software, and to * copies of the Software, and to permit persons to whom the Software is
* permit persons to whom the Software is furnished to do so, subject to * furnished to do so, subject to the following conditions:
* the following conditions:
* *
* The above copyright notice and this permission notice shall be * The above copyright notice and this permission notice shall be included in
* included in all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <signal.h> #include <signal.h>
@@ -40,33 +39,33 @@ static int in, out;
static int period = 0; static int period = 0;
static uev_t *watchdog; static uev_t *watchdog;
static void lifetime_cb(uev_ctx_t *ctx, uev_t UNUSED(*w), void *arg, int UNUSED(events)) static void lifetime_cb(uev_t *w, void *arg, int UNUSED(events))
{ {
fprintf(stderr, "\nLifetime exceeded, program completed successfully! (arg:%p)\n", arg); fprintf(stderr, "\nLifetime exceeded, program completed successfully! (arg:%p)\n", arg);
uev_exit(ctx); uev_exit(w->ctx);
} }
/* The pipe watchdog, if it triggers we haven't received data in time. */ /* The pipe watchdog, if it triggers we haven't received data in time. */
static void timeout_cb(uev_ctx_t *ctx, uev_t *UNUSED(w), void *arg, int UNUSED(events)) static void timeout_cb(uev_t *w, void *arg, int UNUSED(events))
{ {
watchdog = NULL; watchdog = NULL;
fprintf(stderr, "\nTimeout exceeded %p\n", arg); fprintf(stderr, "\nTimeout exceeded %p\n", arg);
// uev_timer_stop(w); <-- No need to stop timers with period=0 :) // uev_timer_stop(w); <-- No need to stop timers with period=0 :)
uev_exit(ctx); uev_exit(w->ctx);
} }
static void periodic_task(uev_ctx_t UNUSED(*ctx), uev_t UNUSED(*w), void UNUSED(*arg), int UNUSED(events)) static void periodic_task(uev_t UNUSED(*w), void UNUSED(*arg), int UNUSED(events))
{ {
fprintf(stderr, "|"); fprintf(stderr, "|");
} }
static void signal_cb(uev_ctx_t *UNUSED(ctx), uev_t *w, void *UNUSED(arg), int UNUSED(events)) static void signal_cb(uev_t *w, void *UNUSED(arg), int UNUSED(events))
{ {
fprintf(stderr, w->signo == SIGINT ? "^Cv" : "^\v"); fprintf(stderr, w->signo == SIGINT ? "^Cv" : "^\v");
} }
static void pipe_read_cb(uev_ctx_t *UNUSED(ctx), uev_t UNUSED(*w), void UNUSED(*arg), int UNUSED(events)) static void pipe_read_cb(uev_t UNUSED(*w), void UNUSED(*arg), int UNUSED(events))
{ {
int cnt; int cnt;
char msg[50]; char msg[50];
@@ -80,7 +79,7 @@ static void pipe_read_cb(uev_ctx_t *UNUSED(ctx), uev_t UNUSED(*w), void UNUSED(*
fprintf(stderr, "%.*s.%d ", cnt, msg, cnt); fprintf(stderr, "%.*s.%d ", cnt, msg, cnt);
} }
static void pipe_write_cb(uev_ctx_t UNUSED(*ctx), uev_t *w, void *arg, int UNUSED(events)) static void pipe_write_cb(uev_t *w, void *arg, int UNUSED(events))
{ {
my_t *my = arg; my_t *my = arg;
char *msg = "TESTING"; char *msg = "TESTING";
@@ -147,7 +146,6 @@ int main(void)
/** /**
* Local Variables: * Local Variables:
* version-control: t
* indent-tabs-mode: t * indent-tabs-mode: t
* c-file-style: "linux" * c-file-style: "linux"
* End: * End:
+17 -20
View File
@@ -1,30 +1,28 @@
/* libuEv - Micro event loop library /* libuEv - Micro event loop library
* *
* Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk> * Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
* Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com> * Copyright (c) 2013-2016 Joachim Nilsson <troglobit()gmail!com>
* *
* Permission is hereby granted, free of charge, to any person obtaining * Permission is hereby granted, free of charge, to any person obtaining a copy
* a copy of this software and associated documentation files (the * of this software and associated documentation files (the "Software"), to deal
* "Software"), to deal in the Software without restriction, including * in the Software without restriction, including without limitation the rights
* without limitation the rights to use, copy, modify, merge, publish, * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* distribute, sublicense, and/or sell copies of the Software, and to * copies of the Software, and to permit persons to whom the Software is
* permit persons to whom the Software is furnished to do so, subject to * furnished to do so, subject to the following conditions:
* the following conditions:
* *
* The above copyright notice and this permission notice shall be * The above copyright notice and this permission notice shall be included in
* included in all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <errno.h> #include <errno.h>
#include "uev.h" #include "uev.h"
@@ -35,7 +33,7 @@
* @param cb I/O callback * @param cb I/O callback
* @param arg Optional callback argument * @param arg Optional callback argument
* @param fd File descriptor to watch, or -1 to register an empty watcher * @param fd File descriptor to watch, or -1 to register an empty watcher
* @param events Requested events to watch for, a mask of %UEV_READ and %UEV_WRITE * @param events Requested events to watch for, a mask of %UEV_READ, %UEV_WRITE and %UEV_PRI
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @param errno set on error.
*/ */
@@ -92,7 +90,6 @@ int uev_io_stop(uev_t *w)
/** /**
* Local Variables: * Local Variables:
* version-control: t
* indent-tabs-mode: t * indent-tabs-mode: t
* c-file-style: "linux" * c-file-style: "linux"
* End: * End:
+12
View File
@@ -0,0 +1,12 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: @PACKAGE@
Description: Simple event loop for Linux
Version: @VERSION@
Requires:
Libs: -L${libdir} -luev
Cflags: -I${includedir}
+1
View File
@@ -0,0 +1 @@
*.m4
+88
View File
@@ -0,0 +1,88 @@
/* libuEv - Private methods and data types, do not use directly!
*
* Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
* Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef LIBUEV_PRIVATE_H_
#define LIBUEV_PRIVATE_H_
#include <stdio.h>
#include <sys/epoll.h>
#include "queue.h" /* OpenBSD queue.h > old GLIBC version */
/* I/O, timer, or signal watcher */
typedef enum {
UEV_IO_TYPE = 1,
UEV_TIMER_TYPE,
UEV_SIGNAL_TYPE,
} uev_type_t;
/* Event mask, used internally only. */
#define UEV_EVENT_MASK (UEV_READ | UEV_WRITE | UEV_PRI)
/* Main libuEv context type */
typedef struct {
int running;
int fd; /* For epoll() */
uint32_t errors;
LIST_HEAD(,uev) watchers;
} uev_ctx_t;
/* Forward declare due to dependencys, don't try this at home kids. */
struct uev;
/* This is used to hide all private data members in uev_t */
#define uev_private_t \
LIST_ENTRY(uev) link; /* For queue.h linked list */ \
\
int active; \
int events; \
\
/* Watcher callback with optional argument */ \
void (*cb)(struct uev *, void *, int); \
void *arg; \
\
/* Timer watchers, time in milliseconds */ \
int timeout; \
int period; \
\
/* Signal watchers */ \
int signo; \
\
/* Watcher type */ \
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);
#endif /* LIBUEV_PRIVATE_H_ */
/**
* Local Variables:
* indent-tabs-mode: t
* c-file-style: "linux"
* End:
*/
-9
View File
@@ -1,9 +0,0 @@
# Pretty printing and GCC -M for auto dep files
%.o: %.c
@printf " CC $(subst $(ROOTDIR)/,,$(shell pwd)/)$@\n"
@$(CC) $(CFLAGS) $(CPPFLAGS) -c -MMD -MP -o $@ $<
%: %.o
@printf " LINK $(subst $(ROOTDIR)/,,$(shell pwd)/)$@\n"
@$(CC) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$@.map -o $@ $^ $(LDLIBS$(LDLIBS-$(@)))
+17 -19
View File
@@ -1,26 +1,25 @@
/* libuEv - Micro event loop library /* libuEv - Micro event loop library
* *
* Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk> * Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
* Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com> * Copyright (c) 2013-2016 Joachim Nilsson <troglobit()gmail!com>
* *
* Permission is hereby granted, free of charge, to any person obtaining * Permission is hereby granted, free of charge, to any person obtaining a copy
* a copy of this software and associated documentation files (the * of this software and associated documentation files (the "Software"), to deal
* "Software"), to deal in the Software without restriction, including * in the Software without restriction, including without limitation the rights
* without limitation the rights to use, copy, modify, merge, publish, * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* distribute, sublicense, and/or sell copies of the Software, and to * copies of the Software, and to permit persons to whom the Software is
* permit persons to whom the Software is furnished to do so, subject to * furnished to do so, subject to the following conditions:
* the following conditions:
* *
* The above copyright notice and this permission notice shall be * The above copyright notice and this permission notice shall be included in
* included in all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <errno.h> #include <errno.h>
@@ -53,7 +52,7 @@ int uev_signal_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int signo
w->fd = -1; w->fd = -1;
sigemptyset(&mask); sigemptyset(&mask);
fd = signalfd(-1, &mask, SFD_NONBLOCK); fd = signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC);
if (fd < 0) if (fd < 0)
return -1; return -1;
@@ -152,7 +151,6 @@ int uev_signal_stop(uev_t *w)
/** /**
* Local Variables: * Local Variables:
* version-control: t
* indent-tabs-mode: t * indent-tabs-mode: t
* c-file-style: "linux" * c-file-style: "linux"
* End: * End:
+31 -25
View File
@@ -1,26 +1,25 @@
/* libuEv - Micro event loop library /* libuEv - Micro event loop library
* *
* Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk> * Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
* Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com> * Copyright (c) 2013-2016 Joachim Nilsson <troglobit()gmail!com>
* *
* Permission is hereby granted, free of charge, to any person obtaining * Permission is hereby granted, free of charge, to any person obtaining a copy
* a copy of this software and associated documentation files (the * of this software and associated documentation files (the "Software"), to deal
* "Software"), to deal in the Software without restriction, including * in the Software without restriction, including without limitation the rights
* without limitation the rights to use, copy, modify, merge, publish, * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* distribute, sublicense, and/or sell copies of the Software, and to * copies of the Software, and to permit persons to whom the Software is
* permit persons to whom the Software is furnished to do so, subject to * furnished to do so, subject to the following conditions:
* the following conditions:
* *
* The above copyright notice and this permission notice shall be * The above copyright notice and this permission notice shall be included in
* included in all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <errno.h> #include <errno.h>
@@ -68,7 +67,12 @@ int uev_timer_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int timeou
{ {
int fd; int fd;
fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); if (timeout < 0 || period < 0) {
errno = ERANGE;
return -1;
}
fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC);
if (fd < 0) if (fd < 0)
return -1; return -1;
@@ -101,6 +105,11 @@ int uev_timer_set(uev_t *w, int timeout, int period)
return -1; return -1;
} }
if (timeout < 0 || period < 0) {
errno = ERANGE;
return -1;
}
/* Handle stopped timers */ /* Handle stopped timers */
if (w->fd < 0) { if (w->fd < 0) {
/* Timer already stopped */ /* Timer already stopped */
@@ -123,11 +132,9 @@ int uev_timer_set(uev_t *w, int timeout, int period)
msec2tspec(timeout, &time.it_value); msec2tspec(timeout, &time.it_value);
msec2tspec(period, &time.it_interval); msec2tspec(period, &time.it_interval);
timerfd_settime(w->fd, 0, &time, NULL); timerfd_settime(w->fd, 0, &time, NULL);
return uev_watcher_start(w);
} }
return 0; return uev_watcher_start(w);
} }
/** /**
@@ -157,12 +164,12 @@ int uev_timer_start(uev_t *w)
*/ */
int uev_timer_stop(uev_t *w) int uev_timer_stop(uev_t *w)
{ {
if (uev_watcher_stop(w))
return -1;
/* Stop kernel timer */ /* Stop kernel timer */
uev_timer_set(w, 0, 0); uev_timer_set(w, 0, 0);
if (uev_watcher_stop(w))
return -1;
/* Close timerfd, will have to be reopened again on reset */ /* Close timerfd, will have to be reopened again on reset */
close(w->fd); close(w->fd);
w->fd = -1; w->fd = -1;
@@ -172,7 +179,6 @@ int uev_timer_stop(uev_t *w)
/** /**
* Local Variables: * Local Variables:
* version-control: t
* indent-tabs-mode: t * indent-tabs-mode: t
* c-file-style: "linux" * c-file-style: "linux"
* End: * End:
+19 -21
View File
@@ -1,26 +1,25 @@
/* libuEv - Micro event loop library /* libuEv - Micro event loop library
* *
* Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk> * Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
* Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com> * Copyright (c) 2013-2016 Joachim Nilsson <troglobit()gmail!com>
* *
* Permission is hereby granted, free of charge, to any person obtaining * Permission is hereby granted, free of charge, to any person obtaining a copy
* a copy of this software and associated documentation files (the * of this software and associated documentation files (the "Software"), to deal
* "Software"), to deal in the Software without restriction, including * in the Software without restriction, including without limitation the rights
* without limitation the rights to use, copy, modify, merge, publish, * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* distribute, sublicense, and/or sell copies of the Software, and to * copies of the Software, and to permit persons to whom the Software is
* permit persons to whom the Software is furnished to do so, subject to * furnished to do so, subject to the following conditions:
* the following conditions:
* *
* The above copyright notice and this permission notice shall be * The above copyright notice and this permission notice shall be included in
* included in all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * THE SOFTWARE.
*/ */
#include <errno.h> #include <errno.h>
@@ -37,8 +36,9 @@
static int _init(uev_ctx_t *ctx, int close_old) static int _init(uev_ctx_t *ctx, int close_old)
{ {
int fd = epoll_create1(O_CLOEXEC); int fd;
fd = epoll_create1(EPOLL_CLOEXEC);
if (fd < 0) if (fd < 0)
return -1; return -1;
@@ -297,7 +297,7 @@ int uev_run(uev_ctx_t *ctx, int flags)
} }
if (w->cb) if (w->cb)
w->cb((struct uev *)ctx, w, w->arg); w->cb(w, w->arg, events[i].events & UEV_EVENT_MASK);
if (UEV_TIMER_TYPE == w->type) { if (UEV_TIMER_TYPE == w->type) {
if (!w->timeout) if (!w->timeout)
@@ -312,10 +312,8 @@ int uev_run(uev_ctx_t *ctx, int flags)
return result; return result;
} }
/** /**
* Local Variables: * Local Variables:
* version-control: t
* indent-tabs-mode: t * indent-tabs-mode: t
* c-file-style: "linux" * c-file-style: "linux"
* End: * End:
+23 -63
View File
@@ -3,33 +3,29 @@
* Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk> * Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
* Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com> * Copyright (c) 2013-2015 Joachim Nilsson <troglobit()gmail!com>
* *
* Permission is hereby granted, free of charge, to any person obtaining * Permission is hereby granted, free of charge, to any person obtaining a copy
* a copy of this software and associated documentation files (the * of this software and associated documentation files (the "Software"), to deal
* "Software"), to deal in the Software without restriction, including * in the Software without restriction, including without limitation the rights
* without limitation the rights to use, copy, modify, merge, publish, * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* distribute, sublicense, and/or sell copies of the Software, and to * copies of the Software, and to permit persons to whom the Software is
* permit persons to whom the Software is furnished to do so, subject to * furnished to do so, subject to the following conditions:
* the following conditions:
* *
* The above copyright notice and this permission notice shall be * The above copyright notice and this permission notice shall be included in
* included in all copies or substantial portions of the Software. * all copies or substantial portions of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * THE SOFTWARE.
*/ */
#ifndef LIBUEV_UEV_H_ #ifndef LIBUEV_UEV_H_
#define LIBUEV_UEV_H_ #define LIBUEV_UEV_H_
#include <stdio.h> #include "private.h"
#include <sys/epoll.h>
#include "queue.h" /* OpenBSD queue.h > old GLIBC version */
/* Max. number of simulateneous events */ /* Max. number of simulateneous events */
#define UEV_MAX_EVENTS 10 #define UEV_MAX_EVENTS 10
@@ -38,59 +34,24 @@
#define UEV_NONE 0 #define UEV_NONE 0
#define UEV_READ EPOLLIN #define UEV_READ EPOLLIN
#define UEV_WRITE EPOLLOUT #define UEV_WRITE EPOLLOUT
#define UEV_PRI EPOLLPRI
/* Run flags */ /* Run flags */
#define UEV_ONCE 1 #define UEV_ONCE 1
#define UEV_NONBLOCK 2 #define UEV_NONBLOCK 2
/* I/O, timer, or signal watcher */ /* Event watcher */
typedef enum {
UEV_IO_TYPE = 1,
UEV_TIMER_TYPE,
UEV_SIGNAL_TYPE,
} uev_type_t;
/* Forward declare due to dependencys, don't try this at home kids. */
struct uev;
/* Main libuEv context type */
typedef struct {
int running;
int fd; /* For epoll() */
uint32_t errors;
LIST_HEAD(,uev) watchers;
} uev_ctx_t;
/* I/O event watcher */
typedef struct uev { typedef struct uev {
LIST_ENTRY(uev) link; /* For queue.h linked list */ /* Private data for libuEv internal engine */
uev_private_t type;
/* Common to all watchers */ /* Public data for users to reference */
uev_ctx_t *ctx;
uev_type_t type;
int active;
int fd; int fd;
int events; uev_ctx_t *ctx;
/* Watcher callback with optional argument */
void (*cb)(struct uev *, struct uev *, void *);
void *arg;
/* Timer watchers, time in milliseconds */
int timeout;
int period;
/* Signal watchers */
int signo;
} uev_t; } uev_t;
/* Generic callback for watchers */ /* Generic callback for watchers */
typedef void (uev_cb_t)(uev_ctx_t *ctx, uev_t *w, void *arg, int events); typedef void (uev_cb_t)(uev_t *w, void *arg, int events);
/* Private methods, do not use directly! */
int uev_watcher_init (uev_ctx_t *ctx, uev_t *w, uev_type_t type, uev_cb_t *cb, void *arg, int fd, int events);
int uev_watcher_start (uev_t *w);
int uev_watcher_stop (uev_t *w);
/* Public interface */ /* Public interface */
int uev_init (uev_ctx_t *ctx); int uev_init (uev_ctx_t *ctx);
@@ -116,7 +77,6 @@ int uev_signal_stop (uev_t *w);
/** /**
* Local Variables: * Local Variables:
* version-control: t
* indent-tabs-mode: t * indent-tabs-mode: t
* c-file-style: "linux" * c-file-style: "linux"
* End: * End: