thread_safety.html revision c079ed6b1fb644a1918272d11b1648783d97ace6
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross<html xmlns="http://www.w3.org/1999/xhtml">
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross <head>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross <meta name="generator" content="HTML Tidy, see www.w3.org" />
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross <title>Apache 2.0 Thread Safety Issues</title>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross </head>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross <!-- Background white, links blue (unvisited), navy (visited), red (active) -->
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross <body bgcolor="#FFFFFF" text="#000000" link="#0000FF"
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vlink="#000080" alink="#FF0000">
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross <!--#include virtual="header.html" -->
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross <h1>Thread Safety</h1>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross <p>When using any of the threaded mpms in Apache 2.0 it is important
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross that every function called from Apache be thread safe. When linking in 3rd
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross party extensions it can be difficult to determine whether the resulting
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross server will be thread safe. Casual testing generally won't tell you this
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross either as thread safety problems can lead to subtle race conditons that
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross may only show up in certain conditions under heavy load.</p>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross <h1>Common 3rd Party Libraries</h1>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross <p>The following is a list of common libraries that are used by 3rd party
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross Apache modules. You can check to see if your module is using a potentially
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross unsafe library by using tools such as <tt>ldd</tt> and <tt>nm</tt>. For
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross PHP, for example, try this:</p>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross<pre>% ldd libphp4.so
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibsablot.so.0 => /usr/local/lib/libsablot.so.0 (0x401f6000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibexpat.so.0 => /usr/lib/libexpat.so.0 (0x402da000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibsnmp.so.0 => /usr/lib/libsnmp.so.0 (0x402f9000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibpdf.so.1 => /usr/local/lib/libpdf.so.1 (0x40353000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibz.so.1 => /usr/lib/libz.so.1 (0x403e2000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibpng.so.2 => /usr/lib/libpng.so.2 (0x403f0000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibmysqlclient.so.11 => /usr/lib/libmysqlclient.so.11 (0x40411000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibming.so => /usr/lib/libming.so (0x40449000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibm.so.6 => /lib/libm.so.6 (0x40487000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x404a8000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x404e7000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibcrypt.so.1 => /lib/libcrypt.so.1 (0x40505000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibssl.so.2 => /lib/libssl.so.2 (0x40532000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibcrypto.so.2 => /lib/libcrypto.so.2 (0x40560000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibresolv.so.2 => /lib/libresolv.so.2 (0x40624000)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rosslibdl.so.2 => /lib/libdl.so.2 (0x40634000)
libnsl.so.1 => /lib/libnsl.so.1 (0x40637000)
libc.so.6 => /lib/libc.so.6 (0x4064b000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)</pre>
<p>In addition to these libraries you will need to have a look at any libraries
linked statically into the module. You can use <tt>nm</tt> to look for
individual symbols in the module.</p>
<h2>Library List</h2>
<p>Please drop a note to dev@httpd.apache.org if you have additions or
corrections to this list.</p>
<table><tr><th>Library</th><th>Version</th><th>Thread Safe?</th><th>Notes</th></tr>
<tr><td><a href="http://aspell.sourceforge.net/">ASpell/PSpell</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.sleepycat.com/">Berkeley DB</a></td><td>3.x,4.x </td><td>Yes</td><td>Be careful about sharing a connection across threads.</td></tr>
<tr><td><a href="http://sources.redhat.com/bzip2/index.html">BZip2</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://cr.yp.to/cdb.html">cdb</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.washington.edu/imap/">C-Client</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.fastio.com/">cpdflib</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.ijg.org/files/">libcrypt</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td>Expat</td><td> </td><td>Yes</td><td>Need a separate parser instance per thread</td></tr>
<tr><td><a href="http://www.freetds.org/">FreeTDS</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.freetype.org/">FreeType</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.boutell.com/gd/">GD 1.8.x</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.boutell.com/gd/">GD 2.0.x</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.gnu.org/software/gdbm/gdbm.html">gdbm</a></td><td> </td><td>No</td><td>Errors returned via a static gdbm_error variable</td></tr>
<tr><td><a href="http://www.imagemagick.org/">ImageMagick</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.enlightenment.org/pages/imlib2.html">Imlib2</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.ijg.org/files/">libjpeg</a></td><td>v6b</td><td>?</td><td> </td></tr>
<tr><td><a href="http://mysql.com">libmysqlclient</a></td><td> </td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.opaque.net/ming/">Ming</a></td><td>0.2a</td><td>?</td><td> </td></tr>
<tr><td><a href="http://net-snmp.sourceforge.net/">Net-SNMP</a></td><td>5.0.x</td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.openldap.org/">OpenLDAP</a></td><td>2.1.x</td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.openssl.org/">OpenSSL</a></td><td>0.96g</td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.oracle.com/">liboci8 (Oracle 8+)</a></td><td>8.x,9.x</td><td>?</td><td> </td></tr>
<tr><td><a href="http://pdflib.com/">pdflib</a></td><td>4.0.x</td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.libpng.org/pub/png/libpng.html">libpng</a></td><td>1.0.x</td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.libpng.org/pub/png/libpng.html">libpng</a></td><td>1.2.x</td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.postgresql.org/idocs/index.php?libpq-threading.html">libpq (PostgreSQL)</a></td><td>7.x</td><td>Yes</td><td>Don't share connections across threads and watch out for crypt() calls</td></tr>
<tr><td><a href="http://www.gingerall.com/charlie/ga/xml/p_sab.xml">Sablotron</a></td><td>0.95</td><td>?</td><td> </td></tr>
<tr><td><a href="http://www.gzip.org/zlib/">zlib</a></td><td>1.1.4</td><td>Yes?</td><td> </td></tr>
</table>
<!--#include virtual="footer.html" -->
</body>
</html>