X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=README;h=659511f7c46eba7260e1297ae247efceaa88b7bf;hp=a2ca1eb147a7318845ac0da336ff40ba5ba86f22;hb=ef84facf4b0c23bd695ca9300055e3ffc9b56006;hpb=955f5e52a3b7b6bdb80264279b990486e990dd02 diff --git a/README b/README index a2ca1eb..659511f 100644 --- a/README +++ b/README @@ -24,9 +24,23 @@ BUILDING ARCHITECTURES SUPPORTED ----------------------- -Currently, x86 (i386, i486, i586, i686), x86 64-bit, PowerPC 32/64, S390, S390x -and Sparcv9 32/64 are supported. Only tested on Linux so far, but should -theoretically work on other operating systems. +Currently, x86 (i386, i486, i586, i686), x86 64-bit, PowerPC 32/64, S390, S390x, +ARM, Alpha, ia64 and Sparcv9 32/64 are supported. Only tested on Linux so +far, but should theoretically work on other operating systems. + +ARM depends on running a Linux kernel 2.6.15 or better. + +The gcc compiler versions 3.3, 3.4, 4.0, 4.1, 4.2, 4.3, 4.4 and 4.5 are +supported, with the following exceptions: + +- gcc 3.3 and 3.4 have a bug that prevents them from generating volatile + accesses to offsets in a TLS structure on 32-bit x86. These versions are + therefore not compatible with liburcu on x86 32-bit (i386, i486, i586, i686). + The problem has been reported to the gcc community: + http://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg281255.html +- Alpha, ia64 and ARM architectures depend on 4.x gcc with atomic builtins + support. + QUICK START GUIDE ----------------- @@ -71,7 +85,8 @@ Usage of liburcu-mb Usage of liburcu-signal - * #include + * #include + * Compile any _LGPL_SOURCE code using this library with "-DRCU_SIGNAL". * Link the application with "-lurcu-signal". * Version of the library that requires a signal, typically SIGUSR1. Can be overridden with -DSIGRCU by modifying Makefile.build.inc. @@ -175,3 +190,24 @@ SMP support ./configure --disable-smp-support theoretically yielding slightly better performance. + +Interaction with fork() + + Special care must be taken for applications performing fork() without + any following exec(). This is caused by the fact that Linux only clones + the thread calling fork(), and thus never replicates any of the other + parent thread into the child process. Most liburcu implementations + require that all registrations (as reader, defer_rcu and call_rcu + threads) should be released before a fork() is performed, except for the + rather common scenario where fork() is immediately followed by exec() in + the child process. The only implementation not subject to that rule is + liburcu-bp, which is designed to handle fork() by calling + rcu_bp_before_fork, rcu_bp_after_fork_parent and + rcu_bp_after_fork_child. + + Applications that use call_rcu() and that fork() without + doing an immediate exec() must take special action. The parent + must invoke call_rcu_before_fork() before the fork() and + call_rcu_after_fork_parent() after the fork(). The child + process must invoke call_rcu_after_fork_child(). + These three APIs are suitable for passing to pthread_atfork().