7 * The <<mainloop:,mainloop>> module has been rewritten:
8 ** Multiple instances of the main loop are supported (to be used in different
9 threads or locally within a library function).
10 ** The new implementation is more efficient: it uses heaps for timers,
11 epoll() for file descriptors (when available).
12 ** The return value of <<mainloop:struct_main_file,`main_file`>> handlers has been
13 changed to <<mainloop:enum_main_hook_return,`HOOK_IDLE`>> and <<mainloop:enum_main_hook_return,`HOOK_RETRY`>>.
14 However, the numerical values are equal, so old code should keep working.
15 ** *Incompatible:* The global variables `main_now`, `main_now_seconds`,
16 and `main_idle_time` are no longer available. They have become fields
17 in the `main_context` structure, which can be accessed either directly
18 or via helper functions like <<mainloop:fun_main_get_now,`main_get_now()`>>.
19 ** *Incompatible:* The interface for asynchronous reading and writing
20 (file_read() and friends) has been separated from the core of the main loop.
21 Use <<mainloop:struct_main_block_io,`struct main_block_io`>> and related functions instead.
22 ** *Incompatible:* file_close_all() is gone. You have to call <<mainloop:fun_main_teardown,`main_teardown()`>>
23 or <<mainloop:fun_main_destroy,`main_destroy()`>> to clean up properly after fork().
24 ** Added support for <<mainloop:signal,synchronous delivery of signals>>.
25 ** Added relative timers: <<mainloop:fun_timer_add_rel,`timer_add_rel()`>>.
26 ** Modification of events from a running event handler is always safe.
27 ** Deleting an already deleted event is always safe.
28 ** For any event type, it is possible to ask whether it is active (added to the mainloop) or not: <<mainloop:fun_hook_is_active,`hook_is_active()`>> and friends.
29 ** A new mainloop front-end for asynchronous <<mainloop:recordio,record-based I/O>> has been added.
31 * Added support for <<trans:,resource pools and transactions>>, which is a general
32 mechanism for tracking resources and reporting errors. It is still considered
33 experimental, so the API can change in future releases.
35 * Added a growing array module `gary.h`, similar to `gbuf.h`, but with
36 a much more convenient interface.
38 * The <<lists:,Circular linked lists>> can recognize unlinked nodes,
39 see <<lists:fun_clist_unlink,`clist_unlink()`>>.
41 * Added `strtonum.h` -- a module for precise parsing of numbers.
43 * When compiled by a recent enough GCC, `__thread` is used for thread-local variables,
44 which is more efficient than the POSIX per-thread storage.
45 ** *Incompatible:* `ucwlib_context->thread_id` is no longer available directly,
46 please use ucwlib_thread_id() instead.
48 * *Incompatible:* Several modules have been declared obsolete and removed:
49 ** `sighandler` -- generic signal handling (it still exists internally)
50 ** `qache` -- a mmap-based shared cache
51 ** `prefetch` -- an interface to memory prefetch instructions; superseded by GCC `__builtin_prefetch`
52 ** `randomkey` -- a generator of cryptographically strong pseudo-random tokens; will be replaced
53 by something more generic soon
54 ** `profile` -- a profiling hack
56 * *Incompatible:* Several modules now have their own header files:
57 ** `process.h` -- all functions related to processes, previously declared in `lib.h`
58 ** `io.h` -- functions related to files from `lib.h` and `lfs.h`
60 * `UCW::Configure` supports running of test programs.
62 * `UCW::CGI` support multiple argument tables and UTF-8 mode. Also, it uses the
63 proper HTTP status codes when reporting errors.
68 This was the first stand-alone release of LibUCW. Before that, LibUCW was developed
69 as a part of the http://www.ucw.cz/holmes/[Sherlock Holmes project].