6.5 (2015-07-17)
-
Added companion library LibUCW-JSON for parsing and formatting JSON.
-
Fastbufs have a new wrapper for parsing and generating hex-dumps. Useful primarily for debugging.
-
Unicode functions are now more strict and they reject denormalized UTF-8 sequences. Also, it is now possible to append UTF-8 characters to a memory pool.
-
The naming of memory pool functions mp_append_printf() and mp_append_vprintf() turned out to be unfortunate as they have differently from all other functions operating on growing buffers. They have been renamed to mp_printf_append() and mp_vprintf_append() with the old names kept as aliases for backward compatibility.
6.4 (2015-04-08)
-
Fixed several minor bugs in the mainloop module.
6.3 (2015-02-14)
-
Cleaned up and documented the LibUCW-XML companion library — a lightning fast standards-complient XML parser.
-
Solved problems with closing of stderr in daemons: see the new function log_drop_stderr().
6.2 (2015-01-16)
-
Fixed race conditions in daemon helpers.
-
The extended types have been documented and integrated in the table printer, command-line option parser, and configuration parser.
-
The table printer options have been documented.
6.1 (2014-08-09)
Incompatible changes
-
Major changes of the table printer module. Finally, its interface can be considered stable now.
Minor changes
-
The command-line option parser gained
OPT_BREAK
class andOPT_HELP_COLUMNS
flag. -
The strtonum module supports more types.
6.0 (2014-06-20)
Incompatible changes
-
Incompatible: It turned out that almost all users of the growing array module push/pop individual elements. Therefore, we have removed the second argument (item count) of
GARY_PUSH
andGARY_POP
. If you want to push/pop multiple elements at once, useGARY_PUSH_MULTI
andGARY_POP_MULTI
. -
Incompatible: The interface of the heap module was cleaned up to remove non-systematic side-effects. The
HEAP_INSERT
operation is now a proper insert (previously, it was just cleanup after insertion performed by the caller), similarlyHEAP_INCREASE
andHEAP_DECREASE
. TheHEAP_DELMIN
operation was renamed toHEAP_DELETE_MIN
. New operationsHEAP_REPLACE
andHEAP_REPLACE_MIN
have been added. If you need to track positions of elements in the heap, please check the notes at individual functions. -
The configuration file parser has been improved:
-
Multiple instances of the configuration parser are supported.
-
Incompatible: As there may be more instances, we can no longer use global variables to control the configuration system. In particular,
cf_need_journal
andcf_pool
variables have been replaced by functions cf_set_journalling() and cf_get_pool(). -
Incompatible: Loading of configuration files has been decoupled from the getopt wrapper, so you might need to include
conf.h
for functions which were previously declared ingetopt.h
. -
New functions have been added: cf_open_group(), cf_close_group(), and cf_revert().
-
Incompatible: Dynamic configuration arrays have been re-implemented in terms of our generic growing arrays. This makes them easier to use and most of the interface has been preserved. The only exception is static allocation via the DARY_ALLOC() macro, which is no longer available.
-
-
Incompatible: The
UCW::CGI
Perl module has its custom error handlers (which override default Perl error handlers) split off to a separate moduleUCW::CGI::ErrorHandler
.
New modules
-
Daemon helpers have been added including a new
daemon-control
utility. The olddaemon-helper
utility has been obsoleted and it is not compiled by default. -
Signal helpers for translation between signal names and numbers have been added.
-
The fastbuf I/O layer received a new back-end fb_multi, which concatenates several fastbuf streams to form a single virtual stream.
-
Added varint module for efficient UTF-8-like encoding of 64-bit integers to byte sequences.
-
Added table printer module for configurable formatting of 2-dimensional tables in both user-friendly and machine-friendly ways.
-
A parser of command-line options has been added, similar in spirit to our configuration file parser. The getopt module has been obsoleted
-
Generic allocators have been introduced, providing an abstract way of memory allocation. Growing arrays are now based on such allocators, which allows for example growing arrays in memory pools.
Cleanups
-
Libucw finally has a clean ABI, which does not pollute namespace, risking collisions with other libraries. However, we did not want to abandon our nicely and simply named functions, so the header files define macros, which translate names of all externally visible symbols to start with
ucw_
. If you don’t like this, configure libucw withCONFIG_UCW_CLEAN_ABI
turned off. -
All helper utilities are now installed with names starting with
ucw-
to prevent collisions. -
The auxiliary libraries have been renamed to
libucw-charset
,libucw-images
,libucw-xml
. The clean ABI promise does not extend to them yet. -
The alias
uns
forunsigned int
has been replaced by a more commonuint
. The old name is still maintained for backward compatibility. -
Several functions now accept
size_t
instead ofunsigned int
for size arguments.
Minor changes
-
<stdbool.h>
is automatically included by<ucw/lib.h>
.
5.0 (2012-02-21)
-
Incompatible: The
timestamp_t
type has been decoupled from wall clock time. It now specifies the number of milliseconds from an unspecified origin, so that it can for example refer to the system monotonic clock. Theucw_time_t
type has been removed. -
The mainloop module has been rewritten:
-
Multiple instances of the main loop are supported (to be used in different threads or locally within a library function).
-
The new implementation is more efficient: it uses heaps for timers, epoll() for file descriptors (when available).
-
The return value of
main_file
handlers has been changed toHOOK_IDLE
andHOOK_RETRY
. However, the numerical values are equal, so old code should keep working. -
Incompatible: The main loop time (
main_now
) has been decoupled from wall clock time and moved to a field in themain_context
structure. It can be accessed either directly or via main_get_now(). Themain_now_seconds
variable has been removed,main_idle_time
has become a structure field. -
Incompatible: The interface for asynchronous reading and writing (file_read() and friends) has been separated from the core of the main loop. Use
struct main_block_io
and related functions instead. -
Incompatible: file_close_all() is gone. You have to call main_teardown() or main_destroy() to clean up properly after fork().
-
Added support for synchronous delivery of signals.
-
Added relative timers: timer_add_rel().
-
Modification of events from a running event handler is always safe.
-
Deleting an already deleted event is always safe.
-
For any event type, it is possible to ask whether it is active (added to the mainloop) or not: hook_is_active() and friends.
-
A new mainloop front-end for asynchronous record-based I/O has been added.
-
-
Added support for resource pools and transactions, which is a general mechanism for tracking resources and reporting errors. It is still considered experimental, so the API can change in future releases.
-
Added a growing array module
gary.h
, similar togbuf.h
, but with a much more convenient interface. -
The Circular linked lists can recognize unlinked nodes, see clist_unlink().
-
Added
strtonum.h
— a module for precise parsing of numbers. -
When compiled by a recent enough GCC,
__thread
is used for thread-local variables, which is more efficient than the POSIX per-thread storage.-
Incompatible:
ucwlib_context->thread_id
is no longer available directly, please use ucwlib_thread_id() instead.
-
-
Incompatible: Several modules have been declared obsolete and removed:
-
sighandler
— generic signal handling (it still exists internally) -
qache
— a mmap-based shared cache -
prefetch
— an interface to memory prefetch instructions; superseded by GCC__builtin_prefetch
-
randomkey
— a generator of cryptographically strong pseudo-random tokens; will be replaced by something more generic soon -
profile
— a profiling hack
-
-
Incompatible: Several modules now have their own header files:
-
process.h
— all functions related to processes, previously declared inlib.h
-
io.h
— functions related to files fromlib.h
andlfs.h
-
time.h
— timestamps and interval timers, previously inlib.h
-
-
Incompatible: Several configuration options were renamed or removed:
-
CONFIG_FAKE_ELTPOOL
→CONFIG_UCW_FAKE_ELTPOOL
-
CONFIG_LARGE_FILES
→CONFIG_UCW_LARGE_FILES
-
CONFIG_OWN_GETOPT
→CONFIG_UCW_OWN_GETOPT
-
CONFIG_DIRECT_IO
→CONFIG_UCW_DIRECT_IO
-
DEFAULT_CONFIG
→CONFIG_UCW_DEFAULT_CONFIG
-
ENV_VAR_CONFIG
→CONFIG_UCW_ENV_VAR_CONFIG
-
CONFIG_LFS
was removed -
CONFIG_URL_ESCAPE_COMPAT
was removed
-
-
UCW::Configure
supports running of test programs. -
UCW::CGI
support multiple argument tables and UTF-8 mode. Also, it uses the proper HTTP status codes when reporting errors. -
Implementation details of fastbufs have changed. The new code checks invariants more carefully, so it is possible that custom fastbuf back-ends which are buggy now fail, although they previously seemed to work.
4.0 (2009-04-13)
This was the first stand-alone release of LibUCW. Before that, LibUCW was developed as a part of the Sherlock Holmes project.