Sophie

Sophie

distrib > Fedora > 20 > i386 > by-pkgid > bd25a922043039bd471905083b1612dc > files > 70

lmdb-doc-0.9.13-1.fc20.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.6"/>
<title>MDB: Reader Lock Table</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">MDB
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.6 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark">&#160;</span>Pages</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#define-members">Macros</a>  </div>
  <div class="headertitle">
<div class="title">Reader Lock Table<div class="ingroups"><a class="el" href="group__internal.html">MDB Internals</a></div></div>  </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr class="memitem:structMDB__rxbody"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#structMDB__rxbody">MDB_rxbody</a></td></tr>
<tr class="separator:structMDB__rxbody"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:structMDB__reader"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#structMDB__reader">MDB_reader</a></td></tr>
<tr class="separator:structMDB__reader"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:structMDB__txbody"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#structMDB__txbody">MDB_txbody</a></td></tr>
<tr class="separator:structMDB__txbody"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:structMDB__txninfo"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#structMDB__txninfo">MDB_txninfo</a></td></tr>
<tr class="separator:structMDB__txninfo"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:gadff1f7b4d4626610a8d616e0c6dbbea4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#gadff1f7b4d4626610a8d616e0c6dbbea4">DEFAULT_READERS</a>&#160;&#160;&#160;126</td></tr>
<tr class="separator:gadff1f7b4d4626610a8d616e0c6dbbea4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa62717a1fae2c57f94f2a9b8ae08ec49"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#gaa62717a1fae2c57f94f2a9b8ae08ec49">CACHELINE</a>&#160;&#160;&#160;64</td></tr>
<tr class="separator:gaa62717a1fae2c57f94f2a9b8ae08ec49"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gabb6423d38a9132eedb4f2e2be72b8aeb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#gabb6423d38a9132eedb4f2e2be72b8aeb">MDB_LOCK_FORMAT</a></td></tr>
<tr class="separator:gabb6423d38a9132eedb4f2e2be72b8aeb"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<p>Readers don't acquire any locks for their data access. Instead, they simply record their transaction ID in the reader table. The reader mutex is needed just to find an empty slot in the reader table. The slot's address is saved in thread-specific data so that subsequent read transactions started by the same thread need no further locking to proceed.</p>
<p>If <a class="el" href="group__mdb__env.html#ga5dca84a576d14b4bfe2deddc2dc622d3">MDB_NOTLS</a> is set, the slot address is not saved in thread-specific data.</p>
<p>No reader table is used if the database is on a read-only filesystem, or if <a class="el" href="group__mdb__env.html#ga9b0450b1a87cb9f22e033550e49e5037">MDB_NOLOCK</a> is set.</p>
<p>Since the database uses multi-version concurrency control, readers don't actually need any locking. This table is used to keep track of which readers are using data from which old transactions, so that we'll know when a particular old transaction is no longer in use. Old transactions that have discarded any data pages can then have those pages reclaimed for use by a later write transaction.</p>
<p>The lock table is constructed such that reader slots are aligned with the processor's cache line size. Any slot is only ever used by one thread. This alignment guarantees that there will be no contention or cache thrashing as threads update their own slot info, and also eliminates any need for locking when accessing a slot.</p>
<p>A writer thread will scan every slot in the table to determine the oldest outstanding reader transaction. Any freed pages older than this will be reclaimed by the writer. The writer doesn't use any locks when scanning this table. This means that there's no guarantee that the writer will see the most up-to-date reader info, but that's not required for correct operation - all we need is to know the upper bound on the oldest reader, we don't care at all about the newest reader. So the only consequence of reading stale information here is that old pages might hang around a while longer before being reclaimed. That's actually good anyway, because the longer we delay reclaiming old pages, the more likely it is that a string of contiguous pages can be found after coalescing old pages from many old transactions together. </p>
<hr/><h2 class="groupheader">Data Structure Documentation</h2>
<a name="structMDB__rxbody" id="structMDB__rxbody"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">struct MDB_rxbody</td>
        </tr>
      </table>
</div><div class="memdoc">
<div class="textblock"><p>The information we store in a single slot of the reader table. In addition to a transaction ID, we also record the process and thread ID that owns a slot, so that we can detect stale information, e.g. threads or processes that went away without cleaning up. </p>
<dl class="section note"><dt>Note</dt><dd>We currently don't check for stale records. We simply re-init the table when we know that we're the only process opening the lock file. </dd></dl>
</div><table class="memberdecls">
<tr><td colspan="2"><h3>Data Fields</h3></td></tr>
<tr class="memitem:a4245d1075e9e0fbf5f53139e156d322e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__internal.html#gabbaef7c9c710f8652a62c32d748c040e">txnid_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#a4245d1075e9e0fbf5f53139e156d322e">mrb_txnid</a></td></tr>
<tr class="separator:a4245d1075e9e0fbf5f53139e156d322e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7ce8a798a43a3f5a8dfe3bb29f2cb436"><td class="memItemLeft" align="right" valign="top">MDB_PID_T&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#a7ce8a798a43a3f5a8dfe3bb29f2cb436">mrb_pid</a></td></tr>
<tr class="separator:a7ce8a798a43a3f5a8dfe3bb29f2cb436"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac59a7b208f937a60ec8573c4d9f31ced"><td class="memItemLeft" align="right" valign="top">pthread_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#ac59a7b208f937a60ec8573c4d9f31ced">mrb_tid</a></td></tr>
<tr class="separator:ac59a7b208f937a60ec8573c4d9f31ced"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<h4 class="groupheader">Field Documentation</h4>
<a class="anchor" id="a4245d1075e9e0fbf5f53139e156d322e"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="group__internal.html#gabbaef7c9c710f8652a62c32d748c040e">txnid_t</a> MDB_rxbody::mrb_txnid</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Current Transaction ID when this transaction began, or (txnid_t)-1. Multiple readers that start at the same time will probably have the same ID here. Again, it's not important to exclude them from anything; all we need to know is which version of the DB they started from so we can avoid overwriting any data used in that particular version. </p>

</div>
</div>
<a class="anchor" id="a7ce8a798a43a3f5a8dfe3bb29f2cb436"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">MDB_PID_T MDB_rxbody::mrb_pid</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>The process ID of the process owning this reader txn. </p>

</div>
</div>
<a class="anchor" id="ac59a7b208f937a60ec8573c4d9f31ced"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">pthread_t MDB_rxbody::mrb_tid</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>The thread ID of the thread owning this txn. </p>

</div>
</div>

</div>
</div>
<a name="structMDB__reader" id="structMDB__reader"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">struct MDB_reader</td>
        </tr>
      </table>
</div><div class="memdoc">
<div class="textblock"><p>The actual reader record, with cacheline padding. </p>
</div><table class="memberdecls">
<tr><td colspan="2"><h3>Data Fields</h3></td></tr>
<tr class="memitem:a908d58fbb94c3dc69601e49a388ed495"><td class="memItemLeft" ><a class="anchor" id="a908d58fbb94c3dc69601e49a388ed495"></a>
union {</td></tr>
<tr class="memitem:a965ae6b00ee0e81f46d8e6caeb62ad57"><td class="memItemLeft" ><a class="anchor" id="ac84acf9bf3904324088baa5068051570"></a>
&#160;&#160;&#160;<a class="el" href="group__readers.html#structMDB__rxbody">MDB_rxbody</a>&#160;&#160;&#160;<b>mrx</b></td></tr>
<tr class="separator:a965ae6b00ee0e81f46d8e6caeb62ad57"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a32757e4ff03f5358c7ccb8c884f894e1"><td class="memItemLeft" >&#160;&#160;&#160;char&#160;&#160;&#160;<a class="el" href="group__readers.html#a929d826ca3de1126f4538d3cd87083e1">pad</a> [(sizeof(<a class="el" href="group__readers.html#structMDB__rxbody">MDB_rxbody</a>)+<a class="el" href="group__readers.html#gaa62717a1fae2c57f94f2a9b8ae08ec49">CACHELINE</a>-1)&amp;~(<a class="el" href="group__readers.html#gaa62717a1fae2c57f94f2a9b8ae08ec49">CACHELINE</a>-1)]</td></tr>
<tr class="separator:a32757e4ff03f5358c7ccb8c884f894e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a908d58fbb94c3dc69601e49a388ed495"><td class="memItemLeft" valign="top">}&#160;</td><td class="memItemRight" valign="bottom"><b>mru</b></td></tr>
<tr class="separator:a908d58fbb94c3dc69601e49a388ed495"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<h4 class="groupheader">Field Documentation</h4>
<a class="anchor" id="a929d826ca3de1126f4538d3cd87083e1"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">char MDB_reader::pad[(sizeof(<a class="el" href="group__readers.html#structMDB__rxbody">MDB_rxbody</a>)+<a class="el" href="group__readers.html#gaa62717a1fae2c57f94f2a9b8ae08ec49">CACHELINE</a>-1)&amp;~(<a class="el" href="group__readers.html#gaa62717a1fae2c57f94f2a9b8ae08ec49">CACHELINE</a>-1)]</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>cache line alignment </p>

</div>
</div>

</div>
</div>
<a name="structMDB__txbody" id="structMDB__txbody"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">struct MDB_txbody</td>
        </tr>
      </table>
</div><div class="memdoc">
<div class="textblock"><p>The header for the reader table. The table resides in a memory-mapped file. (This is a different file than is used for the main database.)</p>
<p>For POSIX the actual mutexes reside in the shared memory of this mapped file. On Windows, mutexes are named objects allocated by the kernel; we store the mutex names in this mapped file so that other processes can grab them. This same approach is also used on MacOSX/Darwin (using named semaphores) since MacOSX doesn't support process-shared POSIX mutexes. For these cases where a named object is used, the object name is derived from a 64 bit FNV hash of the environment pathname. As such, naming collisions are extremely unlikely. If a collision occurs, the results are unpredictable. </p>
</div><table class="memberdecls">
<tr><td colspan="2"><h3>Data Fields</h3></td></tr>
<tr class="memitem:ada53ed82f4a10575e96a6d2e48da3c9a"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#ada53ed82f4a10575e96a6d2e48da3c9a">mtb_magic</a></td></tr>
<tr class="separator:ada53ed82f4a10575e96a6d2e48da3c9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aad8e50c2b4e26c5aba42ec028f43d939"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#aad8e50c2b4e26c5aba42ec028f43d939">mtb_format</a></td></tr>
<tr class="separator:aad8e50c2b4e26c5aba42ec028f43d939"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a656378aaef0ca416a2697b475ab701a3"><td class="memItemLeft" align="right" valign="top">pthread_mutex_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#a656378aaef0ca416a2697b475ab701a3">mtb_mutex</a></td></tr>
<tr class="separator:a656378aaef0ca416a2697b475ab701a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4b8e225ef5ff901be32acfebcbaee1b4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__internal.html#gabbaef7c9c710f8652a62c32d748c040e">txnid_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#a4b8e225ef5ff901be32acfebcbaee1b4">mtb_txnid</a></td></tr>
<tr class="separator:a4b8e225ef5ff901be32acfebcbaee1b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7f875ee3a63a75dec8997b27c6a3de96"><td class="memItemLeft" align="right" valign="top">unsigned&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__readers.html#a7f875ee3a63a75dec8997b27c6a3de96">mtb_numreaders</a></td></tr>
<tr class="separator:a7f875ee3a63a75dec8997b27c6a3de96"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<h4 class="groupheader">Field Documentation</h4>
<a class="anchor" id="ada53ed82f4a10575e96a6d2e48da3c9a"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">uint32_t MDB_txbody::mtb_magic</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Stamp identifying this as an MDB file. It must be set to <a class="el" href="group__internal.html#ga4cac6326c08147a019e8ddb17ad712f6">MDB_MAGIC</a>. </p>

</div>
</div>
<a class="anchor" id="aad8e50c2b4e26c5aba42ec028f43d939"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">uint32_t MDB_txbody::mtb_format</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Format of this lock file. Must be set to <a class="el" href="group__readers.html#gabb6423d38a9132eedb4f2e2be72b8aeb">MDB_LOCK_FORMAT</a>. </p>

</div>
</div>
<a class="anchor" id="a656378aaef0ca416a2697b475ab701a3"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">pthread_mutex_t MDB_txbody::mtb_mutex</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Mutex protecting access to this table. This is the reader lock that <a class="el" href="group__compat.html#ga74f0c371e4bae613aa6bc76bbe10783e">LOCK_MUTEX_R</a> acquires. </p>

</div>
</div>
<a class="anchor" id="a4b8e225ef5ff901be32acfebcbaee1b4"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="group__internal.html#gabbaef7c9c710f8652a62c32d748c040e">txnid_t</a> MDB_txbody::mtb_txnid</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>The ID of the last transaction committed to the database. This is recorded here only for convenience; the value can always be determined by reading the main database meta pages. </p>

</div>
</div>
<a class="anchor" id="a7f875ee3a63a75dec8997b27c6a3de96"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">unsigned MDB_txbody::mtb_numreaders</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>The number of slots that have been used in the reader table. This always records the maximum count, it is not decremented when readers release their slots. </p>

</div>
</div>

</div>
</div>
<a name="structMDB__txninfo" id="structMDB__txninfo"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">struct MDB_txninfo</td>
        </tr>
      </table>
</div><div class="memdoc">
<div class="textblock"><p>The actual reader table definition. </p>
</div><table class="memberdecls">
<tr><td colspan="2"><h3>Data Fields</h3></td></tr>
<tr class="memitem:a4db5be1663ce9c79ee5c9d150db5cf6d"><td class="memItemLeft" ><a class="anchor" id="a4db5be1663ce9c79ee5c9d150db5cf6d"></a>
union {</td></tr>
<tr class="memitem:abdfcda7540b69a753390969cdac71ad6"><td class="memItemLeft" ><a class="anchor" id="aa7ad20d38b7ec6c39d8a58841ce5ea5e"></a>
&#160;&#160;&#160;<a class="el" href="group__readers.html#structMDB__txbody">MDB_txbody</a>&#160;&#160;&#160;<b>mtb</b></td></tr>
<tr class="separator:abdfcda7540b69a753390969cdac71ad6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7464b63860452741502752ed8deabc1d"><td class="memItemLeft" ><a class="anchor" id="af5acdc3a5439e1387aff53cf94126faf"></a>
&#160;&#160;&#160;char&#160;&#160;&#160;<b>pad</b> [(sizeof(<a class="el" href="group__readers.html#structMDB__txbody">MDB_txbody</a>)+<a class="el" href="group__readers.html#gaa62717a1fae2c57f94f2a9b8ae08ec49">CACHELINE</a>-1)&amp;~(<a class="el" href="group__readers.html#gaa62717a1fae2c57f94f2a9b8ae08ec49">CACHELINE</a>-1)]</td></tr>
<tr class="separator:a7464b63860452741502752ed8deabc1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4db5be1663ce9c79ee5c9d150db5cf6d"><td class="memItemLeft" valign="top">}&#160;</td><td class="memItemRight" valign="bottom"><b>mt1</b></td></tr>
<tr class="separator:a4db5be1663ce9c79ee5c9d150db5cf6d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:acdb8d8ddae448040ac930c963ff008c3"><td class="memItemLeft" ><a class="anchor" id="acdb8d8ddae448040ac930c963ff008c3"></a>
union {</td></tr>
<tr class="memitem:a83654fd401ec5ed5c420fbd83824cc70"><td class="memItemLeft" ><a class="anchor" id="af38972d479a52e5a1f48215792352506"></a>
&#160;&#160;&#160;pthread_mutex_t&#160;&#160;&#160;<b>mt2_wmutex</b></td></tr>
<tr class="separator:a83654fd401ec5ed5c420fbd83824cc70"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac56554c2bfd5ad208e3685b9f3576424"><td class="memItemLeft" ><a class="anchor" id="af5acdc3a5439e1387aff53cf94126faf"></a>
&#160;&#160;&#160;char&#160;&#160;&#160;<b>pad</b> [(MNAME_LEN+<a class="el" href="group__readers.html#gaa62717a1fae2c57f94f2a9b8ae08ec49">CACHELINE</a>-1)&amp;~(<a class="el" href="group__readers.html#gaa62717a1fae2c57f94f2a9b8ae08ec49">CACHELINE</a>-1)]</td></tr>
<tr class="separator:ac56554c2bfd5ad208e3685b9f3576424"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:acdb8d8ddae448040ac930c963ff008c3"><td class="memItemLeft" valign="top">}&#160;</td><td class="memItemRight" valign="bottom"><b>mt2</b></td></tr>
<tr class="separator:acdb8d8ddae448040ac930c963ff008c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a117ef3a179ebedd591908fc6051e16ee"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a117ef3a179ebedd591908fc6051e16ee"></a>
<a class="el" href="group__readers.html#structMDB__reader">MDB_reader</a>&#160;</td><td class="memItemRight" valign="bottom"><b>mti_readers</b> [1]</td></tr>
<tr class="separator:a117ef3a179ebedd591908fc6051e16ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>

</div>
</div>
<h2 class="groupheader">Macro Definition Documentation</h2>
<a class="anchor" id="gadff1f7b4d4626610a8d616e0c6dbbea4"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define DEFAULT_READERS&#160;&#160;&#160;126</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Number of slots in the reader table. This value was chosen somewhat arbitrarily. 126 readers plus a couple mutexes fit exactly into 8KB on my development machine. Applications should set the table size using <a class="el" href="group__internal.html#gae687966c24b790630be2a41573fe40e2" title="Set the maximum number of threads/reader slots for the environment. ">mdb_env_set_maxreaders()</a>. </p>

</div>
</div>
<a class="anchor" id="gaa62717a1fae2c57f94f2a9b8ae08ec49"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define CACHELINE&#160;&#160;&#160;64</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>The size of a CPU cache line in bytes. We want our lock structures aligned to this size to avoid false cache line sharing in the lock table. This value works for most CPUs. For Itanium this should be 128. </p>

</div>
</div>
<a class="anchor" id="gabb6423d38a9132eedb4f2e2be72b8aeb"></a>
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define MDB_LOCK_FORMAT</td>
        </tr>
      </table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line">((uint32_t) \</div>
<div class="line">     ((<a class="code" href="group__internal.html#ga1d56e55199f31cd585300a2b73c22d82">MDB_LOCK_VERSION</a>) \</div>
<div class="line">      <span class="comment">/* Flags which describe functionality */</span> \</div>
<div class="line">      + (((<a class="code" href="group__compat.html#ga074373701b95aeaf38530ad7f9970030">MDB_PIDLOCK</a>) != 0) &lt;&lt; 16)))</div>
<div class="ttc" id="group__internal_html_ga1d56e55199f31cd585300a2b73c22d82"><div class="ttname"><a href="group__internal.html#ga1d56e55199f31cd585300a2b73c22d82">MDB_LOCK_VERSION</a></div><div class="ttdeci">#define MDB_LOCK_VERSION</div><div class="ttdef"><b>Definition:</b> mdb.c:393</div></div>
<div class="ttc" id="group__compat_html_ga074373701b95aeaf38530ad7f9970030"><div class="ttname"><a href="group__compat.html#ga074373701b95aeaf38530ad7f9970030">MDB_PIDLOCK</a></div><div class="ttdeci">#define MDB_PIDLOCK</div><div class="ttdef"><b>Definition:</b> mdb.c:205</div></div>
</div><!-- fragment --><p>Lockfile format signature: version, features and field layout </p>

</div>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Jul 18 2014 09:17:15 for MDB by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.6
</small></address>
</body>
</html>