68 Commits
Author SHA1 Message Date
Joachim Wiberg c964bbe8fb .github: bump actions
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-04-28 08:35:10 +02:00
Joachim Wiberg faf7667012 Create SECURITY.md policy 2025-04-28 07:56:01 +02:00
Joachim Wiberg 332f28e5e1 .github: drop 'needs:' and set release variables
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-01-04 17:23:17 +01:00
Joachim Wiberg d3c021af42 Update changelog and bump version for v2.4.1 release
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-01-04 17:16:57 +01:00
Joachim Wiberg 0f59096154 Update copyright years
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-01-04 17:16:49 +01:00
Joachim Wiberg d67290c073 .github: update and drop dep install, not needed
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-01-04 17:12:54 +01:00
Joachim Wiberg c23100c3f0 .github: bump action versions
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-01-04 17:05:32 +01:00
Joachim Wiberg ff2396b973 Mention new Linux APIs we use
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2022-12-28 23:40:30 +01:00
Joachim Wiberg 70ef23b9e3 Open v2.4.1 release cycle
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2022-12-17 15:14:35 +01:00
Joachim Wiberg 568fe6a9e1 Update changelog for upcoming v2.4.1 release
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2022-12-17 15:14:01 +01:00
Joachim Wiberg ae048605db .github: bump actions to latest supported Node.JS
Prepare for next release by importing necessary changes to release.yml
from SMCroute.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2022-12-17 15:10:55 +01:00
Joachim Wiberg 2d9f1c9ce6 Fix #27: possible buffer overrun in uev_run()
If uev_init1() is called with maxevents > 10 the call to epoll_wait()
might cause buffer overflow.  Reported by Steve Palmer.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2022-12-17 15:02:21 +01:00
Joachim Wiberg f9c72a01c8 Minor, coding style
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2022-12-17 15:02:12 +01:00
Joachim Wiberg 270e270591 test: fix signed vs unsigned comparison
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2022-12-17 15:01:25 +01:00
Joachim Wiberg 3c3b37c9aa debian: update library ABI version in .symbols file
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-11-28 14:50:19 +01:00
Joachim Wiberg 0c92a564d8 debian: drop libtool dep and add doxygen
Apparently libtool is an implicit dependency and does not have to be
listed explicitly.

Add doxygen since we now have full doxygen docs to build.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-11-28 14:47:37 +01:00
Joachim Wiberg 53eadaa1c9 debian: fix copy-paste from libite in .symbols file
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-11-28 14:47:37 +01:00
Joachim Wiberg 9591ac7efb debian: Step library name to match SONAME
This patch fixes the lintian warning package-name-doesnt-match-sonames,
which is a reminder to step the library version to match the soname.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 09:03:44 +02:00
Joachim Wiberg 2ceec8e61c Check for tag with 'v' prefix in release-hook
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 08:32:45 +02:00
Joachim Wiberg fd72b75b1b Update changelogs and bump version for v2.4.0 release
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 08:29:27 +02:00
Joachim Wiberg 5c3801bb4a Bump ABI version 2.3.0 -> 3.0.0
The change in the uev_t means the stack space required, and used by
libuEv, is incompatible with previous releases.  So applications
need to be rebuild against the new header file.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 08:26:33 +02:00
Joachim Wiberg 739b9f451f debian: API.md has moved
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 08:18:35 +02:00
Joachim Wiberg 02832543e3 test: use AM_LDFLAGS for linker args to test programs
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 08:13:21 +02:00
Joachim Wiberg 0fe9868fc7 .github: drop dh-systemd from debian job, not needed
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 08:04:50 +02:00
Joachim Wiberg 292a222127 .github: drop release job dependency
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 08:01:36 +02:00
Joachim Wiberg 611f4ffd00 Update changelogs for v2.4.0 release
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 08:00:26 +02:00
Joachim Wiberg 7bde82fc93 Bump ABI version 2.2.0 --> 2.3.0
New siginfo member in uev_t

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 07:56:12 +02:00
Joachim Wiberg c8d1de10a3 test: prefix CFLAGS/CPPFLAGS with AM_ to avoid clash with Fedora
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 07:40:06 +02:00
Joachim Wiberg 2872628ef3 .github: verify package building for all builds
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 07:23:07 +02:00
Joachim Wiberg 9f5e359bc7 .github: add Release General
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 07:22:53 +02:00
Joachim Wiberg a4abbe8aea Drop package from release target, built separately
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 07:21:52 +02:00
Joachim Wiberg ff1a3eccd9 Check for full version in git tag before starting release build
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-03 07:19:34 +02:00
Joachim Wiberg 207e211214 Bump version for v2.4.0-rc1
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-02 17:30:29 +02:00
Joachim Wiberg c15e6f08e3 .github: enable hints for contributors
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-02 17:30:09 +02:00
Joachim Wiberg be4364236b .github: enable funding submissions for this project
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-02 17:27:59 +02:00
Joachim Wiberg 8aa549487f Update ChangeLog for upcoming v2.4.0 release
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-02 17:25:29 +02:00
Joachim Wiberg 0c8ff24353 Update .pc file with build reqs, issue #25
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-02 17:21:49 +02:00
Joachim Wiberg 0e0291f85e Fix #25: apps must be built with 64-bit time, just like the lib
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-10-02 17:21:17 +02:00
Joachim Wiberg 0f2e1521a8 Add MIT license badge
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-08-01 23:22:18 +02:00
Joachim Wiberg 6d56c8da98 Drop all notion of Travis-CI
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-08-01 23:20:12 +02:00
Joachim Wiberg 59dbc3260c .github: add coverity scan action
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-08-01 23:09:26 +02:00
Joachim Wiberg 44a8c08586 .github: initial build action to replace travis
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-08-01 22:59:51 +02:00
Joachim Wiberg caa62910db Relocate tests/ -> test/
For my own sanity, test/ is used in every other project of mine.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-08-01 22:40:35 +02:00
Joachim Wiberg d7a8c7895b Fix #25: glibc >= 2.33 requires _FILE_OFFSET_BITS=64 with _TIME_BITS=64
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-08-01 22:37:01 +02:00
Joachim Wiberg 3774473d96 codedocs.xyz: add paths to input, exclude and main page
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-06-14 17:37:10 +02:00
Joachim Wiberg 0038a3da18 Extra files from doxygen to clean up
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-06-14 00:25:22 +02:00
Joachim Wiberg a8fc8cae75 Generate Doxyfile from Doxyfile.in to get package version and paths
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-06-14 00:25:22 +02:00
Joachim Wiberg 5ff3f27806 Travis-CI: install tree + doxygen to build docs as well
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-06-13 23:33:16 +02:00
Joachim Wiberg 19d6c853e5 Initial codedocs.xyz integration
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-06-13 23:27:43 +02:00
Joachim Wiberg e626d080d7 Update doc comments to proper doxygen syntax
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-06-13 23:27:08 +02:00
Joachim Wiberg da080c886d Add doxygen to standard build flow, if found
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-06-13 23:26:37 +02:00
Joachim Wiberg 7b1e0eb551 Relocate most documentation to doc/
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-06-13 23:22:44 +02:00
Joachim Wiberg f207812854 doc: initial effort to enable doxygen
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-06-13 22:09:44 +02:00
Joachim Wiberg 241313a2bd tests: refactor signal test
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-06-08 21:29:05 +02:00
Joachim Wiberg 1db9b6eb8e examples: update .gitignore
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-06-08 20:28:59 +02:00
Joachim Wiberg 362670e149 Fix error handling in example callbacks
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-05-26 23:07:46 +02:00
Joachim Wiberg 18000a8ca0 Update changelogs, remember to bump ABI
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-05-26 23:03:42 +02:00
Joachim Wiberg edc4db38ce Bump version for v2.4.0 series, -beta1
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-05-26 22:58:32 +02:00
Joachim Wiberg 3d8ec02267 Update signal example with siginfo
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-05-26 22:56:25 +02:00
Joachim Wiberg e20d37228d New siginfo member in uev_t for signal watchers
This patch adds support for exporting the signalfd_siginfo struct read
from the signal fd descriptor on signals.  This allows watcher callbacks
to, e.g., figure out who sent a signal.  See signalfd(2) for details on
struct signalfd_siginfo.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-05-18 09:57:57 +02:00
Joachim Wiberg bfd8454a92 Merge pull request #24 from oturpe/fedora-fixes
Fix to build cleanly on Fedora build system
2021-04-22 15:51:06 +02:00
Otto Urpelainen 08aa7dfd76 Replace obsolete autotools macro with supported alternative
AM_CONFIG_HEADER is obsolete and should be replaced with
AC_CONFIG_HEADERS.
2021-04-21 20:46:01 +03:00
Otto Urpelainen 3e213b3792 Fix test invocation in README.md script
'make check' works, 'make test' does not.
2021-04-21 20:34:55 +03:00
Otto Urpelainen 9f3d892dcd Remove CFLAGS from tests/Makefile.am
Test are intended to be run from the root makefile, which delegates to
tests subfolder. If tests define their own CFLAGS, any configuration
from the root is overridden. This may result in a situation where the
tests fail to execute, because the library was compiled with
incompatible flags.

In particular, the starard LDFLAGS used by Fedora are incompatible with
the tests subfolder CFLAGS. Since there does not appear to be any
particular reason for forcing the tests subfolder CFLAGS, they are
removed here.
2021-04-21 20:24:46 +03:00
Joachim Wiberg ad2e71b2c5 TODO: Update with ref. to issue #20
Closes #20

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-04-07 08:50:43 +02:00
Joachim Wiberg 042f1b59bf examples: update comments
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-02-17 08:10:52 +01:00
Joachim Wiberg 8f96965d35 examples: add fork + signals + timer example
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-02-17 08:09:00 +01:00
Joachim Wiberg 53cad7bee2 examples: add timer + signal example
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-02-16 20:02:24 +01:00
55 changed files with 4229 additions and 230 deletions

No files matched your search

+193
View File
@@ -0,0 +1,193 @@
# CodeDocs.xyz Configuration File
#
# Rename this example to '.codedocs' and put it in the root directory of your
# repository. This file is optional, documentation will still be generated
# without it using sensible defaults.
#---------------------------------------------------------------------------
# CodeDocs Configuration
#---------------------------------------------------------------------------
# Include the Doxygen configuration from another file.
# The file must be a relative path with respect to the root of the repository.
# If any of the options in this doxyfile include a path (ie, INPUT), these
# paths will be considered relative to the root of the repository, not the
# location of the DOXYFILE.
DOXYFILE = doc/Doxyfile
# Specify external repository to link documentation with.
# This is similar to Doxygen's TAGFILES option, but will automatically link to
# tags of other repositories already using CodeDocs. List each repository to
# link with by giving its location in the form of owner/repository.
# For example:
# TAGLINKS = doxygen/doxygen CodeDocs/osg
# Note: these repositories must already be built on CodeDocs.
TAGLINKS =
#---------------------------------------------------------------------------
# Doxygen Configuration
#---------------------------------------------------------------------------
# Doxygen configuration may also be placed in this file.
# Currently, the following Doxygen configuration options are available. Refer
# to http://doxygen.org/manual/config.html for detailed explanation of the
# options. To request support for more options, contact support@codedocs.xyz.
#
# ABBREVIATE_BRIEF =
# ALIASES =
# ALLEXTERNALS =
# ALLOW_UNICODE_NAMES =
# ALPHABETICAL_INDEX =
# ALWAYS_DETAILED_SEC =
# AUTOLINK_SUPPORT =
# BRIEF_MEMBER_DESC =
# BUILTIN_STL_SUPPORT =
# CALLER_GRAPH =
# CALL_GRAPH =
# CASE_SENSE_NAMES =
# CITE_BIB_FILES =
# CLASS_DIAGRAMS =
# CLASS_GRAPH =
# COLLABORATION_GRAPH =
# COLS_IN_ALPHA_INDEX =
# CPP_CLI_SUPPORT =
# DIAFILE_DIRS =
# DIRECTORY_GRAPH =
# DISABLE_INDEX =
# DISTRIBUTE_GROUP_DOC =
# DOTFILE_DIRS =
# DOT_FONTNAME =
# DOT_FONTSIZE =
# DOT_GRAPH_MAX_NODES =
# DOT_IMAGE_FORMAT =
# DOT_TRANSPARENT =
# DOXYFILE_ENCODING =
# ENABLED_SECTIONS =
# ENABLE_PREPROCESSING =
# ENUM_VALUES_PER_LINE =
# EXAMPLE_PATH =
# EXAMPLE_PATTERNS =
# EXAMPLE_RECURSIVE =
EXCLUDE = src/bench.c src/private.h src/README.md
# EXCLUDE_PATTERNS =
# EXCLUDE_SYMBOLS =
# EXPAND_AS_DEFINED =
# EXPAND_ONLY_PREDEF =
# EXTENSION_MAPPING =
# EXTERNAL_GROUPS =
# EXTERNAL_PAGES =
# EXTRACT_ALL =
# EXTRACT_ANON_NSPACES =
# EXTRACT_LOCAL_CLASSES =
# EXTRACT_LOCAL_METHODS =
# EXTRACT_PACKAGE =
# EXTRACT_PRIVATE =
# EXTRACT_STATIC =
# EXT_LINKS_IN_WINDOW =
# FILE_PATTERNS =
# FORCE_LOCAL_INCLUDES =
# FORMULA_FONTSIZE =
# FORMULA_TRANSPARENT =
# FULL_PATH_NAMES =
# GENERATE_BUGLIST =
# GENERATE_DEPRECATEDLIST =
# GENERATE_LEGEND =
# GENERATE_TESTLIST =
# GENERATE_TODOLIST =
# GENERATE_TREEVIEW =
# GRAPHICAL_HIERARCHY =
# GROUP_GRAPHS =
# GROUP_NESTED_COMPOUNDS =
# HIDE_COMPOUND_REFERENCE= =
# HIDE_FRIEND_COMPOUNDS =
# HIDE_IN_BODY_DOCS =
# HIDE_SCOPE_NAMES =
# HIDE_UNDOC_CLASSES =
# HIDE_UNDOC_MEMBERS =
# HIDE_UNDOC_RELATIONS =
# HTML_COLORSTYLE_GAMMA =
# HTML_COLORSTYLE_HUE =
# HTML_COLORSTYLE_SAT =
# HTML_DYNAMIC_SECTIONS =
# HTML_EXTRA_FILES =
# HTML_EXTRA_STYLESHEET =
# HTML_FOOTER =
# HTML_HEADER =
# HTML_INDEX_NUM_ENTRIES =
# HTML_STYLESHEET =
# HTML_TIMESTAMP =
# IDL_PROPERTY_SUPPORT =
# IGNORE_PREFIX =
# IMAGE_PATH =
# INCLUDED_BY_GRAPH =
# INCLUDE_FILE_PATTERNS =
# INCLUDE_GRAPH =
# INCLUDE_PATH =
# INHERIT_DOCS =
# INLINE_GROUPED_CLASSES =
# INLINE_INFO =
# INLINE_INHERITED_MEMB =
# INLINE_SIMPLE_STRUCTS =
# INLINE_SOURCES =
INPUT = src/ README.md doc/API.md
# INPUT_ENCODING =
# INTERACTIVE_SVG =
# INTERNAL_DOCS =
# JAVADOC_AUTOBRIEF =
# LAYOUT_FILE =
# MACRO_EXPANSION =
# MARKDOWN_SUPPORT =
# MAX_DOT_GRAPH_DEPTH =
# MSCFILE_DIRS =
# MULTILINE_CPP_IS_BRIEF =
# OPTIMIZE_FOR_FORTRAN =
# OPTIMIZE_OUTPUT_FOR_C =
# OPTIMIZE_OUTPUT_JAVA =
# OPTIMIZE_OUTPUT_VHDL =
# OUTPUT_LANGUAGE =
# PLANTUML_JAR_PATH =
# PREDEFINED =
# PROJECT_BRIEF =
# PROJECT_LOGO =
# PROJECT_NAME =
# PROJECT_NUMBER =
# QT_AUTOBRIEF =
# RECURSIVE =
# REFERENCED_BY_RELATION =
# REFERENCES_LINK_SOURCE =
# REFERENCES_RELATION =
# REPEAT_BRIEF =
# SEARCHENGINE =
# SEARCH_INCLUDES =
# SEPARATE_MEMBER_PAGES =
# SHORT_NAMES =
# SHOW_FILES =
# SHOW_GROUPED_MEMB_INC =
# SHOW_INCLUDE_FILES =
# SHOW_NAMESPACES =
# SHOW_USED_FILES =
# SIP_SUPPORT =
# SKIP_FUNCTION_MACROS =
# SORT_BRIEF_DOCS =
# SORT_BY_SCOPE_NAME =
# SORT_GROUP_NAMES =
# SORT_MEMBERS_CTORS_1ST =
# SORT_MEMBER_DOCS =
# SOURCE_BROWSER =
# SOURCE_TOOLTIPS =
# STRICT_PROTO_MATCHING =
# STRIP_CODE_COMMENTS =
# STRIP_FROM_INC_PATH =
# STRIP_FROM_PATH =
# SUBGROUPING =
# TAB_SIZE =
# TEMPLATE_RELATIONS =
# TREEVIEW_WIDTH =
# TYPEDEF_HIDES_STRUCT =
# UML_LIMIT_NUM_FIELDS =
# UML_LOOK =
USE_MDFILE_AS_MAINPAGE = doc/API.md
# VERBATIM_HEADERS =
#
+90
View File
@@ -0,0 +1,90 @@
Contributing to the Project
===========================
Thank you for considering contributing back to [Free Software][1]!
There are a few things we would like you to consider when filing an
issue or pull request with this project:
1. If you are filing a bug report or feature request
Please take the time to check if an issue already has been filed
matching your problem
2. What version are you running, have you tried the latest release?
UNIX distributions often package and test software for their
particular brand. If you are using a pre-packaged version,
then please file a bug with that distribution instead.
3. Coding Style
Lines are allowed to be longer than 72 characters these days, there
is no enforced max. length.
> **Tip:** Always submit code that follows the style of surrounding code!
The coding style itself is strictly Linux [KNF][], like GIT it is
becoming a de facto standard for C programming
https://www.kernel.org/doc/Documentation/CodingStyle
4. Logical Change Sets
Changes should be broken down into logical units that add a feature
or fix a bug. Keep changes separate from each other and do not mix a
bug fix with a whitespace cleanup or a new feature addition.
This is important not only for readilibity, or for the possibility of
maintainers to revert changes, but does also increase your chances of
having a change accepted.
5. Commit messages
Commit messages exist to track *why* a change was made. Try to be as
clear and concise as possible in your commit messages, and always, be
proud of your work and set up a proper GIT identity for your commits:
git config --global user.name "J. Random Hacker"
git config --global user.email random.j.hacker@example.com
See this helpful guide for how to write simple, readable commit
messages, or have at least a look at the below example.
http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
Example
-------
Example commit message from the [Pro Git][gitbook] online book, notice
how `git commit -s` is used to automatically add a `Signed-off-by`:
Capitalized, short (50 chars or less) summary
More detailed explanatory text, if necessary. Wrap it to about 72
characters or so. In some contexts, the first line is treated as the
subject of an email and the rest of the text as the body. The blank
line separating the summary from the body is critical (unless you omit
the body entirely); tools like rebase can get confused if you run the
two together.
Write your commit message in the imperative: "Fix bug" and not "Fixed bug"
or "Fixes bug." This convention matches up with commit messages generated
by commands like git merge and git revert.
Further paragraphs come after blank lines.
- Bullet points are okay, too
- Typically a hyphen or asterisk is used for the bullet, followed by a
single space, with blank lines in between, but conventions vary here
- Use a hanging indent
Signed-off-by: J. Random Hacker <random.j.hacker@example.com>
[1]: http://www.gnu.org/philosophy/free-sw.en.html
[KNF]: https://en.wikipedia.org/wiki/Kernel_Normal_Form
[gitbook]: https://git-scm.com/book/ch5-2.html
+3
View File
@@ -0,0 +1,3 @@
# These are supported funding model platforms
github: [troglobit]
+12
View File
@@ -0,0 +1,12 @@
# Security Policy
## Supported Versions
libuEv is a small project, as such we have no possibility to support older versions.
The only supported version is the latest released on GitHub:
<https://github.com/troglobit/libuev/releases>
## Reporting a Vulnerability
Contact the project's main author and owner to report and discuss vulnerabilities.
+68
View File
@@ -0,0 +1,68 @@
name: Bob the Builder
# Run on all branches, including all pull requests, except the 'dev'
# branch since that's where we run Coverity Scan (limited tokens/day)
on:
push:
branches:
- '**'
- '!dev'
pull_request:
branches:
- '**'
jobs:
build:
# Verify we can build on latest Ubuntu with both gcc and clang
name: ${{ matrix.compiler }}
runs-on: ubuntu-latest
strategy:
matrix:
compiler: [gcc, clang]
fail-fast: false
env:
MAKEFLAGS: -j3
CC: ${{ matrix.compiler }}
steps:
- name: Install dependencies
run: |
sudo apt-get -y update
sudo apt-get -y install tree doxygen
- uses: actions/checkout@v4
- name: Configure
run: |
./autogen.sh
./configure --prefix= --enable-examples --disable-silent-rules
- name: Build
run: |
make
- name: Install to ~/tmp and Inspect
run: |
DESTDIR=~/tmp make install-strip
tree ~/tmp
- name: Run Unit Tests
run: |
make check || (cat test/test-suite.log; false)
- name: Upload Test Results
uses: actions/upload-artifact@v4
with:
name: libuev-test-${{ matrix.compiler }}
path: test/*
debian:
name: Verify Debian Package
runs-on: ubuntu-latest
container: debian:stable
steps:
- uses: actions/checkout@v4
- name: Installing dependencies
run: |
apt-get update
apt-get install -y build-essential autoconf automake pkg-config doxygen \
dpkg-dev debhelper devscripts
- name: Building Debian package
run: |
./autogen.sh
./configure
make distcheck
make package
cat ../*.changes
+76
View File
@@ -0,0 +1,76 @@
name: Coverity Scan
on:
push:
branches:
- 'dev'
env:
PROJECT_NAME: libuev
CONTACT_EMAIL: troglobit@gmail.com
COVERITY_NAME: troglobit-libuev
COVERITY_PROJ: troglobit%2Flibuev
jobs:
coverity:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Fetch latest Coverity Scan MD5
id: var
env:
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
run: |
wget -q https://scan.coverity.com/download/cxx/linux64 \
--post-data "token=$TOKEN&project=${COVERITY_PROJ}&md5=1" \
-O coverity-latest.tar.gz.md5
echo "md5=$(cat coverity-latest.tar.gz.md5)" | tee -a $GITHUB_OUTPUT
- uses: actions/cache@v4
id: cache
with:
path: coverity-latest.tar.gz
key: ${{ runner.os }}-coverity-${{ steps.var.outputs.md5 }}
restore-keys: |
${{ runner.os }}-coverity-${{ steps.var.outputs.md5 }}
${{ runner.os }}-coverity-
${{ runner.os }}-coverity
- name: Download Coverity Scan
env:
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
run: |
if [ ! -f coverity-latest.tar.gz ]; then
wget -q https://scan.coverity.com/download/cxx/linux64 \
--post-data "token=$TOKEN&project=${COVERITY_PROJ}" \
-O coverity-latest.tar.gz
else
echo "Latest Coverity Scan available from cache :-)"
md5sum coverity-latest.tar.gz
fi
mkdir coverity
tar xzf coverity-latest.tar.gz --strip 1 -C coverity
- name: Configure
run: |
./autogen.sh
./configure --prefix= --enable-examples
- name: Build
run: |
export PATH=`pwd`/coverity/bin:$PATH
cov-build --dir cov-int make
- name: Submit results to Coverity Scan
env:
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
run: |
tar czvf ${PROJECT_NAME}.tgz cov-int
curl \
--form project=${COVERITY_NAME} \
--form token=$TOKEN \
--form email=${CONTACT_EMAIL} \
--form file=@${PROJECT_NAME}.tgz \
--form version=trunk \
--form description="${PROJECT_NAME} $(git rev-parse HEAD)" \
https://scan.coverity.com/builds?project=${COVERITY_PROJ}
- name: Upload build.log
uses: actions/upload-artifact@v4
with:
name: coverity-build.log
path: cov-int/build-log.txt
+57
View File
@@ -0,0 +1,57 @@
name: Release General
on:
push:
tags:
- 'v*'
jobs:
release:
name: Build and upload release tarball
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
env:
MAKEFLAGS: -j3
steps:
- uses: actions/checkout@v4
- name: Installing dependencies ...
run: |
sudo apt-get -y update
sudo apt-get -y install tree doxygen
- name: Setting release variables ...
id: build
run: |
ver=${GITHUB_REF#refs/tags/}
echo "ver=${ver}" >> $GITHUB_OUTPUT
if echo $ver | grep -qE '^[0-9]+\.[0-9]+(\.[0-9]+)?(-alpha|-beta|-rc)[0-9]*$'; then
echo "pre=true" >> $GITHUB_OUTPUT
else
echo "pre=false" >> $GITHUB_OUTPUT
fi
if echo $ver | grep -qE '^[0-9.]+\.[0-9.]+(\.[0-9]+)?$'; then
echo "latest=true" >> $GITHUB_OUTPUT
else
echo "latest=false" >> $GITHUB_OUTPUT
fi
- name: Creating Makefiles ...
run: |
./autogen.sh
./configure
- name: Build release ...
run: |
make release || (cat test/test-suite.log; false)
ls -lF ../
mkdir -p artifacts/
mv ../*.tar.* artifacts/
- name: Extract ChangeLog entry ...
run: |
awk '/-----*/{if (x == 1) exit; x=1;next}x' ChangeLog.md \
|head -n -1 > release.md
cat release.md
- uses: ncipollo/release-action@v1
with:
name: libuEv ${{ github.ref_name }}
prerelease: ${{ steps.build.outputs.pre }}
makeLatest: ${{ steps.build.outputs.latest }}
bodyFile: "release.md"
artifacts: "artifacts/*"
-34
View File
@@ -1,34 +0,0 @@
# Travis CI integration -- https://travis-ci.org/troglobit/libuev
# Defaults to GNU GCC and autotools: ./configure && make && make test
language: c
# Use docker for quicker builds, it now allows https://docs.travis-ci.com/user/apt/
sudo: false
# Test build with both GCC and Clang (LLVM)
compiler:
- gcc
- clang
env:
global:
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
# via the "travis encrypt" command using the project repo's public key
- secure: "ikQcWMCLFoxq0+wMiqrNT5HRn0d4e3AxuF8VzNUNFrk6jUvHIufC/OKvr8VWPTjCaAQXZjWfdQAAARUXzJV10WZ7xpiv5qt4bt26Qih2AwMPMJeUOYrqXgQqhTPBp05iLYpo4ybICteXRI3zKKUA1wkdDC0jyu3rl+Fbveekbe0="
addons:
coverity_scan:
project:
name: "troglobit/libuev"
description: "libuEv | Simple event loop for Linux"
notification_email: troglobit@gmail.com
build_command_prepend: "./autogen.sh && ./configure --enable-examples"
build_command: "make clean all"
branch_pattern: dev
script:
- ./autogen.sh
- ./configure --disable-silent-rules --enable-examples
- make clean
- make -j5
- make check
+45 -1
View File
@@ -3,6 +3,48 @@ Change Log
All notable changes to the project are documented in this file. All notable changes to the project are documented in this file.
[v2.4.1][] - 2024-01-04
-----------------------
### Changes
- Update README with list of moden Linux APIs used
### Fixes
- Fix #27: possible buffer overrun in `uev_run()`, found by Steve Palmer
[v2.4.0][] - 2021-10-03
-----------------------
Please note, this release is a major ABI bump due to changes in `uev_t`
which requires recompiling all programs that use libuEv.
Also, libuEv is built for 64 bit `time_t`, this means all applications
that link with libuEv also must be built with the same build flags.
This applies in particular to systems with GLIBC v2.34, which now
require applications to add the following to their `CPPFLAGS`:
CPPFLAGS += -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64
Applications that use `pkg-config` will get these extra flags from the
`libuev.pc` file in the distribution archive.
### Changes
- More examples added for fork + signals + timer
- Add `struct signalfd_siginfo` to `uev_t`, valid for signal watchers.
Now more metadata is available to signal callbacks
### Fixes
- Fix #24: Replace obsolete autotools macro, by Otto Urpelainen
- Fix #25: GLIBC v2.34 require `-D_FILE_OFFSET_BITS=64` for applications
and libraries that want a 64-bit `time_t`. Affects library and test
programs used for `make check`, as well as all other applications that
link with libuEv, so the `libuev.pc` file is also updated
- Fix error handling in callbacks in examples
[v2.3.2][] - 2021-02-12 [v2.3.2][] - 2021-02-12
----------------------- -----------------------
@@ -411,7 +453,9 @@ v0.0.1 - 2012-03-17
Lua users mailing list. Lua users mailing list.
[UNRELEASED]: https://github.com/troglobit/libuev/compare/v2.3.2...HEAD [UNRELEASED]: https://github.com/troglobit/libuev/compare/v2.4.0...HEAD
[v2.4.1]: https://github.com/troglobit/libuev/compare/v2.4.0...v2.4.1
[v2.4.0]: https://github.com/troglobit/libuev/compare/v2.3.2...v2.4.0
[v2.3.2]: https://github.com/troglobit/libuev/compare/v2.3.1...v2.3.2 [v2.3.2]: https://github.com/troglobit/libuev/compare/v2.3.1...v2.3.2
[v2.3.1]: https://github.com/troglobit/libuev/compare/v2.3.0...v2.3.1 [v2.3.1]: https://github.com/troglobit/libuev/compare/v2.3.0...v2.3.1
[v2.3.0]: https://github.com/troglobit/libuev/compare/v2.2.0...v2.3.0 [v2.3.0]: https://github.com/troglobit/libuev/compare/v2.2.0...v2.3.0
+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-2021 Joachim Wiberg <troglobit()gmail!com> Copyright (c) 2013-2024 Joachim Wiberg <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
+19 -6
View File
@@ -1,16 +1,29 @@
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
SUBDIRS = src tests SUBDIRS = src test
DIST_SUBDIRS = src examples tests DIST_SUBDIRS = doc src examples test
doc_DATA = API.md README.md LICENSE doc_DATA = README.md LICENSE
EXTRA_DIST = API.md README.md LICENSE AUTHORS ChangeLog.md EXTRA_DIST = README.md LICENSE AUTHORS ChangeLog.md
if ENABLE_EXAMPLES if ENABLE_EXAMPLES
SUBDIRS += examples SUBDIRS += examples
endif endif
if ENABLE_DOXYGEN
SUBDIRS += doc
.PHONY: doc
doc:
$(MAKE) -C @top_builddir@/doc $@
## The distribution should include man pages, which are generated
dist-hook: doc
else
doc:
@echo "Doxygen documentation (html + man) disabled, skipping ..."
endif
## Check if tagged in git ## Check if tagged in git
release-hook: release-hook:
@if [ ! `git tag | grep $(PACKAGE_VERSION)` ]; then \ @if [ ! `git tag -l v$(PACKAGE_VERSION) | grep v$(PACKAGE_VERSION)` ]; then \
echo; \ echo; \
printf "\e[1m\e[41mCannot find release tag $(PACKAGE_VERSION)\e[0m\n"; \ printf "\e[1m\e[41mCannot find release tag $(PACKAGE_VERSION)\e[0m\n"; \
printf "\e[1m\e[5mDo release anyway?\e[0m "; read yorn; \ printf "\e[1m\e[5mDo release anyway?\e[0m "; read yorn; \
@@ -31,7 +44,7 @@ package:
@debuild -uc -us -B --lintian-opts --profile debian -i -I --show-overrides @debuild -uc -us -B --lintian-opts --profile debian -i -I --show-overrides
## Target to run when building a release ## Target to run when building a release
release: release-hook distcheck package release: release-hook distcheck
@for file in $(DIST_ARCHIVES); do \ @for file in $(DIST_ARCHIVES); do \
md5sum $$file > ../$$file.md5; \ md5sum $$file > ../$$file.md5; \
sha256sum $$file > ../$$file.sha256; \ sha256sum $$file > ../$$file.sha256; \
+22 -12
View File
@@ -1,16 +1,16 @@
µEv | Simple event loop for Linux µEv | Simple event loop for Linux
================================== ==================================
[![Travis Status][]][Travis] [![Coverity Status][]][Coverity Scan] [![License Badge][]][License] [![GitHub Status][]][GitHub] [![Coverity Status][]][Coverity Scan]
* [Introduction](#introduction) * [Introduction](#introduction)
* [API](API.md#overview) * [API](doc/API.md#overview)
* [Create an Event Context](API.md#create-an-event-context) * [Create an Event Context](doc/API.md#create-an-event-context)
* [Register an Event Watcher](API.md#register-an-event-watcher) * [Register an Event Watcher](doc/API.md#register-an-event-watcher)
* [Start Event Loop](API.md#start-event-loop) * [Start Event Loop](doc/API.md#start-event-loop)
* [Summary](API.md#summary) * [Summary](doc/API.md#summary)
* [Using -luev](API.md#using--luev) * [Using -luev](doc/API.md#using--luev)
* [Joystick Example](API.md#joystick-example) * [Joystick Example](doc/API.md#joystick-example)
* [Build & Install](#build--install) * [Build & Install](#build--install)
* [Origin & References](#origin--references) * [Origin & References](#origin--references)
@@ -25,10 +25,17 @@ of APIs. It is similar to the more established [libevent][], [libev][]
and the venerable [Xt(3)][] event loop. The *µ* in the name refers to and the venerable [Xt(3)][] event loop. The *µ* in the name refers to
both its limited feature set and the size impact of the library. both its limited feature set and the size impact of the library.
Linux APIs supported and wrapped for ease-of-use:
- `epoll(2)`
- `eventfd(2)`
- `signalfd(2)`
- `timerfd(2)`
Failure mode changes introduced in v2.0 may affect users of v1.x, See Failure mode changes introduced in v2.0 may affect users of v1.x, See
the [ChangeLog][] for the full details. the [ChangeLog][] for the full details.
The [API documentation](API.md) is available as a separate document. The [API documentation](doc/API.md) is available as a separate document.
Example Example
@@ -49,6 +56,7 @@ static void cb(uev_t *w, void *arg, int events)
if (UEV_ERROR == events) { if (UEV_ERROR == events) {
puts("Problem with timer, attempting to restart."); puts("Problem with timer, attempting to restart.");
uev_timer_start(w); uev_timer_start(w);
return;
} }
puts("Every other second"); puts("Every other second");
@@ -78,7 +86,7 @@ the library works.
```sh ```sh
./configure ./configure
make -j5 make -j5
make test make check
sudo make install-strip sudo make install-strip
sudo ldconfig sudo ldconfig
``` ```
@@ -105,8 +113,10 @@ inspiration also from [picoev][] by [Oku Kazuho][].
[ChangeLog]: https://github.com/troglobit/libuev/blob/master/ChangeLog.md [ChangeLog]: https://github.com/troglobit/libuev/blob/master/ChangeLog.md
[Travis]: https://travis-ci.org/troglobit/libuev [License]: https://en.wikipedia.org/wiki/MIT_License
[Travis Status]: https://travis-ci.org/troglobit/libuev.png?branch=master [License Badge]: https://img.shields.io/badge/License-MIT-teal.svg
[GitHub]: https://github.com/troglobit/libuev/actions/workflows/build.yml/
[GitHub Status]: https://github.com/troglobit/libuev/actions/workflows/build.yml/badge.svg
[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
[libevent]: https://libevent.org [libevent]: https://libevent.org
-9
View File
@@ -1,9 +0,0 @@
LibuEv TODO
===========
* Add standard UNIX backend with select() and timer_create()
See SMCRoute and toolbox for examples.
* 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
+21 -3
View File
@@ -1,11 +1,12 @@
AC_INIT(libuev, 2.3.2, https://github.com/troglobit/libuev/issues) AC_INIT(libuev, 2.4.1, https://github.com/troglobit/libuev/issues)
AC_CONFIG_AUX_DIR(aux) AC_CONFIG_AUX_DIR(aux)
AM_INIT_AUTOMAKE([1.11 foreign dist-xz]) AM_INIT_AUTOMAKE([1.11 foreign dist-xz])
AM_SILENT_RULES([yes]) AM_SILENT_RULES([yes])
AC_CONFIG_SRCDIR(src/uev.c) AC_CONFIG_SRCDIR(src/uev.c)
AM_CONFIG_HEADER(config.h) AC_CONFIG_HEADERS(config.h)
AC_CONFIG_FILES([Makefile src/libuev.pc src/Makefile examples/Makefile tests/Makefile]) AC_CONFIG_FILES([Makefile doc/Makefile doc/Doxyfile examples/Makefile
src/libuev.pc src/Makefile test/Makefile])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AC_PROG_CC AC_PROG_CC
@@ -19,4 +20,21 @@ AC_ARG_ENABLE([examples],
[], [enable_examples=no]) [], [enable_examples=no])
AM_CONDITIONAL([ENABLE_EXAMPLES], [test "$enable_examples" = yes]) AM_CONDITIONAL([ENABLE_EXAMPLES], [test "$enable_examples" = yes])
# Check for Doxygen and enable its features.
# For details, see m4/ax_prog_doxygen.m4 and
# http://www.bioinf.uni-freiburg.de/~mmann/HowTo/automake.html#doxygenSupport
DX_DOXYGEN_FEATURE(ON)
DX_DOT_FEATURE(OFF)
DX_CHI_FEATURE(OFF)
DX_RTF_FEATURE(OFF)
DX_XML_FEATURE(OFF)
DX_PDF_FEATURE(OFF)
DX_PS_FEATURE(OFF)
DX_CHM_FEATURE(OFF)
DX_HTML_FEATURE(ON)
DX_MAN_FEATURE(OFF)
DX_INIT_DOXYGEN(${PACKAGE_NAME}, [${top_builddir}/doc/Doxyfile], [${top_builddir}/doc])
AM_CONDITIONAL(ENABLE_DOXYGEN,[test "x${DX_FLAG_doc}" = x1])
AM_CONDITIONAL(ENABLE_HTML,[test "x${DX_FLAG_html}" = x1])
AC_OUTPUT AC_OUTPUT
+8
View File
@@ -1,3 +1,11 @@
libuev (2.4.0) stable; urgency=medium
* Add 'struct signalfd_siginfo' to uev_t, valid for signal watchers
* Updated libuev.pc to include GLIBC 2.32 CPPFLAGS for 64-bit time_t
* ABI bump, 2.2.0 -> 3.0.0
-- Joachim Wiberg <troglobit@gmail.com> Sun, 03 Oct 2021 08:28:01 +0200
libuev (2.3.2) stable; urgency=low libuev (2.3.2) stable; urgency=low
* Copyright updates, including LICENSE file, year + author last name * Copyright updates, including LICENSE file, year + author last name
+7 -6
View File
@@ -2,7 +2,8 @@ Source: libuev
Section: libs Section: libs
Priority: optional Priority: optional
Maintainer: Joachim Wiberg <troglobit@gmail.com> Maintainer: Joachim Wiberg <troglobit@gmail.com>
Build-Depends: debhelper (>= 10), libtool Build-Depends: debhelper (>= 10)
Build-Depends-Indep: doxygen
Standards-Version: 4.3.0 Standards-Version: 4.3.0
Homepage: https://github.com/troglobit/libuev/ Homepage: https://github.com/troglobit/libuev/
Vcs-Browser: https://github.com/troglobit/libuev/ Vcs-Browser: https://github.com/troglobit/libuev/
@@ -12,7 +13,7 @@ Package: libuev-dev
Priority: optional Priority: optional
Section: libdevel Section: libdevel
Architecture: any Architecture: any
Depends: ${misc:Depends}, libuev2 (= ${binary:Version}) Depends: ${misc:Depends}, libuev3 (= ${binary:Version})
Description: static library, header files, and docs for libuev Description: static library, header files, and docs for libuev
Static library, header files, and documentation for libuEv Static library, header files, and documentation for libuEv
. .
@@ -24,10 +25,10 @@ Description: static library, header files, and docs for libuev
Experienced developers may appreciate libuEv is built on top of modern Experienced developers may appreciate libuEv is built on top of modern
Linux APIs like epoll, eventfd, timerf, and signalfd. Linux APIs like epoll, eventfd, timerf, and signalfd.
Package: libuev2 Package: libuev3
Replaces: libuev Replaces: libuev, libuev2
Conflicts: libuev Conflicts: libuev, libuev2
Provides: libuev Provides: libuev, libuev2
Architecture: any Architecture: any
Depends: ${misc:Depends}, ${shlibs:Depends} Depends: ${misc:Depends}, ${shlibs:Depends}
Description: Lightweight event loop library for Linux Description: Lightweight event loop library for Linux
+1 -1
View File
@@ -14,7 +14,7 @@ Copyright: 2016-2021 Joachim Wiberg <troglobit@gmail.com>
License: MIT License: MIT
Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk> Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
Copyright (c) 2013-2021 Joachim Wiberg <troglobit()gmail!com> Copyright (c) 2013-2024 Joachim Wiberg <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
Vendored
+1 -1
View File
@@ -1,2 +1,2 @@
API.md doc/API.md
README.md README.md
View File
File renamed without changes.
View File
File renamed without changes.
+2 -2
View File
@@ -1,5 +1,5 @@
libuev.so.2 libuev2 #MINVER# libuev.so.3 libuev3 #MINVER#
* Build-Depends-Package: libite-dev * Build-Depends-Package: libuev-dev
_uev_watcher_active@Base 2.3.0 _uev_watcher_active@Base 2.3.0
_uev_watcher_init@Base 2.3.0 _uev_watcher_init@Base 2.3.0
_uev_watcher_rearm@Base 2.3.0 _uev_watcher_rearm@Base 2.3.0
+3
View File
@@ -0,0 +1,3 @@
html/*
libuev.tag
Doxyfile
+5 -1
View File
@@ -122,7 +122,10 @@ Here is a signal example:
void cleanup_exit(uev_t *w, void *arg, int events) void cleanup_exit(uev_t *w, void *arg, int events)
{ {
if (UEV_ERROR == events) if (UEV_ERROR == events)
puts("Ignoring signal watcher error ..."); puts("Ignoring signal watcher error ...");
else
printf("Got signal (signo %d) from PID %d\n",
w->siginfo.ssi_signo, w->siginfo.ssi_pid);
/* Graceful exit, with optional cleanup ... */ /* Graceful exit, with optional cleanup ... */
uev_exit(w->ctx); uev_exit(w->ctx);
@@ -288,6 +291,7 @@ static void joystick_cb(uev_t *w, void *arg, int events)
/* Possibly joystick was unplugged */ /* Possibly joystick was unplugged */
warnx("Spurious problem with the joystick watcher, restarting."); warnx("Spurious problem with the joystick watcher, restarting.");
uev_io_start(w); uev_io_start(w);
return;
} }
cnt = read(w->fd, &e, sizeof(e)); cnt = read(w->fd, &e, sizeof(e));
+2579
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -5,7 +5,7 @@ Maintenance
----------- -----------
* Encourage contributors to write tests, in particular for new features * Encourage contributors to write tests, in particular for new features
* Run tests regularly, use Travis-CI to do this automatically * Run tests regularly, use GitHub Actions to do this automatically
* Leverage GitHub issues for milestone planning * Leverage GitHub issues for milestone planning
* Reference issues from GitHub pull requests to alert issue subscribers * Reference issues from GitHub pull requests to alert issue subscribers
* Bump library ABI version just before release! * Bump library ABI version just before release!
+22
View File
@@ -0,0 +1,22 @@
dist_doc_DATA = API.md
EXTRA_DIST = Doxyfile.in
DISTCLEANFILES = libuev.tag
if ENABLE_HTML
pkghtmldir = $(docdir)/html
pkghtml_DATA = html/*
#
# Doxygen rules from m4/ax_prog_doxygen.m4
#
@DX_RULES@
$(pkghtml_DATA): doxygen-doc
all-local: doc
clean-local:
-rm -rf html
doc: doxygen-doc
endif
+11
View File
@@ -0,0 +1,11 @@
LibuEv TODO
===========
* Add standard UNIX backend with `select()` and `timer_create()`
See SMCRoute and toolbox for examples
* Port to *BSD kqueue API, <http://en.wikipedia.org/wiki/Kqueue>
Also in UNIX Network Progamming, by W. Richard Stevens 3rd ed.
More porting ideas and help, see the following GitHub issue;
<https://github.com/troglobit/libuev/issues/20>
* Restore Lua bindings now that libuEv itself has stabilized
+6 -4
View File
@@ -1,6 +1,8 @@
joystick
signal
cronrun cronrun
test ctrl
redirect forky
hej.txt hej.txt
joystick
redirect
signal
test
+1 -1
View File
@@ -1,3 +1,3 @@
noinst_PROGRAMS = joystick redirect noinst_PROGRAMS = ctrl forky joystick redirect
AM_CPPFLAGS = -I$(top_srcdir)/src AM_CPPFLAGS = -I$(top_srcdir)/src
LDADD = $(top_srcdir)/src/libuev.la LDADD = $(top_srcdir)/src/libuev.la
+74
View File
@@ -0,0 +1,74 @@
/* Example of how to handle signal, in this case Ctrl-C
*
* A common problem for users of libuEV is how to combine it with the
* traditional aspects of UNIX. Since libuEV is just a wrapper for
* signalfd() and epoll(), in this case, it can be worth a dedicated
* example. After all, command line use with Ctrl-C is one of the most
* common use-cases.
*/
#include <stdio.h>
#include <signal.h>
#include "src/uev.h"
void timeout(uev_t *w, void *arg, int events)
{
(void)arg;
if (UEV_ERROR == events)
puts("Ignoring timer watcher error ...");
puts("Zero Wing was the pinnacle of gaming https://en.wikipedia.org/wiki/Zero_Wing");
}
void teaser(uev_t *w, void *arg, int events)
{
(void)arg;
if (UEV_ERROR == events)
puts("Ignoring SIGINT watcher error ...");
puts("\nCaught SIGINT ...");
puts("Sorry, you actually need to press Ctrl-\\ to exit.");
}
void cleanup(uev_t *w, void *arg, int events)
{
(void)arg;
if (UEV_ERROR == events)
puts("Ignoring signal watcher error ...");
/* Graceful exit, with optional cleanup ... */
puts("\nCaught SIGQUIT, exiting.");
uev_exit(w->ctx);
}
int main(int argc, char **argv)
{
uev_ctx_t ctx;
uev_t timerw;
uev_t sig1w;
uev_t sig2w;
uev_init(&ctx);
/* example worker, a timer callback */
uev_timer_init(&ctx, &timerw, timeout, NULL, 100, 2000);
/* the owls are not what they seem ... */
uev_signal_init(&ctx, &sig1w, teaser, NULL, SIGINT);
uev_signal_init(&ctx, &sig2w, cleanup, NULL, SIGQUIT);
puts("Starting, press Ctrl-C to exit.");
return uev_run(&ctx, 0);
}
/**
* Local Variables:
* compile-command: "make ctrl; ./ctrl"
* c-file-style: "linux"
* End:
*/
+89
View File
@@ -0,0 +1,89 @@
/* Example with fork and signals, in this case Ctrl-C, from terminal
*
* A common problem for users of libuEV is how to combine it with the
* traditional aspects of UNIX. Since libuEV is just a wrapper for
* signalfd() and epoll(), in this case, it can be worth a dedicated
* example. After all, command line use with Ctrl-C is one of the most
* common use-cases.
*/
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include "src/uev.h"
void timeout(uev_t *w, void *arg, int events)
{
char *id = (char *)arg;
if (UEV_ERROR == events)
puts("Ignoring timer watcher error ...");
printf("I am the %s robot\n", id);
}
void teaser(uev_t *w, void *arg, int events)
{
(void)arg;
if (UEV_ERROR == events)
puts("Ignoring SIGINT watcher error ...");
puts("\nWe are here to protect you ...");
puts("Sorry, you actually need to press Ctrl-\\ to exit.");
}
void cleanup(uev_t *w, void *arg, int events)
{
(void)arg;
if (UEV_ERROR == events)
puts("Ignoring signal watcher error ...");
/* Graceful exit, with optional cleanup ... */
puts("\nAgainst the terrible secret of space.");
uev_exit(w->ctx);
}
int main(int argc, char **argv)
{
uev_ctx_t ctx;
uev_t timerw;
uev_t sig1w;
uev_t sig2w;
char *robot;
pid_t pid;
pid = fork();
if (pid == -1)
return 1;
if (pid > 0)
robot = "Shover";
else
robot = "Pusher";
setsid(); /* puts child in new process group */
uev_init(&ctx);
/* example worker, a timer callback */
uev_timer_init(&ctx, &timerw, timeout, robot, 100, 2000);
/* the owls are not what they seem ... */
uev_signal_init(&ctx, &sig1w, teaser, NULL, SIGINT);
uev_signal_init(&ctx, &sig2w, cleanup, NULL, SIGQUIT);
puts("Starting, press Ctrl-C to exit.");
return uev_run(&ctx, 0);
}
/**
* Local Variables:
* compile-command: "make forky; ./forky"
* c-file-style: "linux"
* End:
*/
+1 -1
View File
@@ -1,6 +1,6 @@
/* 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-2021 Joachim Wiberg <troglobit()gmail!com> * Copyright (c) 2014-2024 Joachim Wiberg <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
+5 -1
View File
@@ -1 +1,5 @@
*.m4 libtool.m4
ltoptions.m4
ltsugar.m4
ltversion.m4
lt~obsolete.m4
+585
View File
@@ -0,0 +1,585 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_prog_doxygen.html
# ===========================================================================
#
# SYNOPSIS
#
# DX_INIT_DOXYGEN(PROJECT-NAME, [DOXYFILE-PATH], [OUTPUT-DIR], ...)
# DX_DOXYGEN_FEATURE(ON|OFF)
# DX_DOT_FEATURE(ON|OFF)
# DX_HTML_FEATURE(ON|OFF)
# DX_CHM_FEATURE(ON|OFF)
# DX_CHI_FEATURE(ON|OFF)
# DX_MAN_FEATURE(ON|OFF)
# DX_RTF_FEATURE(ON|OFF)
# DX_XML_FEATURE(ON|OFF)
# DX_PDF_FEATURE(ON|OFF)
# DX_PS_FEATURE(ON|OFF)
#
# DESCRIPTION
#
# The DX_*_FEATURE macros control the default setting for the given
# Doxygen feature. Supported features are 'DOXYGEN' itself, 'DOT' for
# generating graphics, 'HTML' for plain HTML, 'CHM' for compressed HTML
# help (for MS users), 'CHI' for generating a seperate .chi file by the
# .chm file, and 'MAN', 'RTF', 'XML', 'PDF' and 'PS' for the appropriate
# output formats. The environment variable DOXYGEN_PAPER_SIZE may be
# specified to override the default 'a4wide' paper size.
#
# By default, HTML, PDF and PS documentation is generated as this seems to
# be the most popular and portable combination. MAN pages created by
# Doxygen are usually problematic, though by picking an appropriate subset
# and doing some massaging they might be better than nothing. CHM and RTF
# are specific for MS (note that you can't generate both HTML and CHM at
# the same time). The XML is rather useless unless you apply specialized
# post-processing to it.
#
# The macros mainly control the default state of the feature. The use can
# override the default by specifying --enable or --disable. The macros
# ensure that contradictory flags are not given (e.g.,
# --enable-doxygen-html and --enable-doxygen-chm,
# --enable-doxygen-anything with --disable-doxygen, etc.) Finally, each
# feature will be automatically disabled (with a warning) if the required
# programs are missing.
#
# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN
# with the following parameters: a one-word name for the project for use
# as a filename base etc., an optional configuration file name (the
# default is '$(srcdir)/Doxyfile', the same as Doxygen's default), and an
# optional output directory name (the default is 'doxygen-doc'). To run
# doxygen multiple times for different configuration files and output
# directories provide more parameters: the second, forth, sixth, etc
# parameter are configuration file names and the third, fifth, seventh,
# etc parameter are output directories. No checking is done to catch
# duplicates.
#
# Automake Support
#
# The DX_RULES substitution can be used to add all needed rules to the
# Makefile. Note that this is a substitution without being a variable:
# only the @DX_RULES@ syntax will work.
#
# The provided targets are:
#
# doxygen-doc: Generate all doxygen documentation.
#
# doxygen-run: Run doxygen, which will generate some of the
# documentation (HTML, CHM, CHI, MAN, RTF, XML)
# but will not do the post processing required
# for the rest of it (PS, PDF).
#
# doxygen-ps: Generate doxygen PostScript documentation.
#
# doxygen-pdf: Generate doxygen PDF documentation.
#
# Note that by default these are not integrated into the automake targets.
# If doxygen is used to generate man pages, you can achieve this
# integration by setting man3_MANS to the list of man pages generated and
# then adding the dependency:
#
# $(man3_MANS): doxygen-doc
#
# This will cause make to run doxygen and generate all the documentation.
#
# The following variable is intended for use in Makefile.am:
#
# DX_CLEANFILES = everything to clean.
#
# Then add this variable to MOSTLYCLEANFILES.
#
# LICENSE
#
# Copyright (c) 2009 Oren Ben-Kiki <oren@ben-kiki.org>
# Copyright (c) 2015 Olaf Mandel <olaf@mandel.name>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 20
## ----------##
## Defaults. ##
## ----------##
DX_ENV=""
AC_DEFUN([DX_FEATURE_doc], ON)
AC_DEFUN([DX_FEATURE_dot], OFF)
AC_DEFUN([DX_FEATURE_man], OFF)
AC_DEFUN([DX_FEATURE_html], ON)
AC_DEFUN([DX_FEATURE_chm], OFF)
AC_DEFUN([DX_FEATURE_chi], OFF)
AC_DEFUN([DX_FEATURE_rtf], OFF)
AC_DEFUN([DX_FEATURE_xml], OFF)
AC_DEFUN([DX_FEATURE_pdf], ON)
AC_DEFUN([DX_FEATURE_ps], ON)
## --------------- ##
## Private macros. ##
## --------------- ##
# DX_ENV_APPEND(VARIABLE, VALUE)
# ------------------------------
# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen and add it
# as a substitution (but not a Makefile variable). The substitution
# is skipped if the variable name is VERSION.
AC_DEFUN([DX_ENV_APPEND],
[AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])dnl
m4_if([$1], [VERSION], [], [AC_SUBST([$1], [$2])dnl
AM_SUBST_NOTMAKE([$1])])dnl
])
# DX_DIRNAME_EXPR
# ---------------
# Expand into a shell expression prints the directory part of a path.
AC_DEFUN([DX_DIRNAME_EXPR],
[[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']])
# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF)
# -------------------------------------
# Expands according to the M4 (static) status of the feature.
AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])])
# DX_REQUIRE_PROG(VARIABLE, PROGRAM)
# ----------------------------------
# Require the specified program to be found for the DX_CURRENT_FEATURE to work.
AC_DEFUN([DX_REQUIRE_PROG], [
AC_PATH_TOOL([$1], [$2])
if test "$DX_FLAG_[]DX_CURRENT_FEATURE$$1" = 1; then
AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION])
AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0)
fi
])
# DX_TEST_FEATURE(FEATURE)
# ------------------------
# Expand to a shell expression testing whether the feature is active.
AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1])
# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE)
# -------------------------------------------------
# Verify that a required features has the right state before trying to turn on
# the DX_CURRENT_FEATURE.
AC_DEFUN([DX_CHECK_DEPEND], [
test "$DX_FLAG_$1" = "$2" \
|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1,
requires, contradicts) doxygen-DX_CURRENT_FEATURE])
])
# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE)
# ----------------------------------------------------------
# Turn off the DX_CURRENT_FEATURE if the required feature is off.
AC_DEFUN([DX_CLEAR_DEPEND], [
test "$DX_FLAG_$1" = "$2" || AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0)
])
# DX_FEATURE_ARG(FEATURE, DESCRIPTION,
# CHECK_DEPEND, CLEAR_DEPEND,
# REQUIRE, DO-IF-ON, DO-IF-OFF)
# --------------------------------------------
# Parse the command-line option controlling a feature. CHECK_DEPEND is called
# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND),
# otherwise CLEAR_DEPEND is called to turn off the default state if a required
# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional
# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and
# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature.
AC_DEFUN([DX_ARG_ABLE], [
AC_DEFUN([DX_CURRENT_FEATURE], [$1])
AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2])
AC_ARG_ENABLE(doxygen-$1,
[AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1],
[--enable-doxygen-$1]),
DX_IF_FEATURE([$1], [don't $2], [$2]))],
[
case "$enableval" in
#(
y|Y|yes|Yes|YES)
AC_SUBST([DX_FLAG_$1], 1)
$3
;; #(
n|N|no|No|NO)
AC_SUBST([DX_FLAG_$1], 0)
;; #(
*)
AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1])
;;
esac
], [
AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)])
$4
])
if DX_TEST_FEATURE([$1]); then
$5
:
fi
if DX_TEST_FEATURE([$1]); then
$6
:
else
$7
:
fi
])
## -------------- ##
## Public macros. ##
## -------------- ##
# DX_XXX_FEATURE(DEFAULT_STATE)
# -----------------------------
AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])])
AC_DEFUN([DX_DOT_FEATURE], [AC_DEFUN([DX_FEATURE_dot], [$1])])
AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])])
AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])])
AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])])
AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])])
AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])])
AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])])
AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])])
AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])])
AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])])
# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR], ...)
# --------------------------------------------------------------
# PROJECT also serves as the base name for the documentation files.
# The default CONFIG-FILE is "$(srcdir)/Doxyfile" and OUTPUT-DOC-DIR is
# "doxygen-doc".
# More arguments are interpreted as interleaved CONFIG-FILE and
# OUTPUT-DOC-DIR values.
AC_DEFUN([DX_INIT_DOXYGEN], [
# Files:
AC_SUBST([DX_PROJECT], [$1])
AC_SUBST([DX_CONFIG], ['ifelse([$2], [], [$(srcdir)/Doxyfile], [$2])'])
AC_SUBST([DX_DOCDIR], ['ifelse([$3], [], [doxygen-doc], [$3])'])
m4_if(m4_eval(3 < m4_count($@)), 1, [m4_for([DX_i], 4, m4_count($@), 2,
[AC_SUBST([DX_CONFIG]m4_eval(DX_i[/2]),
'm4_default_nblank_quoted(m4_argn(DX_i, $@),
[$(srcdir)/Doxyfile])')])])dnl
m4_if(m4_eval(3 < m4_count($@)), 1, [m4_for([DX_i], 5, m4_count($@,), 2,
[AC_SUBST([DX_DOCDIR]m4_eval([(]DX_i[-1)/2]),
'm4_default_nblank_quoted(m4_argn(DX_i, $@),
[doxygen-doc])')])])dnl
m4_define([DX_loop], m4_dquote(m4_if(m4_eval(3 < m4_count($@)), 1,
[m4_for([DX_i], 4, m4_count($@), 2, [, m4_eval(DX_i[/2])])],
[])))dnl
# Environment variables used inside doxygen.cfg:
DX_ENV_APPEND(SRCDIR, $srcdir)
DX_ENV_APPEND(PROJECT, $DX_PROJECT)
DX_ENV_APPEND(VERSION, $PACKAGE_VERSION)
# Doxygen itself:
DX_ARG_ABLE(doc, [generate any doxygen documentation],
[],
[],
[DX_REQUIRE_PROG([DX_DOXYGEN], doxygen)
DX_REQUIRE_PROG([DX_PERL], perl)],
[DX_ENV_APPEND(PERL_PATH, $DX_PERL)])
# Dot for graphics:
DX_ARG_ABLE(dot, [generate graphics for doxygen documentation],
[DX_CHECK_DEPEND(doc, 1)],
[DX_CLEAR_DEPEND(doc, 1)],
[DX_REQUIRE_PROG([DX_DOT], dot)],
[DX_ENV_APPEND(HAVE_DOT, YES)
DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])],
[DX_ENV_APPEND(HAVE_DOT, NO)])
# Man pages generation:
DX_ARG_ABLE(man, [generate doxygen manual pages],
[DX_CHECK_DEPEND(doc, 1)],
[DX_CLEAR_DEPEND(doc, 1)],
[],
[DX_ENV_APPEND(GENERATE_MAN, YES)],
[DX_ENV_APPEND(GENERATE_MAN, NO)])
# RTF file generation:
DX_ARG_ABLE(rtf, [generate doxygen RTF documentation],
[DX_CHECK_DEPEND(doc, 1)],
[DX_CLEAR_DEPEND(doc, 1)],
[],
[DX_ENV_APPEND(GENERATE_RTF, YES)],
[DX_ENV_APPEND(GENERATE_RTF, NO)])
# XML file generation:
DX_ARG_ABLE(xml, [generate doxygen XML documentation],
[DX_CHECK_DEPEND(doc, 1)],
[DX_CLEAR_DEPEND(doc, 1)],
[],
[DX_ENV_APPEND(GENERATE_XML, YES)],
[DX_ENV_APPEND(GENERATE_XML, NO)])
# (Compressed) HTML help generation:
DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation],
[DX_CHECK_DEPEND(doc, 1)],
[DX_CLEAR_DEPEND(doc, 1)],
[DX_REQUIRE_PROG([DX_HHC], hhc)],
[DX_ENV_APPEND(HHC_PATH, $DX_HHC)
DX_ENV_APPEND(GENERATE_HTML, YES)
DX_ENV_APPEND(GENERATE_HTMLHELP, YES)],
[DX_ENV_APPEND(GENERATE_HTMLHELP, NO)])
# Seperate CHI file generation.
DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file],
[DX_CHECK_DEPEND(chm, 1)],
[DX_CLEAR_DEPEND(chm, 1)],
[],
[DX_ENV_APPEND(GENERATE_CHI, YES)],
[DX_ENV_APPEND(GENERATE_CHI, NO)])
# Plain HTML pages generation:
DX_ARG_ABLE(html, [generate doxygen plain HTML documentation],
[DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)],
[DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)],
[],
[DX_ENV_APPEND(GENERATE_HTML, YES)],
[DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)])
# PostScript file generation:
DX_ARG_ABLE(ps, [generate doxygen PostScript documentation],
[DX_CHECK_DEPEND(doc, 1)],
[DX_CLEAR_DEPEND(doc, 1)],
[DX_REQUIRE_PROG([DX_LATEX], latex)
DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
DX_REQUIRE_PROG([DX_DVIPS], dvips)
DX_REQUIRE_PROG([DX_EGREP], egrep)])
# PDF file generation:
DX_ARG_ABLE(pdf, [generate doxygen PDF documentation],
[DX_CHECK_DEPEND(doc, 1)],
[DX_CLEAR_DEPEND(doc, 1)],
[DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex)
DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
DX_REQUIRE_PROG([DX_EGREP], egrep)])
# LaTeX generation for PS and/or PDF:
if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then
DX_ENV_APPEND(GENERATE_LATEX, YES)
else
DX_ENV_APPEND(GENERATE_LATEX, NO)
fi
# Paper size for PS and/or PDF:
AC_ARG_VAR(DOXYGEN_PAPER_SIZE,
[a4wide (default), a4, letter, legal or executive])
case "$DOXYGEN_PAPER_SIZE" in
#(
"")
AC_SUBST(DOXYGEN_PAPER_SIZE, "")
;; #(
a4wide|a4|letter|legal|executive)
DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE)
;; #(
*)
AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'])
;;
esac
# Rules:
AS_IF([[test $DX_FLAG_html -eq 1]],
[[DX_SNIPPET_html="## ------------------------------- ##
## Rules specific for HTML output. ##
## ------------------------------- ##
DX_CLEAN_HTML = \$(DX_DOCDIR)/html]dnl
m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
\$(DX_DOCDIR]DX_i[)/html]])[
"]],
[[DX_SNIPPET_html=""]])
AS_IF([[test $DX_FLAG_chi -eq 1]],
[[DX_SNIPPET_chi="
DX_CLEAN_CHI = \$(DX_DOCDIR)/\$(PACKAGE).chi]dnl
m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).chi]])["]],
[[DX_SNIPPET_chi=""]])
AS_IF([[test $DX_FLAG_chm -eq 1]],
[[DX_SNIPPET_chm="## ------------------------------ ##
## Rules specific for CHM output. ##
## ------------------------------ ##
DX_CLEAN_CHM = \$(DX_DOCDIR)/chm]dnl
m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
\$(DX_DOCDIR]DX_i[)/chm]])[\
${DX_SNIPPET_chi}
"]],
[[DX_SNIPPET_chm=""]])
AS_IF([[test $DX_FLAG_man -eq 1]],
[[DX_SNIPPET_man="## ------------------------------ ##
## Rules specific for MAN output. ##
## ------------------------------ ##
DX_CLEAN_MAN = \$(DX_DOCDIR)/man]dnl
m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
\$(DX_DOCDIR]DX_i[)/man]])[
"]],
[[DX_SNIPPET_man=""]])
AS_IF([[test $DX_FLAG_rtf -eq 1]],
[[DX_SNIPPET_rtf="## ------------------------------ ##
## Rules specific for RTF output. ##
## ------------------------------ ##
DX_CLEAN_RTF = \$(DX_DOCDIR)/rtf]dnl
m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
\$(DX_DOCDIR]DX_i[)/rtf]])[
"]],
[[DX_SNIPPET_rtf=""]])
AS_IF([[test $DX_FLAG_xml -eq 1]],
[[DX_SNIPPET_xml="## ------------------------------ ##
## Rules specific for XML output. ##
## ------------------------------ ##
DX_CLEAN_XML = \$(DX_DOCDIR)/xml]dnl
m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
\$(DX_DOCDIR]DX_i[)/xml]])[
"]],
[[DX_SNIPPET_xml=""]])
AS_IF([[test $DX_FLAG_ps -eq 1]],
[[DX_SNIPPET_ps="## ----------------------------- ##
## Rules specific for PS output. ##
## ----------------------------- ##
DX_CLEAN_PS = \$(DX_DOCDIR)/\$(PACKAGE).ps]dnl
m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).ps]])[
DX_PS_GOAL = doxygen-ps
doxygen-ps: \$(DX_CLEAN_PS)
]m4_foreach([DX_i], [DX_loop],
[[\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).ps: \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag
\$(DX_V_LATEX)cd \$(DX_DOCDIR]DX_i[)/latex; \\
rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \\
\$(DX_LATEX) refman.tex; \\
\$(DX_MAKEINDEX) refman.idx; \\
\$(DX_LATEX) refman.tex; \\
countdown=5; \\
while \$(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \\
refman.log > /dev/null 2>&1 \\
&& test \$\$countdown -gt 0; do \\
\$(DX_LATEX) refman.tex; \\
countdown=\`expr \$\$countdown - 1\`; \\
done; \\
\$(DX_DVIPS) -o ../\$(PACKAGE).ps refman.dvi
]])["]],
[[DX_SNIPPET_ps=""]])
AS_IF([[test $DX_FLAG_pdf -eq 1]],
[[DX_SNIPPET_pdf="## ------------------------------ ##
## Rules specific for PDF output. ##
## ------------------------------ ##
DX_CLEAN_PDF = \$(DX_DOCDIR)/\$(PACKAGE).pdf]dnl
m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).pdf]])[
DX_PDF_GOAL = doxygen-pdf
doxygen-pdf: \$(DX_CLEAN_PDF)
]m4_foreach([DX_i], [DX_loop],
[[\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).pdf: \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag
\$(DX_V_LATEX)cd \$(DX_DOCDIR]DX_i[)/latex; \\
rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \\
\$(DX_PDFLATEX) refman.tex; \\
\$(DX_MAKEINDEX) refman.idx; \\
\$(DX_PDFLATEX) refman.tex; \\
countdown=5; \\
while \$(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \\
refman.log > /dev/null 2>&1 \\
&& test \$\$countdown -gt 0; do \\
\$(DX_PDFLATEX) refman.tex; \\
countdown=\`expr \$\$countdown - 1\`; \\
done; \\
mv refman.pdf ../\$(PACKAGE).pdf
]])["]],
[[DX_SNIPPET_pdf=""]])
AS_IF([[test $DX_FLAG_ps -eq 1 -o $DX_FLAG_pdf -eq 1]],
[[DX_SNIPPET_latex="## ------------------------------------------------- ##
## Rules specific for LaTeX (shared for PS and PDF). ##
## ------------------------------------------------- ##
DX_V_LATEX = \$(_DX_v_LATEX_\$(V))
_DX_v_LATEX_ = \$(_DX_v_LATEX_\$(AM_DEFAULT_VERBOSITY))
_DX_v_LATEX_0 = @echo \" LATEX \" \$][@;
DX_CLEAN_LATEX = \$(DX_DOCDIR)/latex]dnl
m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
\$(DX_DOCDIR]DX_i[)/latex]])[
"]],
[[DX_SNIPPET_latex=""]])
AS_IF([[test $DX_FLAG_doc -eq 1]],
[[DX_SNIPPET_doc="## --------------------------------- ##
## Format-independent Doxygen rules. ##
## --------------------------------- ##
${DX_SNIPPET_html}\
${DX_SNIPPET_chm}\
${DX_SNIPPET_man}\
${DX_SNIPPET_rtf}\
${DX_SNIPPET_xml}\
${DX_SNIPPET_ps}\
${DX_SNIPPET_pdf}\
${DX_SNIPPET_latex}\
DX_V_DXGEN = \$(_DX_v_DXGEN_\$(V))
_DX_v_DXGEN_ = \$(_DX_v_DXGEN_\$(AM_DEFAULT_VERBOSITY))
_DX_v_DXGEN_0 = @echo \" DXGEN \" \$<;
.PHONY: doxygen-run doxygen-doc \$(DX_PS_GOAL) \$(DX_PDF_GOAL)
.INTERMEDIATE: doxygen-run \$(DX_PS_GOAL) \$(DX_PDF_GOAL)
doxygen-run:]m4_foreach([DX_i], [DX_loop],
[[ \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag]])[
doxygen-doc: doxygen-run \$(DX_PS_GOAL) \$(DX_PDF_GOAL)
]m4_foreach([DX_i], [DX_loop],
[[\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag: \$(DX_CONFIG]DX_i[) \$(pkginclude_HEADERS)
\$(DX_V_DXGEN)\$(DX_ENV) DOCDIR=\$(DX_DOCDIR]DX_i[) \$(DX_DOXYGEN) \$(DX_CONFIG]DX_i[)
\$(A""M_V_at)echo Timestamp >\$][@
]])dnl
[DX_CLEANFILES = \\]
m4_foreach([DX_i], [DX_loop],
[[ \$(DX_DOCDIR]DX_i[)/doxygen_sqlite3.db \\
\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag \\
]])dnl
[ -r \\
\$(DX_CLEAN_HTML) \\
\$(DX_CLEAN_CHM) \\
\$(DX_CLEAN_CHI) \\
\$(DX_CLEAN_MAN) \\
\$(DX_CLEAN_RTF) \\
\$(DX_CLEAN_XML) \\
\$(DX_CLEAN_PS) \\
\$(DX_CLEAN_PDF) \\
\$(DX_CLEAN_LATEX)"]],
[[DX_SNIPPET_doc=""]])
AC_SUBST([DX_RULES],
["${DX_SNIPPET_doc}"])dnl
AM_SUBST_NOTMAKE([DX_RULES])
#For debugging:
#echo DX_FLAG_doc=$DX_FLAG_doc
#echo DX_FLAG_dot=$DX_FLAG_dot
#echo DX_FLAG_man=$DX_FLAG_man
#echo DX_FLAG_html=$DX_FLAG_html
#echo DX_FLAG_chm=$DX_FLAG_chm
#echo DX_FLAG_chi=$DX_FLAG_chi
#echo DX_FLAG_rtf=$DX_FLAG_rtf
#echo DX_FLAG_xml=$DX_FLAG_xml
#echo DX_FLAG_pdf=$DX_FLAG_pdf
#echo DX_FLAG_ps=$DX_FLAG_ps
#echo DX_ENV=$DX_ENV
])
+2 -2
View File
@@ -1,8 +1,8 @@
lib_LTLIBRARIES = libuev.la lib_LTLIBRARIES = libuev.la
libuev_la_SOURCES = uev.c uev.h private.h io.c timer.c signal.c cron.c event.c libuev_la_SOURCES = uev.c uev.h private.h io.c timer.c signal.c cron.c event.c
libuev_la_CPPFLAGS = -D_GNU_SOURCE -D_TIME_BITS=64 libuev_la_CPPFLAGS = -D_GNU_SOURCE -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64
libuev_la_CFLAGS = -W -Wall -Wextra -std=gnu11 libuev_la_CFLAGS = -W -Wall -Wextra -std=gnu11
libuev_la_LDFLAGS = $(AM_LDFLAGS) -version-info 4:0:2 libuev_la_LDFLAGS = $(AM_LDFLAGS) -version-info 3:0:0
noinst_PROGRAMS = bench noinst_PROGRAMS = bench
bench_CPPFLAGS = -D_GNU_SOURCE bench_CPPFLAGS = -D_GNU_SOURCE
+1 -1
View File
@@ -1 +1 @@
../API.md ../doc/API.md
+16 -12
View File
@@ -1,7 +1,7 @@
/* 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-2021 Joachim Wiberg <troglobit()gmail!com> * Copyright (c) 2013-2024 Joachim Wiberg <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
@@ -37,6 +37,10 @@
#define TFD_SETTIME_FLAGS (TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET) #define TFD_SETTIME_FLAGS (TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET)
#endif #endif
/**
* At/Cron like timers.
* @file cron.c
*/
/** /**
* Create and start an at/cron job watcher * Create and start an at/cron job watcher
@@ -44,20 +48,20 @@
* @param w Pointer to an uev_t watcher * @param w Pointer to an uev_t watcher
* @param cb Callback function for cron job * @param cb Callback function for cron job
* @param arg Optional callback argument * @param arg Optional callback argument
* @param when First point in time to call @param cb * @param when First point in time to call @p cb
* @param interval For an at job this is zero, for cron the offset interval * @param interval For an at job this is zero, for cron the offset interval
* *
* For at jobs set @param interval to zero and only use @param when. For * For at jobs set @p interval to zero and only use @p when. For
* cron jobs, set @param interval to the offset. E.g., if the job should * cron jobs, set @p interval to the offset. E.g., if the job should
* run every five minutes set the @param tm_min of struct tm to five. * run every five minutes set the @p tm_min of struct tm to five.
* *
* Use mktime() to create the time_t arguments. The special value zero * Use mktime() to create the time_t arguments. The special value zero
* may be used for @param when to denote 'now', where 'now' is when the * may be used for @p when to denote 'now', where 'now' is when the
* event loop is started. You can also treat time_t simply as a signed * event loop is started. You can also treat time_t simply as a signed
* integer. E.g., set @param interval to 3600 to create a cron job that * integer. E.g., set @p interval to 3600 to create a cron job that
* runs every hour. * runs every hour.
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_cron_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, time_t when, time_t interval) int uev_cron_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, time_t when, time_t interval)
{ {
@@ -88,10 +92,10 @@ int uev_cron_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, time_t when
/** /**
* Reset an at/cron job watcher * Reset an at/cron job watcher
* @param w Watcher to reset * @param w Watcher to reset
* @param when First point in time to call @param cb * @param when First point in time to call @p cb
* @param interval For an at job this is zero, for cron the offset interval * @param interval For an at job this is zero, for cron the offset interval
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_cron_set(uev_t *w, time_t when, time_t interval) int uev_cron_set(uev_t *w, time_t when, time_t interval)
{ {
@@ -136,7 +140,7 @@ int uev_cron_set(uev_t *w, time_t when, time_t interval)
* Start a stopped at/cron job watcher * Start a stopped at/cron job watcher
* @param w Watcher to start (again) * @param w Watcher to start (again)
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_cron_start(uev_t *w) int uev_cron_start(uev_t *w)
{ {
@@ -147,7 +151,7 @@ int uev_cron_start(uev_t *w)
* Stop and unregister an at/cron job watcher * Stop and unregister an at/cron job watcher
* @param w Watcher to stop * @param w Watcher to stop
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_cron_stop(uev_t *w) int uev_cron_stop(uev_t *w)
{ {
+9 -4
View File
@@ -1,7 +1,7 @@
/* 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-2021 Joachim Wiberg <troglobit()gmail!com> * Copyright (c) 2013-2024 Joachim Wiberg <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
@@ -29,6 +29,11 @@
#include "uev.h" #include "uev.h"
/**
* Linux [eventfd(2)](https://man7.org/linux/man-pages/man2/eventfd.2.html).
* @file event.c
*/
/** /**
* Create a generic event watcher * Create a generic event watcher
* @param ctx A valid libuEv context * @param ctx A valid libuEv context
@@ -36,7 +41,7 @@
* @param cb Callback when an event is posted * @param cb Callback when an event is posted
* @param arg Optional callback argument * @param arg Optional callback argument
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_event_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg) int uev_event_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg)
{ {
@@ -60,7 +65,7 @@ int uev_event_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg)
* Post a generic event * Post a generic event
* @param w Watcher to post to * @param w Watcher to post to
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_event_post(uev_t *w) int uev_event_post(uev_t *w)
{ {
@@ -82,7 +87,7 @@ int uev_event_post(uev_t *w)
* Stop a generic event watcher * Stop a generic event watcher
* @param w Watcher to stop * @param w Watcher to stop
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_event_stop(uev_t *w) int uev_event_stop(uev_t *w)
{ {
+11 -7
View File
@@ -1,7 +1,7 @@
/* 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-2021 Joachim Wiberg <troglobit()gmail!com> * Copyright (c) 2013-2024 Joachim Wiberg <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
@@ -25,6 +25,10 @@
#include <errno.h> #include <errno.h>
#include "uev.h" #include "uev.h"
/**
* Descriptor backend, capable of watching files, sockets, pipes, etc.
* @file io.c
*/
/** /**
* Create an I/O watcher * Create an I/O watcher
@@ -33,9 +37,9 @@
* @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 Events to watch for: %UEV_READ, %UEV_WRITE, %UEV_EDGE, %UEV_ONESHOW * @param events Events to watch for: ::UEV_READ, ::UEV_WRITE, ::UEV_EDGE, ::UEV_ONESHOT
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_io_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int fd, int events) int uev_io_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int fd, int events)
{ {
@@ -54,9 +58,9 @@ int uev_io_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int fd, int e
* Reset an I/O watcher * Reset an I/O watcher
* @param w Pointer to an uev_t watcher * @param w Pointer to an uev_t watcher
* @param fd New file descriptor to monitor * @param fd New file descriptor to monitor
* @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 and ::UEV_WRITE
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_io_set(uev_t *w, int fd, int events) int uev_io_set(uev_t *w, int fd, int events)
{ {
@@ -73,7 +77,7 @@ int uev_io_set(uev_t *w, int fd, int events)
* Start an I/O watcher * Start an I/O watcher
* @param w Watcher to start (again) * @param w Watcher to start (again)
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_io_start(uev_t *w) int uev_io_start(uev_t *w)
{ {
@@ -84,7 +88,7 @@ int uev_io_start(uev_t *w)
* Stop an I/O watcher * Stop an I/O watcher
* @param w Watcher to stop * @param w Watcher to stop
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_io_stop(uev_t *w) int uev_io_stop(uev_t *w)
{ {
+1 -1
View File
@@ -8,5 +8,5 @@ Description: Simple event loop for Linux
Version: @VERSION@ Version: @VERSION@
Requires: Requires:
Libs: -L${libdir} -luev Libs: -L${libdir} -luev
Cflags: -I${includedir} Cflags: -I${includedir} -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64
+6 -5
View File
@@ -1,7 +1,7 @@
/* libuEv - Private methods and data types, do not use directly! /* libuEv - Private methods and data types, do not use directly!
* *
* Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk> * Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
* Copyright (c) 2013-2021 Joachim Wiberg <troglobit()gmail!com> * Copyright (c) 2013-2024 Joachim Wiberg <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
@@ -27,6 +27,7 @@
#include <stdio.h> #include <stdio.h>
#include <sys/epoll.h> #include <sys/epoll.h>
#include <sys/signalfd.h>
/* /*
* List functions. * List functions.
@@ -73,14 +74,14 @@ typedef enum {
#define UEV_EVENT_MASK (UEV_ERROR | UEV_READ | UEV_WRITE | UEV_PRI | \ #define UEV_EVENT_MASK (UEV_ERROR | UEV_READ | UEV_WRITE | UEV_PRI | \
UEV_RDHUP | UEV_HUP | UEV_EDGE | UEV_ONESHOT) UEV_RDHUP | UEV_HUP | UEV_EDGE | UEV_ONESHOT)
/* Main libuEv context type */ /* Main libuEv context type, internal use only! */
typedef struct { struct uev_ctx {
int running; int running;
int fd; /* For epoll() */ int fd; /* For epoll() */
int maxevents; /* For epoll() */ int maxevents; /* For epoll() */
struct uev *watchers; struct uev *watchers;
uint32_t workaround; /* For workarounds, e.g. redirected stdin */ uint32_t workaround; /* For workarounds, e.g. redirected stdin */
} uev_ctx_t; };
/* Forward declare due to dependencys, don't try this at home kids. */ /* Forward declare due to dependencys, don't try this at home kids. */
struct uev; struct uev;
@@ -115,7 +116,7 @@ struct uev;
uev_type_t uev_type_t
/* Internal API for dealing with generic watchers */ /* Internal API for dealing with generic watchers */
int _uev_watcher_init (uev_ctx_t *ctx, struct uev *w, uev_type_t type, int _uev_watcher_init (struct uev_ctx *ctx, struct uev *w, uev_type_t type,
void (*cb)(struct uev *, void *, int), void *arg, void (*cb)(struct uev *, void *, int), void *arg,
int fd, int events); int fd, int events);
int _uev_watcher_start (struct uev *w); int _uev_watcher_start (struct uev *w);
+14 -5
View File
@@ -1,7 +1,7 @@
/* 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-2021 Joachim Wiberg <troglobit()gmail!com> * Copyright (c) 2013-2024 Joachim Wiberg <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
@@ -29,6 +29,15 @@
#include "uev.h" #include "uev.h"
/**
* @file signal.c
* Linux [signalfd(2)](https://man7.org/linux/man-pages/man2/signalfd.2.html).
*
* Notice how uev::siginfo returns a `struct signalfd_siginfo` with useful data
* on the sender of the signal, this information is only available to signal
* callbacks.
*/
/** /**
* Create a signal watcher * Create a signal watcher
@@ -38,7 +47,7 @@
* @param arg Optional callback argument * @param arg Optional callback argument
* @param signo Signal to watch for * @param signo Signal to watch for
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_signal_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int signo) int uev_signal_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int signo)
{ {
@@ -74,7 +83,7 @@ int uev_signal_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int signo
* @param w Watcher to reset * @param w Watcher to reset
* @param signo New signal to watch for * @param signo New signal to watch for
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_signal_set(uev_t *w, int signo) int uev_signal_set(uev_t *w, int signo)
{ {
@@ -114,7 +123,7 @@ int uev_signal_set(uev_t *w, int signo)
* Start a stopped signal watcher * Start a stopped signal watcher
* @param w Watcher to start (again) * @param w Watcher to start (again)
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_signal_start(uev_t *w) int uev_signal_start(uev_t *w)
{ {
@@ -133,7 +142,7 @@ int uev_signal_start(uev_t *w)
* Stop a signal watcher * Stop a signal watcher
* @param w Watcher to stop * @param w Watcher to stop
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_signal_stop(uev_t *w) int uev_signal_stop(uev_t *w)
{ {
+24 -19
View File
@@ -1,7 +1,7 @@
/* 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-2021 Joachim Wiberg <troglobit()gmail!com> * Copyright (c) 2013-2024 Joachim Wiberg <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
@@ -28,6 +28,11 @@
#include "uev.h" #include "uev.h"
/**
* Monotonic timers, Linux [timerfd(2)](https://man7.org/linux/man-pages/man2/timerfd_create.2.html)
* @file timer.c
*/
static void msec2tspec(int msec, struct timespec *ts) static void msec2tspec(int msec, struct timespec *ts)
{ {
@@ -46,28 +51,28 @@ static void msec2tspec(int msec, struct timespec *ts)
* @param w Pointer to an uev_t watcher * @param w Pointer to an uev_t watcher
* @param cb Callback function * @param cb Callback function
* @param arg Optional callback argument * @param arg Optional callback argument
* @param timeout Timeout in milliseconds before @param cb is called * @param timeout Timeout in milliseconds before @p cb is called
* @param period For periodic timers this is the period time that @param timeout is reset to * @param period For periodic timers this is the period time that @p timeout is reset to
* *
* This function creates, and optionally starts, a timer watcher. There * This function creates, and optionally starts, a timer watcher. There
* are two types of timers: one-shot and periodic. * are two types of timers: one-shot and periodic.
* *
* One-shot timers only use @param timeout, @param period is zero. * One-shot timers only use @p timeout, @p period is zero.
* *
* Periodic timers can either start their life disabled, with @param * Periodic timers can either start their life disabled, with @p timeout
* timeout set to zero, or with the same value as @param period. * set to zero, or with the same value as @p period.
* *
* When the timeout expires, for either of the two types, @param cb is * When the timeout expires, for either of the two types, @p cb is
* called, with the optional @param arg argument. A one-shot timer ends * called, with the optional @p arg argument. A one-shot timer ends its
* its life there, while a periodic task's @param timeout is reset to * life there, while a periodic task's @p timeout is reset to the @p
* the @param period and restarted. * period and restarted.
* *
* A timer is automatically started if the event loop is already * A timer is automatically started if the event loop is already
* running, otherwise it is kept on hold until triggered by calling * running, otherwise it is kept on hold until triggered by calling
* uev_run(). * uev_run().
* *
* @see uev_timer_set * @see uev_timer_set
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_timer_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int timeout, int period) int uev_timer_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int timeout, int period)
{ {
@@ -99,14 +104,14 @@ int uev_timer_init(uev_ctx_t *ctx, uev_t *w, uev_cb_t *cb, void *arg, int timeou
/** /**
* Reset a timer * Reset a timer
* @param w Watcher to reset * @param w Watcher to reset
* @param timeout Timeout in milliseconds before @param cb is called, zero disarms timer * @param timeout Timeout in milliseconds before @p cb is called, zero disarms timer
* @param period For periodic timers this is the period time that @param timeout is reset to * @param period For periodic timers this is the period time that @p timeout is reset to
* *
* Note, the @param timeout value must be non-zero. Setting it to zero * Note, the @p timeout value must be non-zero. Setting it to zero
* will disarm the timer. This is the underlying Linux function @func * disarms the timer. This is the behavior of the underlying Linux
* timerfd_settimer() which has this behavior. * function [timerfd_settimer(2)](https://man7.org/linux/man-pages/man2/timerfd_settime.2.html)
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_timer_set(uev_t *w, int timeout, int period) int uev_timer_set(uev_t *w, int timeout, int period)
{ {
@@ -150,7 +155,7 @@ int uev_timer_set(uev_t *w, int timeout, int period)
* Start a stopped timer watcher * Start a stopped timer watcher
* @param w Watcher to start (again) * @param w Watcher to start (again)
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_timer_start(uev_t *w) int uev_timer_start(uev_t *w)
{ {
@@ -169,7 +174,7 @@ int uev_timer_start(uev_t *w)
* Stop and unregister a timer watcher * Stop and unregister a timer watcher
* @param w Watcher to stop * @param w Watcher to stop
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_timer_stop(uev_t *w) int uev_timer_stop(uev_t *w)
{ {
+34 -19
View File
@@ -1,7 +1,7 @@
/* 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-2021 Joachim Wiberg <troglobit()gmail!com> * Copyright (c) 2013-2024 Joachim Wiberg <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
@@ -22,6 +22,11 @@
* THE SOFTWARE. * THE SOFTWARE.
*/ */
/** Micro event loop library
* @file uev.c
*
*/
#include <errno.h> #include <errno.h>
#include <fcntl.h> /* O_CLOEXEC */ #include <fcntl.h> /* O_CLOEXEC */
#include <string.h> /* memset() */ #include <string.h> /* memset() */
@@ -178,8 +183,8 @@ int _uev_watcher_rearm(uev_t *w)
* Create an event loop context * Create an event loop context
* @param ctx Pointer to an uev_ctx_t context to be initialized * @param ctx Pointer to an uev_ctx_t context to be initialized
* *
* This function calls @func uev_init1() with @param maxevents set to * This function calls uev_init1() with @p maxevents set to
* @const UEV_MAX_EVENTS. * ::UEV_MAX_EVENTS
* *
* @return POSIX OK(0) on success, or non-zero on error. * @return POSIX OK(0) on success, or non-zero on error.
*/ */
@@ -190,11 +195,11 @@ int uev_init(uev_ctx_t *ctx)
/** /**
* Create an event loop context * Create an event loop context
* @param ctx Pointer to an uev_ctx_t context to be initialized * @param ctx Pointer to an uev_ctx_t context to be initialized
* @param maxevents Maximum number of events in event cache * @param maxevents Maximum number of events in event cache [1, 10]
* *
* This function is the same as @func uev_init() except for the * This function is the same as uev_init() except for the @p maxevents
* @param maxevents argument, which controls the number of events * argument, max ::UEV_MAX_EVENTS, which controls the number of events
* in the event cache returned to the main loop. * in the event cache returned to the main loop.
* *
* In cases where you have multiple events pending in the cache and some * In cases where you have multiple events pending in the cache and some
@@ -202,10 +207,11 @@ int uev_init(uev_ctx_t *ctx)
* to be deleted the pointer returned to the event loop for this later * to be deleted the pointer returned to the event loop for this later
* event may be deleted. * event may be deleted.
* *
* There are two ways around this (accessing deleted memory); 1) use * There are two ways around this (accessing deleted memory):
* this function to initialize your event loop and set @param maxevents * -# use this function to initialize your event loop and set
* to 1, 2) use a free list in you application that you garbage collect * @p maxevents to 1
* at intervals relevant to your application. * -# use a free list in you application that you garbage collect
* at intervals relevant to your application
* *
* @return POSIX OK(0) on success, or non-zero on error. * @return POSIX OK(0) on success, or non-zero on error.
*/ */
@@ -216,6 +222,9 @@ int uev_init1(uev_ctx_t *ctx, int maxevents)
return -1; return -1;
} }
if (maxevents > UEV_MAX_EVENTS)
maxevents = UEV_MAX_EVENTS;
memset(ctx, 0, sizeof(*ctx)); memset(ctx, 0, sizeof(*ctx));
ctx->maxevents = maxevents; ctx->maxevents = maxevents;
@@ -226,7 +235,7 @@ int uev_init1(uev_ctx_t *ctx, int maxevents)
* Terminate the event loop * Terminate the event loop
* @param ctx A valid libuEv context * @param ctx A valid libuEv context
* *
* @return POSIX OK(0) or non-zero with @param errno set on error. * @return POSIX OK(0) or non-zero with @p errno set on error.
*/ */
int uev_exit(uev_ctx_t *ctx) int uev_exit(uev_ctx_t *ctx)
{ {
@@ -276,11 +285,11 @@ int uev_exit(uev_ctx_t *ctx)
/** /**
* Start the event loop * Start the event loop
* @param ctx A valid libuEv context * @param ctx A valid libuEv context
* @param flags A mask of %UEV_ONCE and %UEV_NONBLOCK, or zero * @param flags A mask of ::UEV_ONCE and ::UEV_NONBLOCK, or zero
* *
* With @flags set to %UEV_ONCE the event loop returns after the first * With @p flags set to ::UEV_ONCE the event loop returns after the first
* event has been served, useful for instance to set a timeout on a file * event has been served, useful for instance to set a timeout on a file
* descriptor. If @flags also has the %UEV_NONBLOCK flag set the event * descriptor. If @p flags also has the ::UEV_NONBLOCK flag set the event
* loop will return immediately if no event is pending, useful when run * loop will return immediately if no event is pending, useful when run
* inside another event loop. * inside another event loop.
* *
@@ -289,8 +298,8 @@ int uev_exit(uev_ctx_t *ctx)
*/ */
int uev_run(uev_ctx_t *ctx, int flags) int uev_run(uev_ctx_t *ctx, int flags)
{ {
uev_t *w;
int timeout = -1; int timeout = -1;
uev_t *w;
if (!ctx || ctx->fd < 0) { if (!ctx || ctx->fd < 0) {
errno = EINVAL; errno = EINVAL;
@@ -313,8 +322,12 @@ int uev_run(uev_ctx_t *ctx, int flags)
while (ctx->running && ctx->watchers) { while (ctx->running && ctx->watchers) {
struct epoll_event ee[UEV_MAX_EVENTS]; struct epoll_event ee[UEV_MAX_EVENTS];
int maxevents = ctx->maxevents;
int i, nfds, rerun = 0; int i, nfds, rerun = 0;
if (maxevents > UEV_MAX_EVENTS)
maxevents = UEV_MAX_EVENTS;
/* Handle special case: `application < file.txt` */ /* Handle special case: `application < file.txt` */
if (ctx->workaround) { if (ctx->workaround) {
_UEV_FOREACH(w, ctx->watchers) { _UEV_FOREACH(w, ctx->watchers) {
@@ -335,7 +348,7 @@ int uev_run(uev_ctx_t *ctx, int flags)
continue; continue;
ctx->workaround = 0; ctx->workaround = 0;
while ((nfds = epoll_wait(ctx->fd, ee, ctx->maxevents, timeout)) < 0) { while ((nfds = epoll_wait(ctx->fd, ee, maxevents, timeout)) < 0) {
if (!ctx->running) if (!ctx->running)
break; break;
@@ -350,9 +363,9 @@ int uev_run(uev_ctx_t *ctx, int flags)
for (i = 0; ctx->running && i < nfds; i++) { for (i = 0; ctx->running && i < nfds; i++) {
struct signalfd_siginfo fdsi; struct signalfd_siginfo fdsi;
ssize_t sz = sizeof(fdsi);
uint32_t events; uint32_t events;
uint64_t exp; uint64_t exp;
ssize_t sz = sizeof(fdsi);
w = (uev_t *)ee[i].data.ptr; w = (uev_t *)ee[i].data.ptr;
events = ee[i].events; events = ee[i].events;
@@ -369,7 +382,9 @@ int uev_run(uev_ctx_t *ctx, int flags)
uev_signal_stop(w); uev_signal_stop(w);
events = UEV_ERROR; events = UEV_ERROR;
} }
} memset(&w->siginfo, 0, sizeof(w->siginfo));
} else
w->siginfo = fdsi;
break; break;
case UEV_TIMER_TYPE: case UEV_TIMER_TYPE:
+48 -25
View File
@@ -1,7 +1,7 @@
/* 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-2021 Joachim Wiberg <troglobit()gmail!com> * Copyright (c) 2013-2024 Joachim Wiberg <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
@@ -22,60 +22,83 @@
* THE SOFTWARE. * THE SOFTWARE.
*/ */
/**
* Micro event loop library
* @file uev.h
* @author Flemming Madsen (2012)
* @author Joachim Wiberg (2013-2021)
* @copyright MIT License
*
* The latest version of this manual and the libuEv software are
* available at https://github.com/troglobit/libuEv/
*/
#ifndef LIBUEV_UEV_H_ #ifndef LIBUEV_UEV_H_
#define LIBUEV_UEV_H_ #define LIBUEV_UEV_H_
#include "private.h" #include "private.h"
/* Max. number of simulateneous events */ #define UEV_MAX_EVENTS 10 /**< Max. number of simulateneous events */
#define UEV_MAX_EVENTS 10
/* I/O events, signal and timer revents are always UEV_READ */ /* I/O events, signal and timer revents are always UEV_READ */
#define UEV_NONE 0 #define UEV_NONE 0 /**< normal loop */
#define UEV_ERROR EPOLLERR #define UEV_ERROR EPOLLERR /**< error flag */
#define UEV_READ EPOLLIN #define UEV_READ EPOLLIN /**< poll for reading */
#define UEV_WRITE EPOLLOUT #define UEV_WRITE EPOLLOUT /**< poll for writing */
#define UEV_PRI EPOLLPRI #define UEV_PRI EPOLLPRI /**< priority message */
#define UEV_HUP EPOLLHUP #define UEV_HUP EPOLLHUP /**< hangup event */
#define UEV_RDHUP EPOLLRDHUP #define UEV_RDHUP EPOLLRDHUP /**< peer shutdown */
#define UEV_EDGE EPOLLET #define UEV_EDGE EPOLLET /**< edge triggered */
#define UEV_ONESHOT EPOLLONESHOT #define UEV_ONESHOT EPOLLONESHOT /**< one-shot event */
/* Run flags */ /* Run flags */
#define UEV_ONCE 1 #define UEV_ONCE 1 /**< run loop once */
#define UEV_NONBLOCK 2 #define UEV_NONBLOCK 2 /**< exit if no event */
/* Macros */ /** Check if I/O watcher is active or stopped */
#define uev_io_active(w) _uev_watcher_active(w) #define uev_io_active(w) _uev_watcher_active(w)
/** Check if signal watcher is active or stopped */
#define uev_signal_active(w) _uev_watcher_active(w) #define uev_signal_active(w) _uev_watcher_active(w)
/** Check if timer is active or stopped */
#define uev_timer_active(w) _uev_watcher_active(w) #define uev_timer_active(w) _uev_watcher_active(w)
/** Check if cron timer watcher is active or stopped */
#define uev_cron_active(w) _uev_watcher_active(w) #define uev_cron_active(w) _uev_watcher_active(w)
/** Check if event watcher is active or stopped */
#define uev_event_active(w) _uev_watcher_active(w) #define uev_event_active(w) _uev_watcher_active(w)
/* Event watcher */ /** Event loop context, need one per process and thread */
typedef struct uev_ctx uev_ctx_t;
/** Event watcher */
typedef struct uev { typedef struct uev {
/* Private data for libuEv internal engine */ /* Private data for libuEv internal engine */
uev_private_t type; uev_private_t type;
/* Public data for users to reference */ /* Public data for users to reference */
int signo; int signo; /**< configured signal */
int fd; int fd; /**< active descriptor */
uev_ctx_t *ctx; uev_ctx_t *ctx; /**< watcher context */
/* Extra data for certain watcher types */
struct signalfd_siginfo siginfo; /**< received signal */
} uev_t; } uev_t;
/* /**
* Generic callback for watchers, @events holds %UEV_READ and/or %UEV_WRITE * Generic callback for watchers, @p events holds ::UEV_READ and/or
* with optional %UEV_PRI (priority data available to read) and any of the * ::UEV_WRITE with optional ::UEV_PRI (priority data available to read)
* %UEV_HUP and/or %UEV_RDHUP, which may be used to signal hang-up events. * and any of the ::UEV_HUP and/or ::UEV_RDHUP, which may be used to
* signal hang-up and peer shutdown events.
* *
* Note: UEV_ERROR conditions must be handled by all callbacks! * Note: ::UEV_ERROR conditions must be handled by all callbacks! I/O
* I/O watchers may also need to check UEV_HUP. Appropriate action, * watchers may also need to check ::UEV_HUP. Appropriate action,
* e.g. restart the watcher, is up to the application and is thus * e.g. restart the watcher, is up to the application and is thus
* delegated to the callback. * delegated to the callback.
*/ */
typedef void (uev_cb_t)(uev_t *w, void *arg, int events); typedef void (uev_cb_t)(uev_t *w, void *arg, int events);
/* Public interface */ /* Public interface */
/** Create an event loop context */
int uev_init (uev_ctx_t *ctx); int uev_init (uev_ctx_t *ctx);
int uev_init1 (uev_ctx_t *ctx, int maxevents); int uev_init1 (uev_ctx_t *ctx, int maxevents);
int uev_exit (uev_ctx_t *ctx); int uev_exit (uev_ctx_t *ctx);
File renamed without changes.
+3 -5
View File
@@ -1,5 +1,8 @@
EXTRA_DIST = check.h EXTRA_DIST = check.h
CLEANFILES = *~ *.trs *.log CLEANFILES = *~ *.trs *.log
AM_CFLAGS = -W -Wall -Wextra -Wno-unused-result -Wno-unused-parameter
AM_CPPFLAGS = -D_GNU_SOURCE -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64
AM_LDFLAGS = -L../src ../src/libuev.la
TESTS = TESTS =
TESTS += active TESTS += active
@@ -11,8 +14,3 @@ TESTS += timer
TESTS += event TESTS += event
check_PROGRAMS = $(TESTS) check_PROGRAMS = $(TESTS)
# Ignore warnings about unused result, in e.g. write()
CFLAGS = -W -Wall -Wextra -Wno-unused-result -Wno-unused-parameter
CPPFLAGS = -D_GNU_SOURCE
LDADD = -L../src ../src/libuev.la
View File
File renamed without changes.
View File
File renamed without changes.
+3 -3
View File
@@ -1,5 +1,5 @@
#ifndef UEV_TESTS_CHECK_H_ #ifndef UEV_TEST_CHECK_H_
#define UEV_TESTS_CHECK_H_ #define UEV_TEST_CHECK_H_
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
@@ -76,4 +76,4 @@ static inline char *timespec2str(struct timespec *ts, char *buf, size_t len)
return buf; return buf;
} }
#endif /* UEV_TESTS_CHECK_H_ */ #endif /* UEV_TEST_CHECK_H_ */
+1 -1
View File
@@ -1,7 +1,7 @@
/* Test libuEv event library /* Test libuEv event library
* *
* Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk> * Copyright (c) 2012 Flemming Madsen <flemming!madsen()madsensoft!dk>
* Copyright (c) 2013-2021 Joachim Wiberg <troglobit()gmail!com> * Copyright (c) 2013-2024 Joachim Wiberg <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
+1 -1
View File
@@ -1,6 +1,6 @@
/* Test cron API in libuEv event library /* Test cron API in libuEv event library
* *
* Copyright (c) 2016-2021 Joachim Wiberg <troglobit()gmail!com> * Copyright (c) 2016-2024 Joachim Wiberg <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
+1 -1
View File
@@ -1,6 +1,6 @@
/* Verifies eventfd support /* Verifies eventfd support
* *
* Copyright (c) 2018-2021 Joachim Wiberg <troglobit@gmail.com> * Copyright (c) 2018-2024 Joachim Wiberg <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
+46 -34
View File
@@ -1,6 +1,6 @@
/* Multiple signals, segfault and fork() to test sub-processes. /* Multiple signals, segfault and fork() to test sub-processes.
* *
* Copyright (c) 2015-2021 Joachim Wiberg <troglobit@gmail.com> * Copyright (c) 2015-2024 Joachim Wiberg <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
@@ -36,6 +36,7 @@
#define DO_SEGFAULT 1 #define DO_SEGFAULT 1
typedef struct { typedef struct {
pid_t pid;
int magic; int magic;
void *ptr; void *ptr;
} arg_t; } arg_t;
@@ -48,10 +49,10 @@ static arg_t arg = {
static int callback(arg_t *arg, int event, void *foo) static int callback(arg_t *arg, int event, void *foo)
{ {
arg_t *event_arg = (arg_t *)foo; arg_t *event_arg = (arg_t *)foo;
printf("child: got magic %d and ptr %p, with event %d and event arg %p\n", printf("child[%d] magic %d ptr %p, event %d event arg %p\n",
arg->magic, arg->ptr, event, event_arg); getpid(), arg->magic, arg->ptr, event, event_arg);
arg->magic = 7331; arg->magic = 7331;
arg->ptr = &event_arg; arg->ptr = &event_arg;
@@ -65,44 +66,55 @@ static int callback(arg_t *arg, int event, void *foo)
return 42; return 42;
} }
static void sigsegv_cb(uev_t *w, void *arg, int events) static void sig_cb(uev_t *w, void *cbarg, int events)
{ {
warnx("PID %d caused segfault.", getpid()); arg_t *arg = (arg_t *)cbarg;
exit(-1);
switch (w->signo) {
case SIGSEGV:
// printf("Got SIGSEGV (%d) from PID %d\n", w->siginfo.ssi_signo, w->siginfo.ssi_pid);
warnx("PID %d caused segfault.", getpid());
exit(-1);
break;
case SIGCHLD:
if (arg->pid != (pid_t)w->siginfo.ssi_pid)
err(1, "wrong child exited pid %d vs ssi_pid %d",
arg->pid, w->siginfo.ssi_pid);
warnx("Got SIGCHLD (%d), PID %d exited, bye.", w->siginfo.ssi_signo, arg->pid);
break;
default:
err(1, "unhandled signal %d", w->siginfo.ssi_signo);
}
} }
static void sigchld_cb(uev_t *w, void *arg, int events) static void work_cb(uev_t *w, void *cbarg, int events)
{
pid_t pid = waitpid(-1, NULL, WNOHANG);
if (-1 != pid)
warnx("PID %d exited, bye.", pid);
}
static void work_cb(uev_t *w, void *arg, int events)
{ {
arg_t *arg = (arg_t *)cbarg;
pid_t pid; pid_t pid;
int status = 0; int rc = 0;
pid = fork(); pid = fork();
if (-1 == pid) if (-1 == pid)
err(1, "fork"); err(1, "fork");
if (!pid) { if (!pid)
status = callback(arg, 6137, NULL); exit(callback(arg, 6137, NULL));
exit(status);
}
if (waitpid(pid, &status, 0) == -1) arg->pid = pid;
pid = waitpid(pid, &rc, 0);
if (pid == -1)
err(1, "waitpid"); err(1, "waitpid");
if (WIFEXITED(status)) if (WIFEXITED(rc))
printf("Child exited normally => %d\n", WEXITSTATUS(status)); printf("Child %d exited normally => %d\n", pid, WEXITSTATUS(rc));
else if (WCOREDUMP(status)) else if (WCOREDUMP(rc))
printf("Child crashed! %s\n", DO_SEGFAULT printf("Child %d crashed%s\n", pid, DO_SEGFAULT
? "As expected, everything is OK." ? ", as expected, everything is OK."
: "This should not happen!"); : ". This should not happen!");
else else
printf("Child did not exit normally!\n"); printf("Child %d did not exit normally!\n", pid);
} }
static void exit_cb(uev_t *w, void *arg, int events) static void exit_cb(uev_t *w, void *arg, int events)
@@ -113,17 +125,17 @@ static void exit_cb(uev_t *w, void *arg, int events)
int main(void) int main(void)
{ {
uev_t deadline, sigsegv, sigchld, timeout;
uev_ctx_t ctx; uev_ctx_t ctx;
uev_t sigsegv_watcher, sigchld_watcher, timeout_watcher, deadline_watcher;
/* Initialize libuEv */ /* Initialize libuEv */
uev_init(&ctx); uev_init(&ctx);
/* Setup callbacks */ /* Setup callbacks */
uev_signal_init(&ctx, &sigsegv_watcher, sigsegv_cb, NULL, SIGSEGV); uev_signal_init(&ctx, &sigsegv, sig_cb, NULL, SIGSEGV);
uev_signal_init(&ctx, &sigchld_watcher, sigchld_cb, NULL, SIGCHLD); uev_signal_init(&ctx, &sigchld, sig_cb, &arg, SIGCHLD);
uev_timer_init(&ctx, &timeout_watcher, work_cb, &arg, 400, 0); uev_timer_init(&ctx, &timeout, work_cb, &arg, 400, 0);
uev_timer_init(&ctx, &deadline_watcher, exit_cb, NULL, 1000, 0); uev_timer_init(&ctx, &deadline, exit_cb, NULL, 1000, 0);
/* Start event loop */ /* Start event loop */
return uev_run(&ctx, 0); return uev_run(&ctx, 0);
View File
File renamed without changes.