Initial commit
This commit is contained in:
commit
c3b542d8c5
32 changed files with 1674 additions and 0 deletions
1
src/docs/.params
Normal file
1
src/docs/.params
Normal file
|
|
@ -0,0 +1 @@
|
|||
docs doxygen docs
|
||||
179
src/docs/Doxyfile.in
Normal file
179
src/docs/Doxyfile.in
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
# liblwevent/src/docs/Doxyfile.in
|
||||
#
|
||||
# (c)2007, Laurence Withers, <l@lwithers.me.uk>.
|
||||
# Released under the GNU GPLv2. See file COPYING or
|
||||
# http://www.gnu.org/copyleft/gpl.html for details.
|
||||
#
|
||||
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
PROJECT_NAME = liblwevent
|
||||
OUTPUT_DIRECTORY =
|
||||
CREATE_SUBDIRS = NO
|
||||
OUTPUT_LANGUAGE = English
|
||||
BRIEF_MEMBER_DESC = YES
|
||||
REPEAT_BRIEF = YES
|
||||
ABBREVIATE_BRIEF =
|
||||
ALWAYS_DETAILED_SEC = NO
|
||||
INLINE_INHERITED_MEMB = YES
|
||||
FULL_PATH_NAMES = NO
|
||||
STRIP_FROM_PATH =
|
||||
STRIP_FROM_INC_PATH =
|
||||
SHORT_NAMES = NO
|
||||
JAVADOC_AUTOBRIEF = NO
|
||||
MULTILINE_CPP_IS_BRIEF = YES
|
||||
DETAILS_AT_TOP = YES
|
||||
INHERIT_DOCS = YES
|
||||
SEPARATE_MEMBER_PAGES = NO
|
||||
TAB_SIZE = 4
|
||||
ALIASES =
|
||||
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||
OPTIMIZE_OUTPUT_JAVA = NO
|
||||
BUILTIN_STL_SUPPORT = NO
|
||||
CPP_CLI_SUPPORT = NO
|
||||
DISTRIBUTE_GROUP_DOC = NO
|
||||
SUBGROUPING = YES
|
||||
EXTRACT_ALL = NO
|
||||
EXTRACT_PRIVATE = NO
|
||||
EXTRACT_STATIC = NO
|
||||
EXTRACT_LOCAL_CLASSES = NO
|
||||
EXTRACT_LOCAL_METHODS = NO
|
||||
HIDE_UNDOC_MEMBERS = NO
|
||||
HIDE_UNDOC_CLASSES = NO
|
||||
HIDE_FRIEND_COMPOUNDS = YES
|
||||
HIDE_IN_BODY_DOCS = NO
|
||||
INTERNAL_DOCS = NO
|
||||
CASE_SENSE_NAMES = YES
|
||||
HIDE_SCOPE_NAMES = NO
|
||||
SHOW_INCLUDE_FILES = NO
|
||||
INLINE_INFO = YES
|
||||
SORT_MEMBER_DOCS = NO
|
||||
SORT_BRIEF_DOCS = NO
|
||||
SORT_BY_SCOPE_NAME = NO
|
||||
GENERATE_TODOLIST = YES
|
||||
GENERATE_TESTLIST = YES
|
||||
GENERATE_BUGLIST = YES
|
||||
GENERATE_DEPRECATEDLIST= YES
|
||||
ENABLED_SECTIONS =
|
||||
MAX_INITIALIZER_LINES = 30
|
||||
SHOW_USED_FILES = NO
|
||||
SHOW_DIRECTORIES = NO
|
||||
FILE_VERSION_FILTER =
|
||||
QUIET = YES
|
||||
WARNINGS = YES
|
||||
WARN_IF_UNDOCUMENTED = YES
|
||||
WARN_IF_DOC_ERROR = YES
|
||||
WARN_NO_PARAMDOC = YES
|
||||
WARN_FORMAT = "$file:$line: $text"
|
||||
WARN_LOGFILE =
|
||||
INPUT_ENCODING = UTF-8
|
||||
FILE_PATTERNS =
|
||||
RECURSIVE = NO
|
||||
EXCLUDE =
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
EXCLUDE_PATTERNS =
|
||||
EXCLUDE_SYMBOLS =
|
||||
EXAMPLE_PATH =
|
||||
EXAMPLE_PATTERNS =
|
||||
EXAMPLE_RECURSIVE = NO
|
||||
IMAGE_PATH = src/docs
|
||||
INPUT_FILTER =
|
||||
FILTER_PATTERNS =
|
||||
FILTER_SOURCE_FILES = NO
|
||||
SOURCE_BROWSER = NO
|
||||
INLINE_SOURCES = NO
|
||||
STRIP_CODE_COMMENTS = YES
|
||||
REFERENCED_BY_RELATION = YES
|
||||
REFERENCES_RELATION = YES
|
||||
REFERENCES_LINK_SOURCE = YES
|
||||
USE_HTAGS = NO
|
||||
VERBATIM_HEADERS = NO
|
||||
ALPHABETICAL_INDEX = YES
|
||||
COLS_IN_ALPHA_INDEX = 5
|
||||
IGNORE_PREFIX =
|
||||
GENERATE_HTML = YES
|
||||
HTML_OUTPUT = html
|
||||
HTML_FILE_EXTENSION = .html
|
||||
HTML_HEADER =
|
||||
HTML_FOOTER =
|
||||
HTML_STYLESHEET =
|
||||
HTML_ALIGN_MEMBERS = YES
|
||||
GENERATE_HTMLHELP = NO
|
||||
CHM_FILE =
|
||||
HHC_LOCATION =
|
||||
GENERATE_CHI = NO
|
||||
BINARY_TOC = NO
|
||||
TOC_EXPAND = NO
|
||||
DISABLE_INDEX = NO
|
||||
ENUM_VALUES_PER_LINE = 4
|
||||
GENERATE_TREEVIEW = NO
|
||||
TREEVIEW_WIDTH = 250
|
||||
GENERATE_LATEX = NO
|
||||
LATEX_OUTPUT = latex
|
||||
LATEX_CMD_NAME = latex
|
||||
MAKEINDEX_CMD_NAME = makeindex
|
||||
COMPACT_LATEX = NO
|
||||
PAPER_TYPE = a4wide
|
||||
EXTRA_PACKAGES =
|
||||
LATEX_HEADER =
|
||||
PDF_HYPERLINKS = NO
|
||||
USE_PDFLATEX = NO
|
||||
LATEX_BATCHMODE = NO
|
||||
LATEX_HIDE_INDICES = NO
|
||||
GENERATE_RTF = NO
|
||||
RTF_OUTPUT = rtf
|
||||
COMPACT_RTF = NO
|
||||
RTF_HYPERLINKS = NO
|
||||
RTF_STYLESHEET_FILE =
|
||||
RTF_EXTENSIONS_FILE =
|
||||
GENERATE_MAN = NO
|
||||
MAN_OUTPUT = man
|
||||
MAN_EXTENSION = .3
|
||||
MAN_LINKS = NO
|
||||
GENERATE_XML = NO
|
||||
XML_OUTPUT = xml
|
||||
XML_SCHEMA =
|
||||
XML_DTD =
|
||||
XML_PROGRAMLISTING = YES
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
GENERATE_PERLMOD = NO
|
||||
PERLMOD_LATEX = NO
|
||||
PERLMOD_PRETTY = YES
|
||||
PERLMOD_MAKEVAR_PREFIX =
|
||||
ENABLE_PREPROCESSING = YES
|
||||
MACRO_EXPANSION = NO
|
||||
EXPAND_ONLY_PREDEF = NO
|
||||
SEARCH_INCLUDES = YES
|
||||
INCLUDE_PATH =
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
PREDEFINED = DOXYGEN
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
TAGFILES =
|
||||
GENERATE_TAGFILE =
|
||||
ALLEXTERNALS = NO
|
||||
EXTERNAL_GROUPS = YES
|
||||
PERL_PATH = /usr/bin/perl
|
||||
CLASS_DIAGRAMS = YES
|
||||
MSCGEN_PATH =
|
||||
HIDE_UNDOC_RELATIONS = YES
|
||||
HAVE_DOT = YES
|
||||
CLASS_GRAPH = YES
|
||||
COLLABORATION_GRAPH = YES
|
||||
GROUP_GRAPHS = NO
|
||||
UML_LOOK = NO
|
||||
TEMPLATE_RELATIONS = NO
|
||||
INCLUDE_GRAPH = NO
|
||||
INCLUDED_BY_GRAPH = NO
|
||||
CALL_GRAPH = NO
|
||||
CALLER_GRAPH = NO
|
||||
GRAPHICAL_HIERARCHY = YES
|
||||
DIRECTORY_GRAPH = NO
|
||||
DOT_IMAGE_FORMAT = png
|
||||
DOT_PATH =
|
||||
DOTFILE_DIRS =
|
||||
DOT_GRAPH_MAX_NODES = 50
|
||||
DOT_TRANSPARENT = YES
|
||||
DOT_MULTI_TARGETS = YES
|
||||
GENERATE_LEGEND = YES
|
||||
DOT_CLEANUP = YES
|
||||
SEARCHENGINE = NO
|
||||
30
src/docs/MainPage.dox
Normal file
30
src/docs/MainPage.dox
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/* liblwevent/src/docs/MainPage.dox
|
||||
*
|
||||
* (c)2007, Laurence Withers, <l@lwithers.me.uk>.
|
||||
* Released under the GNU GPLv2. See file COPYING or
|
||||
* http://www.gnu.org/copyleft/gpl.html for details.
|
||||
*/
|
||||
|
||||
/*! \mainpage Lightweight Event Library
|
||||
|
||||
This library is a lightweight wrapper around the \c epoll(7) facility. Its purpose is to provide a
|
||||
slightly higher level interface for simplicity and speed of development. Effectively, it provides an
|
||||
API consisting of the common operations used by programs written using an event-driven, finite state
|
||||
machine (or other object-based) paradigm.
|
||||
|
||||
Its features are as follows:
|
||||
\li simple event loop interface (see section \ref eventloop)
|
||||
\li wrapper functions for adding and removing file descriptors (see section \ref fdevent)
|
||||
\li signal functions (TODO)
|
||||
\li timer functions (TODO)
|
||||
\li safe inter-object actions (one object may free another at any time)
|
||||
\li O(1) design to match that of \c epoll(7)
|
||||
|
||||
See the page \ref libdesign for detailed information on the implementation.
|
||||
|
||||
*/
|
||||
|
||||
/* options for text editors
|
||||
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
vim: expandtab:ts=4:sw=4:syntax=doxygen
|
||||
*/
|
||||
1
src/docs/build.default
Normal file
1
src/docs/build.default
Normal file
|
|
@ -0,0 +1 @@
|
|||
source src/docs/build.docs
|
||||
43
src/docs/build.docs
Normal file
43
src/docs/build.docs
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
# These are external variables, and shouldn't clash with anything else
|
||||
# docs_BUILT
|
||||
#
|
||||
|
||||
MONOLITHIC_DOC="${MONOLITHIC_DOC} $(echo src/docs/*.dox)"
|
||||
build_target monolithic
|
||||
|
||||
if [ -z ${docs_BUILT} ]
|
||||
then
|
||||
echo "Building documentation with Doxygen..."
|
||||
|
||||
DOXYFILE=obj/Doxyfile.docs
|
||||
|
||||
if [ ! -e ${DOXYFILE} ]
|
||||
then
|
||||
do_cmd cp src/docs/Doxyfile.in ${DOXYFILE} || return 1
|
||||
echo "INPUT = ${MONOLITHIC_DOC}" >> ${DOXYFILE}
|
||||
echo "PROJECT_NUMBER = ${VERSION}" >> ${DOXYFILE}
|
||||
fi
|
||||
|
||||
MODIFIED=0
|
||||
for file in ${MONOLITHIC_DOC}
|
||||
do
|
||||
if [ ${file} -nt html/index.html ]
|
||||
then
|
||||
MODIFIED=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${MODIFIED} -ne 0 ]
|
||||
then
|
||||
do_cmd doxygen ${DOXYFILE} || return 1
|
||||
print_success "Documentation built"
|
||||
else
|
||||
print_success "Documentation is up to date"
|
||||
fi
|
||||
|
||||
docs_BUILT=1
|
||||
fi
|
||||
|
||||
# kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
# vim: syntax=sh:expandtab:ts=4:sw=4
|
||||
1
src/docs/build.install
Normal file
1
src/docs/build.install
Normal file
|
|
@ -0,0 +1 @@
|
|||
source src/docs/build.install-docs
|
||||
21
src/docs/build.install-docs
Normal file
21
src/docs/build.install-docs
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
build_target docs
|
||||
|
||||
# create documentation directories
|
||||
echo "Installing documentation into ${DOCSDIR}"
|
||||
build_dir_tree "${DOCSDIR}/html" || return 1
|
||||
|
||||
# copy across the Doxygen-generated documentation
|
||||
for file in html/*
|
||||
do
|
||||
install_file ${file} ${DOCSDIR}/html 0644 || return 1
|
||||
done
|
||||
|
||||
# copy across the generic files
|
||||
for file in COPYING README
|
||||
do
|
||||
install_file ${file} ${DOCSDIR} 0644 || return 1
|
||||
done
|
||||
|
||||
print_success "Documentation installed"
|
||||
# kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
# vim: syntax=sh:expandtab:ts=4:sw=4
|
||||
49
src/docs/libdesign.dox
Normal file
49
src/docs/libdesign.dox
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/* liblwevent/src/docs/libdesign.dox
|
||||
*
|
||||
* (c)2007, Laurence Withers, <l@lwithers.me.uk>.
|
||||
* Released under the GNU GPLv2. See file COPYING or
|
||||
* http://www.gnu.org/copyleft/gpl.html for details.
|
||||
*/
|
||||
|
||||
/*! \page libdesign Library design
|
||||
|
||||
\section libdesign_O1 O(1) design
|
||||
|
||||
Like the \c epoll(7) facility, \a liblwevent is designed to be O(1): execution time does not scale
|
||||
with number of active file descriptors, and is instead constant (per event). Effectively, this means
|
||||
that the library \em never stores or scans a list of active objects; instead, objects are associated
|
||||
solely with file descriptors, and the kernel maintains this association in its file descriptor
|
||||
table.
|
||||
|
||||
As a consequence, the library does not have information about which (if any) objects are active. It
|
||||
cannot be used to directly implement per-object timeouts, since there would be no way of determining
|
||||
which objects to scan when computing what the timeouts should be, and no way of knowing which
|
||||
objects did not receive events after a call to \c epoll_wait(2).
|
||||
|
||||
\section libdesign_interobject Inter-object actions
|
||||
|
||||
Unlike \a libevent (see \c event(3)), liblwevent directly supports safe inter-object actions. This
|
||||
means that one object can safely free (or modify) another, at any time, without fear of crashing.
|
||||
|
||||
Consider an event loop watching two objects, A and B. When either object's file descriptor is
|
||||
closed, the other object should be freed. Now imagine that the remote side of B is shut down and,
|
||||
before the kernel schedules in the event loop's process, A becomes ready for reading. The kernel,
|
||||
unaware of the semantics of the link between these two objects, will return two events: \c EPOLLHUP
|
||||
for B, and EPOLLIN for A. The process is scheduled in, and processes B's event first. It closes the
|
||||
file descriptor associated with A and destroys the associated user-space information (write buffers
|
||||
etc.). But then it comes to process the event for A, which is now invalid, and has dangling pointers.
|
||||
|
||||
\a liblwevent provides a mechanism for dealing with this sequence of events. Each object has an
|
||||
\em invalid flag, normally cleared. When B destroys the information associated with A, the struct
|
||||
lwevent object associated with A persists with its invalid flag set, and a pointer to it is placed
|
||||
onto a list. When the event for A is processed, \a liblwevent notices the invalid flag and skips the
|
||||
event. When all events have been processed, the library iterates through the list of invalid events
|
||||
and frees the remaining objects. This ensures robust operation regardless of the order in which
|
||||
events occur.
|
||||
|
||||
*/
|
||||
|
||||
/* options for text editors
|
||||
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
vim: expandtab:ts=4:sw=4:syntax=doxygen
|
||||
*/
|
||||
1
src/libgslevent/.params
Normal file
1
src/libgslevent/.params
Normal file
|
|
@ -0,0 +1 @@
|
|||
lib c liblwevent lwevent.h
|
||||
16
src/libgslevent/000_TopHeader.h
Normal file
16
src/libgslevent/000_TopHeader.h
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
/* liblwevent/src/liblwevent/000_TopHeader.h
|
||||
*
|
||||
* (c)2007, Laurence Withers, <l@lwithers.me.uk>.
|
||||
* Released under the GNU GPLv2. See file COPYING or
|
||||
* http://www.gnu.org/copyleft/gpl.html for details.
|
||||
*/
|
||||
|
||||
#ifndef HEADER_liblwevent
|
||||
#define HEADER_liblwevent
|
||||
|
||||
/* standard includes, or includes needed for type declarations */
|
||||
|
||||
/* options for text editors
|
||||
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
vim: expandtab:ts=4:sw=4:syntax=c.doxygen
|
||||
*/
|
||||
15
src/libgslevent/000_TopSource.c
Normal file
15
src/libgslevent/000_TopSource.c
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
/* liblwevent/src/liblwevent/000_TopSource.c
|
||||
*
|
||||
* (c)2007, Laurence Withers, <l@lwithers.me.uk>.
|
||||
* Released under the GNU GPLv2. See file COPYING or
|
||||
* http://www.gnu.org/copyleft/gpl.html for details.
|
||||
*/
|
||||
|
||||
#include "lwevent.h"
|
||||
|
||||
/* Below are all the includes used throughout the library. */
|
||||
|
||||
/* options for text editors
|
||||
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
vim: expandtab:ts=4:sw=4
|
||||
*/
|
||||
67
src/libgslevent/200_eventloop.h
Normal file
67
src/libgslevent/200_eventloop.h
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
/* liblwevent/src/liblwevent/200_eventloop.h
|
||||
*
|
||||
* (c)2007, Laurence Withers, <l@lwithers.me.uk>.
|
||||
* Released under the GNU GPLv2. See file COPYING or
|
||||
* http://www.gnu.org/copyleft/gpl.html for details.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*! \defgroup eventloop Main event loop
|
||||
|
||||
This module controls overall program flow. The two main functions of interest are
|
||||
lwevent_loop(), which implements a full event-driven programming loop (only returning when the
|
||||
program should exit), and lwevent_wait(), which implements a single run of the event loop.
|
||||
|
||||
*/
|
||||
/*!@{*/
|
||||
|
||||
|
||||
|
||||
/*! \brief Event loop exit flag.
|
||||
|
||||
This flag, if set, signifies that lwevent_loop() should exit after its next iteration. It can be
|
||||
set by a signal handler or any other function in the program at any time. It is scanned after each
|
||||
loop is completely processed.
|
||||
|
||||
*/
|
||||
extern volatile int lwevent_loop_exit;
|
||||
|
||||
|
||||
|
||||
/*! \brief Event loop (loop forever).
|
||||
|
||||
\retval 0 on success (event loop exited due to lwevent_loop_exit flag).
|
||||
\retval -1 on error (system call failed; see \a errno).
|
||||
|
||||
This function will call lwevent_wait() in a loop forever. The loop can be aborted by setting the
|
||||
flag lwevent_loop_exit to non-zero. The loop will also be aborted if lwevent_wait() returns an
|
||||
error (in which case \a errno can be used to determine the error).
|
||||
|
||||
*/
|
||||
int lwevent_loop(void);
|
||||
|
||||
|
||||
|
||||
/*! \brief Event loop (loop once).
|
||||
|
||||
\param timeout_ms A timeout, in milliseconds. This function will return as soon as any events occur,
|
||||
but will return after \a timeout_ms milliseconds have elapsed.
|
||||
\retval 0 on success (events occurred, timeout occurred).
|
||||
\retval -1 on error (system call failed; see \a errno).
|
||||
|
||||
This function will run the event loop once, returning as soon as events are available (or the
|
||||
timeout, in milliseconds, occurs). If any events do occur, they will be dispatched to the relevant
|
||||
callback objects. The final action of this function is to free the memory associated with any
|
||||
objects that are closed during the callbacks.
|
||||
|
||||
*/
|
||||
int lwevent_wait(int timeout_ms);
|
||||
|
||||
|
||||
|
||||
/*!@}*/
|
||||
/* options for text editors
|
||||
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
vim: expandtab:ts=4:sw=4:syntax=c.doxygen
|
||||
*/
|
||||
111
src/libgslevent/300_fdevent.h
Normal file
111
src/libgslevent/300_fdevent.h
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
/* liblwevent/src/liblwevent/300_fdevent.h
|
||||
*
|
||||
* (c)2007, Laurence Withers, <l@lwithers.me.uk>.
|
||||
* Released under the GNU GPLv2. See file COPYING or
|
||||
* http://www.gnu.org/copyleft/gpl.html for details.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*! \defgroup fdevent File descriptor event management
|
||||
|
||||
This module contains functions for managing file descriptor-based events. For each file descriptor
|
||||
to be monitored, a struct lwevent is instantiated with lwevent_new(). This opaque object contains
|
||||
all the details needed to provide callbacks when events occur (see section \ref fdparams for more
|
||||
information).
|
||||
|
||||
*/
|
||||
/*!@{*/
|
||||
|
||||
|
||||
|
||||
/*! \brief Opaque file descriptor event structure.
|
||||
|
||||
This structure is associated with a single file descriptor. It holds the details used to
|
||||
implement callbacks whenever the file descriptor is ready for I/O. The structure cannot be
|
||||
dereferenced; instead, the functions used in the section \ref fdparams can be used to store or
|
||||
retrieve associated values.
|
||||
|
||||
*/
|
||||
struct lwevent
|
||||
#ifndef DOXYGEN
|
||||
;
|
||||
#else
|
||||
{
|
||||
/*! \brief Dummy variable for doxygen */
|
||||
int dummy;
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*! \brief Event callback function pointer.
|
||||
|
||||
\param ev Pointer to event structure.
|
||||
\param revents Bitmask of returned events (see \c epoll(7)).
|
||||
|
||||
This is the type of function pointer used for event callbacks. The event callback function will be
|
||||
called from lwevent_wait() or lwevent_loop() with a pointer to the associated event structure and
|
||||
a bitmask of events which have occurred.
|
||||
|
||||
*/
|
||||
typedef void (*lwevent_callback)(struct lwevent* ev, int revents);
|
||||
|
||||
|
||||
|
||||
/*! \brief Create new event structure associated with a file descriptor.
|
||||
|
||||
\param fd File descriptor to monitor.
|
||||
\param events Bitmask of events to watch for, and epoll flags (see \c epoll(7)).
|
||||
\param callback Pointer to function to call whenever an event occurs.
|
||||
\returns Pointer to new lwevent structure on success.
|
||||
\retval 0 on error (and see \a errno).
|
||||
|
||||
This function will create and register with \c epoll(7) a lwevent structure associated with the
|
||||
file descriptor \a fd. Initially, the object will have the callback function specified in
|
||||
\a callback, but this (and other attributes) can be changed; see section \ref fdparams.
|
||||
|
||||
Once a lwevent structure has been created for \a fd, \a fd should not be passed to \c close(2)
|
||||
directly. Instead, when it is time to close the file descriptor, pass the associated lwevent
|
||||
structure to lwevent_free().
|
||||
|
||||
*/
|
||||
struct lwevent* lwevent_new(int fd, int events, lwevent_callback callback);
|
||||
|
||||
|
||||
|
||||
/*! \brief Free an event structure and close its associated file descriptor.
|
||||
|
||||
\param ev Event structure. May be 0.
|
||||
|
||||
This function will close the file descriptor associated with \a ev, call the destructor if one is
|
||||
registered (see section \ref fdparams), and free the memory used by \a ev. It may be called at any
|
||||
time in the event loop. If called with a null argument, it is a no-op.
|
||||
|
||||
Whenever this function is called, the object \a ev is marked as invalid. If it has already been
|
||||
marked as invalid, the function is a no-op. Otherwise, the file descriptor is immediately closed
|
||||
with \c close(2), and the destructor is also called. The object \a ev itself is not actually freed
|
||||
at this point; it is placed onto a list of invalid objects, and is only freed at the very end of a
|
||||
call to lwevent_wait().
|
||||
|
||||
This behaviour is what allows an object to be freed at any time without fear of crashing. If two
|
||||
events are returned from lwevent_wait(), and the callback of the first event calls lwevent_free()
|
||||
on the second event's object, the second callback can be aborted (since the event object will still
|
||||
exist, but is marked as invalid). Further objects may call lwevent_free() on the invalid object
|
||||
without consequence. At the end of the event loop, once no more callbacks are queued, the invalid
|
||||
objects are freed. This means that you cannot continue to refer to invalid objects after a completed
|
||||
call to lwevent_wait().
|
||||
|
||||
*/
|
||||
void lwevent_free(struct lwevent* ev);
|
||||
|
||||
int lwevent_deactivate(struct lwevent* ev);
|
||||
int lwevent_reactivate(struct lwevent* ev);
|
||||
|
||||
|
||||
|
||||
/*!@}*/
|
||||
/* options for text editors
|
||||
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
vim: expandtab:ts=4:sw=4:syntax=c.doxygen
|
||||
*/
|
||||
30
src/libgslevent/350_fdparams.h
Normal file
30
src/libgslevent/350_fdparams.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/* liblwevent/src/liblwevent/300_fdevent.h
|
||||
*
|
||||
* (c)2007, Laurence Withers, <l@lwithers.me.uk>.
|
||||
* Released under the GNU GPLv2. See file COPYING or
|
||||
* http://www.gnu.org/copyleft/gpl.html for details.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
int lwevent_get_fd(const struct lwevent* ev);
|
||||
|
||||
int lwevent_set_events(struct lwevent* ev, int events, int* old_events);
|
||||
int lwevent_get_events(const struct lwevent* ev);
|
||||
|
||||
void lwevent_set_callback(struct lwevent* ev, lwevent_callback callback,
|
||||
lwevent_callback* old_callback);
|
||||
lwevent_callback lwevent_get_callback(const struct lwevent* ev);
|
||||
|
||||
void lwevent_set_user(struct lwevent* ev, void* user);
|
||||
void* lwevent_get_user(const struct lwevent* ev);
|
||||
|
||||
typedef void (*lwevent_dtor)(struct lwevent* ev);
|
||||
void lwevent_set_dtor(struct lwevent* ev, lwevent_dtor dtor, lwevent_dtor* old_dtor);
|
||||
lwevent_dtor lwevent_get_dtor(struct lwevent* ev);
|
||||
|
||||
|
||||
/* options for text editors
|
||||
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
vim: expandtab:ts=4:sw=4:syntax=c.doxygen
|
||||
*/
|
||||
13
src/libgslevent/999_BottomHeader.h
Normal file
13
src/libgslevent/999_BottomHeader.h
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
/* liblwevent/src/liblwevent/999_BottomHeader.h
|
||||
*
|
||||
* (c)2007, Laurence Withers, <l@lwithers.me.uk>.
|
||||
* Released under the GNU GPLv2. See file COPYING or
|
||||
* http://www.gnu.org/copyleft/gpl.html for details.
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/* options for text editors
|
||||
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
vim: expandtab:ts=4:sw=4:syntax=c.doxygen
|
||||
*/
|
||||
1
src/libgslevent/build.default
Normal file
1
src/libgslevent/build.default
Normal file
|
|
@ -0,0 +1 @@
|
|||
source src/liblwevent/build.lib
|
||||
1
src/libgslevent/build.install
Normal file
1
src/libgslevent/build.install
Normal file
|
|
@ -0,0 +1 @@
|
|||
source src/liblwevent/build.install-lib
|
||||
37
src/libgslevent/build.install-lib
Normal file
37
src/libgslevent/build.install-lib
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
build_target liblwevent
|
||||
|
||||
# make paths (this is for Gentoo in particular)
|
||||
build_dir_tree "${LIBDIR}" || return 1
|
||||
build_dir_tree "${BINDIR}" || return 1
|
||||
build_dir_tree "${INCLUDEDIR}" || return 1
|
||||
|
||||
# install library
|
||||
echo "Installing libraries into '${LIBDIR}'"
|
||||
install_file ${liblwevent} ${LIBDIR} 0755 || return 1
|
||||
BASE="${liblwevent_BASE}.so"
|
||||
MAJOR="${BASE}.${SOMAJOR}"
|
||||
MICRO="${MAJOR}.${SOMICRO}"
|
||||
install_symlink "${BASE}" "${MICRO}" "${LIBDIR}"
|
||||
|
||||
# install header
|
||||
echo "Installing header file '${liblwevent_HEADER}' into ${INCLUDEDIR}"
|
||||
install_header ${liblwevent_HEADER} ${INCLUDEDIR} 0644 || return 1
|
||||
|
||||
# install config script
|
||||
echo "Installing config script into ${BINDIR}"
|
||||
CONFFILE="${INSTALL_PREFIX}${BINDIR}/liblwevent-config"
|
||||
|
||||
do_cmd rm -f "${CONFFILE}"
|
||||
do_cmd_redir "${CONFFILE}" sed \
|
||||
-e "s,@VERSION@,${VERSION}," \
|
||||
-e "s,@DEP_CFLAGS@,${liblwevent_DEP_CFLAGS}," \
|
||||
-e "s,@DEP_LIBS@,${liblwevent_DEP_LIBS}," \
|
||||
-e "s,@LIB_DIR@,${LIBDIR}," \
|
||||
-e "s,@INCLUDE_DIR@,${INCLUDEDIR}," \
|
||||
src/liblwevent/config-script
|
||||
|
||||
do_cmd chmod 0755 "${CONFFILE}"
|
||||
print_success "Done"
|
||||
|
||||
# kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
# vim: syntax=sh:expandtab:ts=4:sw=4
|
||||
55
src/libgslevent/build.lib
Normal file
55
src/libgslevent/build.lib
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
# These are external variables, and shouldn't clash with anything else
|
||||
# liblwevent
|
||||
# liblwevent_BUILT
|
||||
# liblwevent_HEADER
|
||||
# liblwevent_BASE
|
||||
# liblwevent_DEP_CFLAGS
|
||||
# liblwevent_DEP_LIBS
|
||||
|
||||
if [ -z ${liblwevent_BUILT} ]
|
||||
then
|
||||
liblwevent_BASE=liblwevent
|
||||
source src/liblwevent/soversion
|
||||
|
||||
liblwevent="obj/${liblwevent_BASE}.so.${SOMAJOR}.${SOMICRO}"
|
||||
liblwevent_DEP_CFLAGS="" # @TODO@ cflags
|
||||
liblwevent_DEP_LIBS="" # @TODO@ libs
|
||||
SO_EXTRA="${liblwevent_DEP_CFLAGS} ${liblwevent_DEP_LIBS} -lc"
|
||||
|
||||
echo "Building library ${liblwevent}..."
|
||||
|
||||
do_cmd source src/liblwevent/build.monolithic || return 1
|
||||
|
||||
MODIFIED=0
|
||||
for test in ${MONOLITHIC_TESTS} ${HDR} ${SRC}
|
||||
do
|
||||
if [ ${test} -nt ${liblwevent} ]
|
||||
then
|
||||
MODIFIED=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${MODIFIED} -ne 0 ]
|
||||
then
|
||||
echo " Compiling"
|
||||
|
||||
SONAME="${liblwevent_BASE}.so.${SOMAJOR}"
|
||||
do_cmd ${CC} ${CFLAGS} -Iobj -shared -fpic -o "${liblwevent}" \
|
||||
-Wl,-soname,${SONAME} \
|
||||
${SRC} ${SO_EXTRA} || return 1
|
||||
|
||||
# make tests work
|
||||
do_cmd ln -sf $(basename ${liblwevent}) obj/${SONAME} || return 1
|
||||
|
||||
print_success "Library built"
|
||||
else
|
||||
print_success "Library up to date"
|
||||
fi
|
||||
|
||||
liblwevent_BUILT=1
|
||||
liblwevent_HEADER=${HDR}
|
||||
|
||||
fi
|
||||
# kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
# vim: syntax=sh:expandtab:ts=4:sw=4
|
||||
21
src/libgslevent/build.monolithic
Normal file
21
src/libgslevent/build.monolithic
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
# These are external variables, and shouldn't clash with anything else
|
||||
# liblwevent_MONOLITHIC
|
||||
|
||||
SRC="obj/liblwevent.c"
|
||||
HDR="obj/lwevent.h"
|
||||
|
||||
MONOLITHIC_TESTS="src/liblwevent/build.lib src/liblwevent/build.monolithic"
|
||||
|
||||
if [ -z "${liblwevent_MONOLITHIC}" ]
|
||||
then
|
||||
MONOLITHIC_SOURCE="$(find src/liblwevent/ -name '*.h' | sort)"
|
||||
make_monolithic ${HDR} Ch || return 1
|
||||
|
||||
MONOLITHIC_SOURCE="$(find src/liblwevent/ -name '*.c' | sort)"
|
||||
make_monolithic ${SRC} C || return 1
|
||||
|
||||
liblwevent_MONOLITHIC=1
|
||||
MONOLITHIC_DOC="${MONOLITHIC_DOC} ${HDR}"
|
||||
fi
|
||||
# kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
# vim: syntax=sh:expandtab:ts=4:sw=4
|
||||
98
src/libgslevent/config-script
Normal file
98
src/libgslevent/config-script
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
#!/bin/bash
|
||||
# liblwevent/src/liblwevent/config-script
|
||||
#
|
||||
# liblwevent-config template. Variables are finalised at install time.
|
||||
#
|
||||
dep_cflags="@DEP_CFLAGS@"
|
||||
dep_libs="@DEP_LIBS@"
|
||||
include_dir="@INCLUDE_DIR@"
|
||||
include_dir_set="no"
|
||||
lib_dir="@LIB_DIR@"
|
||||
lib_dir_set="no"
|
||||
|
||||
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
Usage: liblwevent-config [options]
|
||||
Options:
|
||||
[--version]
|
||||
[--libs]
|
||||
[--libdir[=DIR]]
|
||||
[--cflags]
|
||||
[--includedir[=DIR]]
|
||||
EOF
|
||||
exit $1
|
||||
}
|
||||
|
||||
|
||||
|
||||
[ $# -eq 0 ] && usage 1 1>&2
|
||||
|
||||
|
||||
|
||||
while [ $# -gt 0 ]
|
||||
do
|
||||
case "$1" in
|
||||
-*=*)
|
||||
optarg="$(echo "$1" | sed 's/[-_a-zA-Z0-9]*=//')"
|
||||
;;
|
||||
|
||||
*)
|
||||
optarg=""
|
||||
;;
|
||||
esac
|
||||
|
||||
case "$1" in
|
||||
--libdir=*)
|
||||
lib_dir="${optarg}"
|
||||
lib_dir_set="yes"
|
||||
;;
|
||||
|
||||
--libdir)
|
||||
echo_lib_dir="yes"
|
||||
;;
|
||||
|
||||
--includedir=*)
|
||||
include_dir="${optarg}"
|
||||
include_dir_set="yes"
|
||||
;;
|
||||
|
||||
--includedir)
|
||||
echo_include_dir="yes"
|
||||
;;
|
||||
|
||||
--version)
|
||||
echo "@VERSION@"
|
||||
exit 0
|
||||
;;
|
||||
|
||||
--cflags)
|
||||
[ "${include_dir}" != "/usr/include" ] && includes="-I${include_dir}"
|
||||
echo_cflags="yes"
|
||||
;;
|
||||
|
||||
--libs)
|
||||
echo_libs="yes"
|
||||
;;
|
||||
|
||||
*)
|
||||
usage 1 1>&2
|
||||
;;
|
||||
esac
|
||||
|
||||
shift
|
||||
done
|
||||
|
||||
|
||||
|
||||
[ "${echo_prefix}" == "yes" ] && echo "${prefix}"
|
||||
[ "${echo_exec_prefix}" == "yes" ] && echo "${exec_prefix}"
|
||||
[ "${echo_cflags}" == "yes" ] && echo "${dep_cflags} ${includes}"
|
||||
[ "${echo_libs}" == "yes" ] && echo "${dep_libs} -L${lib_dir} -llwevent"
|
||||
true
|
||||
|
||||
|
||||
|
||||
# vim: syntax=sh:expandtab:ts=4:sw=4
|
||||
# kate: replace-trailing-space-save true; space-indent true; tab-width 4;
|
||||
15
src/libgslevent/soversion
Normal file
15
src/libgslevent/soversion
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
# liblwevent/src/liblwevent/soversion
|
||||
#
|
||||
# (c)2007, Laurence Withers, <l@lwithers.me.uk>.
|
||||
# Released under the GNU GPLv2. See file COPYING or
|
||||
# http://www.gnu.org/copyleft/gpl.html for details.
|
||||
#
|
||||
|
||||
|
||||
|
||||
# SOMAJOR is included in the library's soname, and needs to be bumped
|
||||
# after a binary-incompatible release. It is a single integer.
|
||||
SOMAJOR=0
|
||||
|
||||
# SOMICRO is bumped every time there is a binary-compatible release.
|
||||
SOMICRO=0
|
||||
Loading…
Add table
Add a link
Reference in a new issue