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)

6.1 (2014-08-09)

Incompatible changes

  • Major changes of the table printer module. Finally, its interface can be considered stable now.

Minor changes

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 and GARY_POP. If you want to push/pop multiple elements at once, use GARY_PUSH_MULTI and GARY_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), similarly HEAP_INCREASE and HEAP_DECREASE. The HEAP_DELMIN operation was renamed to HEAP_DELETE_MIN. New operations HEAP_REPLACE and HEAP_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 and cf_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 in getopt.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 module UCW::CGI::ErrorHandler.

New modules

  • Daemon helpers have been added including a new daemon-control utility. The old daemon-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.


  • 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 with CONFIG_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 for unsigned int has been replaced by a more common uint. The old name is still maintained for backward compatibility.

  • Several functions now accept size_t instead of unsigned 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. The ucw_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 to HOOK_IDLE and HOOK_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 the main_context structure. It can be accessed either directly or via main_get_now(). The main_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 to gbuf.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 in lib.h

    • io.h — functions related to files from lib.h and lfs.h

    • time.h — timestamps and interval timers, previously in lib.h

  • Incompatible: Several configuration options were renamed or removed:







    • 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.