| <!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.3"/> |
| <title>Lucene.Net: core/Store/MMapDirectory.cs Source File</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 id="projectlogo"><img alt="Logo" src="lucene-net-icon-128x128.png"/></td> |
| <td style="padding-left: 0.5em;"> |
| <div id="projectname">Lucene.Net |
|  <span id="projectnumber">3.0.3</span> |
| </div> |
| <div id="projectbrief">Lucene.Net is a .NET port of the Java Lucene Indexing Library</div> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <!-- end header part --> |
| <!-- Generated by Doxygen 1.8.3 --> |
| <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 Page</span></a></li> |
| <li><a href="namespaces.html"><span>Packages</span></a></li> |
| <li><a href="annotated.html"><span>Classes</span></a></li> |
| <li class="current"><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 id="navrow2" class="tabs2"> |
| <ul class="tablist"> |
| <li><a href="files.html"><span>File List</span></a></li> |
| <li><a href="globals.html"><span>File Members</span></a></li> |
| </ul> |
| </div> |
| <!-- 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"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Properties</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 id="nav-path" class="navpath"> |
| <ul> |
| <li class="navelem"><a class="el" href="dir_1efe588324fc547683bba4a3f1bac847.html">core</a></li><li class="navelem"><a class="el" href="dir_0fd6a22b48ba7ca96d8c1554e5fff3e1.html">Store</a></li> </ul> |
| </div> |
| </div><!-- top --> |
| <div class="header"> |
| <div class="headertitle"> |
| <div class="title">MMapDirectory.cs</div> </div> |
| </div><!--header--> |
| <div class="contents"> |
| <a href="_m_map_directory_8cs.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/* </span></div> |
| <div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * Licensed to the Apache Software Foundation (ASF) under one or more</span></div> |
| <div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> * contributor license agreements. See the NOTICE file distributed with</span></div> |
| <div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * this work for additional information regarding copyright ownership.</span></div> |
| <div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> * The ASF licenses this file to You under the Apache License, Version 2.0</span></div> |
| <div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * (the "License"); you may not use this file except in compliance with</span></div> |
| <div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> * the License. You may obtain a copy of the License at</span></div> |
| <div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> * </span></div> |
| <div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment"> * http://www.apache.org/licenses/LICENSE-2.0</span></div> |
| <div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment"> * </span></div> |
| <div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment"> * Unless required by applicable law or agreed to in writing, software</span></div> |
| <div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment"> * distributed under the License is distributed on an "AS IS" BASIS,</span></div> |
| <div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div> |
| <div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment"> * See the License for the specific language governing permissions and</span></div> |
| <div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment"> * limitations under the License.</span></div> |
| <div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment"> */</span></div> |
| <div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div> |
| <div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="keyword">using</span> System;</div> |
| <div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div> |
| <div class="line"><a name="l00020"></a><span class="lineno"><a class="code" href="_m_map_directory_8cs.html#a4d21c5a1cd18c33bc4f3633bd17d823b"> 20</a></span> <span class="keyword">using</span> <a class="code" href="_documents_writer_8cs.html#a4d21c5a1cd18c33bc4f3633bd17d823b">Constants</a> = Lucene.Net.Util.Constants;</div> |
| <div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div> |
| <div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">namespace </span>Lucene.Net.Store</div> |
| <div class="line"><a name="l00023"></a><span class="lineno"> 23</span> {</div> |
| <div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  </div> |
| <div class="line"><a name="l00062"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html"> 62</a></span>  <span class="keyword">public</span> <span class="keyword">class </span><a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html" title="File-based Directory implementation that uses mmap for reading, and SimpleFSDirectory.SimpleFSIndexOutput for writing.">MMapDirectory</a>:<a class="code" href="class_lucene_1_1_net_1_1_store_1_1_f_s_directory.html" title=" Base class for Directory implementations that store index files in the file system. There are currently three core subclasses:">FSDirectory</a></div> |
| <div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  {</div> |
| <div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keyword">private</span> <span class="keyword">class </span>AnonymousClassPrivilegedExceptionAction <span class="comment">// : SupportClass.IPriviligedAction // {{Aroush-2.9}}</span></div> |
| <div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  {</div> |
| <div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <span class="keyword">public</span> AnonymousClassPrivilegedExceptionAction(byte[] buffer, <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html" title="File-based Directory implementation that uses mmap for reading, and SimpleFSDirectory.SimpleFSIndexOutput for writing.">MMapDirectory</a> enclosingInstance)</div> |
| <div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  {</div> |
| <div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  InitBlock(buffer, enclosingInstance);</div> |
| <div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  }</div> |
| <div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keyword">private</span> <span class="keywordtype">void</span> InitBlock(byte[] buffer, <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html" title="File-based Directory implementation that uses mmap for reading, and SimpleFSDirectory.SimpleFSIndexOutput for writing.">MMapDirectory</a> enclosingInstance)</div> |
| <div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  {</div> |
| <div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  this.buffer = buffer;</div> |
| <div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  this.enclosingInstance = enclosingInstance;</div> |
| <div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  }</div> |
| <div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <span class="keyword">private</span> byte[] buffer;</div> |
| <div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="keyword">private</span> <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html" title="File-based Directory implementation that uses mmap for reading, and SimpleFSDirectory.SimpleFSIndexOutput for writing.">MMapDirectory</a> enclosingInstance;</div> |
| <div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="keyword">public</span> <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html" title="File-based Directory implementation that uses mmap for reading, and SimpleFSDirectory.SimpleFSIndexOutput for writing.">MMapDirectory</a> Enclosing_Instance</div> |
| <div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  {</div> |
| <div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keyword">get</span></div> |
| <div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  {</div> |
| <div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordflow">return</span> enclosingInstance;</div> |
| <div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  }</div> |
| <div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  </div> |
| <div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  }</div> |
| <div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keyword">public</span> <span class="keyword">virtual</span> System.Object Run()</div> |
| <div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  {</div> |
| <div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="comment">// {{Aroush-2.9</span></div> |
| <div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="comment">/*</span></div> |
| <div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <span class="comment"> System.Reflection.MethodInfo getCleanerMethod = buffer.GetType().GetMethod("cleaner", (Lucene.Net.Store.MMapDirectory.NO_PARAM_TYPES == null)?new System.Type[0]:(System.Type[]) Lucene.Net.Store.MMapDirectory.NO_PARAM_TYPES);</span></div> |
| <div class="line"><a name="l00090"></a><span class="lineno"> 90</span> <span class="comment"> getCleanerMethod.SetAccessible(true);</span></div> |
| <div class="line"><a name="l00091"></a><span class="lineno"> 91</span> <span class="comment"> System.Object cleaner = getCleanerMethod.Invoke(buffer, (System.Object[]) Lucene.Net.Store.MMapDirectory.NO_PARAMS);</span></div> |
| <div class="line"><a name="l00092"></a><span class="lineno"> 92</span> <span class="comment"> if (cleaner != null)</span></div> |
| <div class="line"><a name="l00093"></a><span class="lineno"> 93</span> <span class="comment"> {</span></div> |
| <div class="line"><a name="l00094"></a><span class="lineno"> 94</span> <span class="comment"> cleaner.GetType().GetMethod("clean", (Lucene.Net.Store.MMapDirectory.NO_PARAM_TYPES == null)?new System.Type[0]:(System.Type[]) Lucene.Net.Store.MMapDirectory.NO_PARAM_TYPES).Invoke(cleaner, (System.Object[]) Lucene.Net.Store.MMapDirectory.NO_PARAMS);</span></div> |
| <div class="line"><a name="l00095"></a><span class="lineno"> 95</span> <span class="comment"> }</span></div> |
| <div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="comment"> */</span></div> |
| <div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="comment">//System.Diagnostics.Debug.Fail("Port issue:", "sun.misc.Cleaner()"); // {{Aroush-2.9}}</span></div> |
| <div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> NotImplementedException(<span class="stringliteral">"Port issue: sun.misc.Cleaner()"</span>);</div> |
| <div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="comment">// Aroush-2.9}}</span></div> |
| <div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="comment">//return null; </span></div> |
| <div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  }</div> |
| <div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  }</div> |
| <div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keyword">private</span> <span class="keywordtype">void</span> InitBlock()</div> |
| <div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  {</div> |
| <div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  maxBBuf = <a class="code" href="_documents_writer_8cs.html#a4d21c5a1cd18c33bc4f3633bd17d823b">Constants</a>.JRE_IS_64BIT?System.Int32.MaxValue:(256 * 1024 * 1024);</div> |
| <div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  }</div> |
| <div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  </div> |
| <div class="line"><a name="l00116"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html#ace2b588ce491beeb9461d7c9afe26440"> 116</a></span>  <span class="keyword">public</span> <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html" title="File-based Directory implementation that uses mmap for reading, and SimpleFSDirectory.SimpleFSIndexOutput for writing.">MMapDirectory</a>(System.IO.DirectoryInfo path, <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_lock_factory.html" title="Base class for Locking implementation. Directory uses instances of this class to implement locking...">LockFactory</a> lockFactory)</div> |
| <div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  : base(path, lockFactory)</div> |
| <div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  {</div> |
| <div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  InitBlock();</div> |
| <div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  }</div> |
| <div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div> |
| <div class="line"><a name="l00128"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html#a5ae614a0518d4e247f2ba2bb901434c9"> 128</a></span>  <span class="keyword">public</span> <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html" title="File-based Directory implementation that uses mmap for reading, and SimpleFSDirectory.SimpleFSIndexOutput for writing.">MMapDirectory</a>(System.IO.DirectoryInfo path)</div> |
| <div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  : base(path, null)</div> |
| <div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  {</div> |
| <div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  InitBlock();</div> |
| <div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  }</div> |
| <div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  </div> |
| <div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keyword">private</span> <span class="keywordtype">bool</span> useUnmapHack = <span class="keyword">false</span>;</div> |
| <div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keyword">private</span> <span class="keywordtype">int</span> maxBBuf;</div> |
| <div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  </div> |
| <div class="line"><a name="l00138"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html#af4873ed3df417f1c01dc3e3ca05386fb"> 138</a></span>  <span class="keyword">public</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html#af4873ed3df417f1c01dc3e3ca05386fb" title="true, if this platform supports unmapping mmaped files.">UNMAP_SUPPORTED</a>;</div> |
| <div class="line"><a name="l00139"></a><span class="lineno"> 139</span> </div> |
| <div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> UseUnmap</div> |
| <div class="line"><a name="l00153"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html#a30ad4d157e6a9d157f53e027fd9daac9"> 153</a></span>  {</div> |
| <div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <span class="keyword">get</span> { <span class="keywordflow">return</span> useUnmapHack; }</div> |
| <div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keyword">set</span></div> |
| <div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  {</div> |
| <div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="keywordflow">if</span> (value && !UNMAP_SUPPORTED)</div> |
| <div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> System.ArgumentException(<span class="stringliteral">"Unmap hack not supported on this platform!"</span>);</div> |
| <div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  this.useUnmapHack = value;</div> |
| <div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  }</div> |
| <div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  }</div> |
| <div class="line"><a name="l00162"></a><span class="lineno"> 162</span> </div> |
| <div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keyword">internal</span> <span class="keywordtype">void</span> CleanMapping(System.IO.MemoryStream buffer)</div> |
| <div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  {</div> |
| <div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">if</span> (useUnmapHack)</div> |
| <div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  {</div> |
| <div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="keywordflow">try</span></div> |
| <div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  {</div> |
| <div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="comment">// {{Aroush-2.9}} Not converted: java.security.AccessController.doPrivileged()</span></div> |
| <div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="comment">//System.Diagnostics.Debug.Fail("Port issue:", "java.security.AccessController.doPrivileged()"); // {{Aroush-2.9}}</span></div> |
| <div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> NotImplementedException(<span class="stringliteral">"Port issue: java.security.AccessController.doPrivileged()"</span>);</div> |
| <div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <span class="comment">// AccessController.DoPrivileged(new AnonymousClassPrivilegedExceptionAction(buffer, this));</span></div> |
| <div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  }</div> |
| <div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordflow">catch</span> (System.Exception e)</div> |
| <div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  {</div> |
| <div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  System.IO.IOException ioe = <span class="keyword">new</span> System.IO.IOException(<span class="stringliteral">"unable to unmap the mapped buffer"</span>, e.InnerException);</div> |
| <div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <span class="keywordflow">throw</span> ioe;</div> |
| <div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  }</div> |
| <div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  }</div> |
| <div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  }</div> |
| <div class="line"><a name="l00185"></a><span class="lineno"> 185</span> </div> |
| <div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keywordtype">int</span> MaxChunkSize</div> |
| <div class="line"><a name="l00197"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html#a2d37be4664c6dd0ac070ae271b76d736"> 197</a></span>  {</div> |
| <div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keyword">get</span> { <span class="keywordflow">return</span> maxBBuf; }</div> |
| <div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keyword">set</span></div> |
| <div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  {</div> |
| <div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="keywordflow">if</span> (value <= 0)</div> |
| <div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> System.ArgumentException(<span class="stringliteral">"Maximum chunk size for mmap must be >0"</span>);</div> |
| <div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  this.maxBBuf = value;</div> |
| <div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  }</div> |
| <div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  }</div> |
| <div class="line"><a name="l00206"></a><span class="lineno"> 206</span> </div> |
| <div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keyword">private</span> <span class="keyword">class </span>MMapIndexInput : <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_index_input.html" title="Abstract base class for input from a file in a Directory. A random-access input stream. Used for all Lucene index input operations. ">IndexInput</a></div> |
| <div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  {</div> |
| <div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="keyword">private</span> <span class="keywordtype">void</span> InitBlock(<a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html" title="File-based Directory implementation that uses mmap for reading, and SimpleFSDirectory.SimpleFSIndexOutput for writing.">MMapDirectory</a> enclosingInstance)</div> |
| <div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  {</div> |
| <div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  this.enclosingInstance = enclosingInstance;</div> |
| <div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  }</div> |
| <div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keyword">private</span> MMapDirectory enclosingInstance;</div> |
| <div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keyword">public</span> MMapDirectory Enclosing_Instance</div> |
| <div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  {</div> |
| <div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="keyword">get</span></div> |
| <div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  {</div> |
| <div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keywordflow">return</span> enclosingInstance;</div> |
| <div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  }</div> |
| <div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  </div> |
| <div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  }</div> |
| <div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  </div> |
| <div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keyword">private</span> System.IO.MemoryStream buffer;</div> |
| <div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keyword">private</span> <span class="keywordtype">long</span> length;</div> |
| <div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keyword">private</span> <span class="keywordtype">bool</span> isClone;</div> |
| <div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keyword">private</span> <span class="keywordtype">bool</span> isDisposed;</div> |
| <div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  </div> |
| <div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keyword">internal</span> MMapIndexInput(MMapDirectory enclosingInstance, System.IO.FileStream raf)</div> |
| <div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  {</div> |
| <div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  byte[] data = <span class="keyword">new</span> byte[raf.Length];</div> |
| <div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  raf.Read(data, 0, (<span class="keywordtype">int</span>) raf.Length);</div> |
| <div class="line"><a name="l00232"></a><span class="lineno"> 232</span> </div> |
| <div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  InitBlock(enclosingInstance);</div> |
| <div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  this.length = raf.Length;</div> |
| <div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  this.buffer = <span class="keyword">new</span> System.IO.MemoryStream(data);</div> |
| <div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  }</div> |
| <div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  </div> |
| <div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keyword">public</span> <span class="keyword">override</span> byte ReadByte()</div> |
| <div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  {</div> |
| <div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordflow">try</span></div> |
| <div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  {</div> |
| <div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">return</span> (byte) buffer.ReadByte();</div> |
| <div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  }</div> |
| <div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="keywordflow">catch</span> (ObjectDisposedException)</div> |
| <div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  {</div> |
| <div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> System.IO.IOException(<span class="stringliteral">"read past EOF"</span>);</div> |
| <div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  }</div> |
| <div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  }</div> |
| <div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  </div> |
| <div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">void</span> ReadBytes(byte[] b, <span class="keywordtype">int</span> offset, <span class="keywordtype">int</span> len)</div> |
| <div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  {</div> |
| <div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keywordflow">try</span></div> |
| <div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  {</div> |
| <div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  buffer.Read(b, offset, len);</div> |
| <div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  }</div> |
| <div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">catch</span> (ObjectDisposedException)</div> |
| <div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  {</div> |
| <div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> System.IO.IOException(<span class="stringliteral">"read past EOF"</span>);</div> |
| <div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  }</div> |
| <div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  }</div> |
| <div class="line"><a name="l00261"></a><span class="lineno"> 261</span> </div> |
| <div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">long</span> FilePointer</div> |
| <div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  {</div> |
| <div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keyword">get</span></div> |
| <div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  {</div> |
| <div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">return</span> buffer.Position;</div> |
| <div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  }</div> |
| <div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  }</div> |
| <div class="line"><a name="l00269"></a><span class="lineno"> 269</span> </div> |
| <div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">void</span> Seek(<span class="keywordtype">long</span> pos)</div> |
| <div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  {</div> |
| <div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  buffer.Seek(pos, System.IO.SeekOrigin.Begin);</div> |
| <div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  }</div> |
| <div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  </div> |
| <div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">long</span> Length()</div> |
| <div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  {</div> |
| <div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordflow">return</span> length;</div> |
| <div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  }</div> |
| <div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  </div> |
| <div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="keyword">public</span> <span class="keyword">override</span> System.Object Clone()</div> |
| <div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  {</div> |
| <div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="keywordflow">if</span> (buffer == null)</div> |
| <div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="_documents_writer_8cs.html#a3bd6418bcbeb676f7dad24a00a2d6903">AlreadyClosedException</a>(<span class="stringliteral">"MMapIndexInput already closed"</span>);</div> |
| <div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  MMapIndexInput clone = (MMapIndexInput) base.Clone();</div> |
| <div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  clone.isClone = <span class="keyword">true</span>;</div> |
| <div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="comment">// clone.buffer = buffer.duplicate(); // {{Aroush-1.9}}</span></div> |
| <div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keywordflow">return</span> clone;</div> |
| <div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  }</div> |
| <div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  </div> |
| <div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keyword">protected</span> <span class="keyword">override</span> <span class="keywordtype">void</span> Dispose(<span class="keywordtype">bool</span> isDisposing)</div> |
| <div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  {</div> |
| <div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keywordflow">if</span> (isDisposed) <span class="keywordflow">return</span>;</div> |
| <div class="line"><a name="l00293"></a><span class="lineno"> 293</span> </div> |
| <div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keywordflow">if</span> (isDisposing)</div> |
| <div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  {</div> |
| <div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keywordflow">if</span> (isClone || buffer == null)</div> |
| <div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <span class="keywordflow">return</span>;</div> |
| <div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="comment">// unmap the buffer (if enabled) and at least unset it for GC</span></div> |
| <div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keywordflow">try</span></div> |
| <div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  {</div> |
| <div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  Enclosing_Instance.CleanMapping(buffer);</div> |
| <div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  }</div> |
| <div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">finally</span></div> |
| <div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  {</div> |
| <div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  buffer = null;</div> |
| <div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  }</div> |
| <div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  }</div> |
| <div class="line"><a name="l00308"></a><span class="lineno"> 308</span> </div> |
| <div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  isDisposed = <span class="keyword">true</span>;</div> |
| <div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  }</div> |
| <div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  }</div> |
| <div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  </div> |
| <div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="comment">// Because Java's ByteBuffer uses an int to address the</span></div> |
| <div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="comment">// values, it's necessary to access a file ></span></div> |
| <div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="comment">// Integer.MAX_VALUE in size using multiple byte buffers.</span></div> |
| <div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keyword">protected</span> <span class="keyword">internal</span> <span class="keyword">class </span>MultiMMapIndexInput:<a class="code" href="_byte_slice_reader_8cs.html#a12195e9150e4d7af469b90ac95cc47ee">IndexInput</a>, System.ICloneable</div> |
| <div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  {</div> |
| <div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keyword">private</span> <span class="keywordtype">void</span> InitBlock(MMapDirectory enclosingInstance)</div> |
| <div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  {</div> |
| <div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  this.enclosingInstance = enclosingInstance;</div> |
| <div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  }</div> |
| <div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="keyword">private</span> MMapDirectory enclosingInstance;</div> |
| <div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keyword">public</span> MMapDirectory Enclosing_Instance</div> |
| <div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  {</div> |
| <div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keyword">get</span></div> |
| <div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  {</div> |
| <div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="keywordflow">return</span> enclosingInstance;</div> |
| <div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  }</div> |
| <div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  </div> |
| <div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  }</div> |
| <div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  </div> |
| <div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keyword">private</span> System.IO.MemoryStream[] buffers;</div> |
| <div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keyword">private</span> <span class="keywordtype">int</span>[] bufSizes; <span class="comment">// keep here, ByteBuffer.size() method is optional</span></div> |
| <div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  </div> |
| <div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keyword">private</span> <span class="keywordtype">long</span> length;</div> |
| <div class="line"><a name="l00336"></a><span class="lineno"> 336</span> </div> |
| <div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keyword">private</span> <span class="keywordtype">bool</span> isDisposed;</div> |
| <div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  </div> |
| <div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keyword">private</span> <span class="keywordtype">int</span> curBufIndex;</div> |
| <div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keyword">private</span> <span class="keywordtype">int</span> maxBufSize;</div> |
| <div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  </div> |
| <div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="keyword">private</span> System.IO.MemoryStream curBuf; <span class="comment">// redundant for speed: buffers[curBufIndex]</span></div> |
| <div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keyword">private</span> <span class="keywordtype">int</span> curAvail; <span class="comment">// redundant for speed: (bufSizes[curBufIndex] - curBuf.position())</span></div> |
| <div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  </div> |
| <div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="keyword">private</span> <span class="keywordtype">bool</span> isClone = <span class="keyword">false</span>;</div> |
| <div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  </div> |
| <div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keyword">public</span> MultiMMapIndexInput(MMapDirectory enclosingInstance, System.IO.FileStream raf, <span class="keywordtype">int</span> maxBufSize)</div> |
| <div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  {</div> |
| <div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  InitBlock(enclosingInstance);</div> |
| <div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  this.length = raf.Length;</div> |
| <div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  this.maxBufSize = maxBufSize;</div> |
| <div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  </div> |
| <div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="keywordflow">if</span> (maxBufSize <= 0)</div> |
| <div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> System.ArgumentException(<span class="stringliteral">"Non positive maxBufSize: "</span> + maxBufSize);</div> |
| <div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  </div> |
| <div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="keywordflow">if</span> ((length / maxBufSize) > System.Int32.MaxValue)</div> |
| <div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  {</div> |
| <div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> System.ArgumentException(<span class="stringliteral">"RandomAccessFile too big for maximum buffer size: "</span> + raf.ToString());</div> |
| <div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  }</div> |
| <div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  </div> |
| <div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keywordtype">int</span> nrBuffers = (int) (length / maxBufSize);</div> |
| <div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="keywordflow">if</span> (((<span class="keywordtype">long</span>) nrBuffers * maxBufSize) < length)</div> |
| <div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  nrBuffers++;</div> |
| <div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  </div> |
| <div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  this.buffers = <span class="keyword">new</span> System.IO.MemoryStream[nrBuffers];</div> |
| <div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  this.bufSizes = <span class="keyword">new</span> <span class="keywordtype">int</span>[nrBuffers];</div> |
| <div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  </div> |
| <div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordtype">long</span> bufferStart = 0;</div> |
| <div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  System.IO.FileStream rafc = raf;</div> |
| <div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> bufNr = 0; bufNr < nrBuffers; bufNr++)</div> |
| <div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  {</div> |
| <div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  byte[] data = <span class="keyword">new</span> byte[rafc.Length];</div> |
| <div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  raf.Read(data, 0, (<span class="keywordtype">int</span>) rafc.Length);</div> |
| <div class="line"><a name="l00374"></a><span class="lineno"> 374</span> </div> |
| <div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="keywordtype">int</span> bufSize = (length > (bufferStart + maxBufSize))?maxBufSize:(int) (length - bufferStart);</div> |
| <div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  this.buffers[bufNr] = <span class="keyword">new</span> System.IO.MemoryStream(data);</div> |
| <div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  this.bufSizes[bufNr] = bufSize;</div> |
| <div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  bufferStart += bufSize;</div> |
| <div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  }</div> |
| <div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  Seek(0L);</div> |
| <div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  }</div> |
| <div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  </div> |
| <div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <span class="keyword">public</span> <span class="keyword">override</span> byte ReadByte()</div> |
| <div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  {</div> |
| <div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="comment">// Performance might be improved by reading ahead into an array of</span></div> |
| <div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="comment">// e.g. 128 bytes and readByte() from there.</span></div> |
| <div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="keywordflow">if</span> (curAvail == 0)</div> |
| <div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  {</div> |
| <div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  curBufIndex++;</div> |
| <div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="keywordflow">if</span> (curBufIndex >= buffers.Length)</div> |
| <div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> System.IO.IOException(<span class="stringliteral">"read past EOF"</span>);</div> |
| <div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  curBuf = buffers[curBufIndex];</div> |
| <div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  curBuf.Seek(0, System.IO.SeekOrigin.Begin);</div> |
| <div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  curAvail = bufSizes[curBufIndex];</div> |
| <div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  }</div> |
| <div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  curAvail--;</div> |
| <div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="keywordflow">return</span> (byte) curBuf.ReadByte();</div> |
| <div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  }</div> |
| <div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  </div> |
| <div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">void</span> ReadBytes(byte[] b, <span class="keywordtype">int</span> offset, <span class="keywordtype">int</span> len)</div> |
| <div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  {</div> |
| <div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <span class="keywordflow">while</span> (len > curAvail)</div> |
| <div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  {</div> |
| <div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  curBuf.Read(b, offset, curAvail);</div> |
| <div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  len -= curAvail;</div> |
| <div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  offset += curAvail;</div> |
| <div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  curBufIndex++;</div> |
| <div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="keywordflow">if</span> (curBufIndex >= buffers.Length)</div> |
| <div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> System.IO.IOException(<span class="stringliteral">"read past EOF"</span>);</div> |
| <div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  curBuf = buffers[curBufIndex];</div> |
| <div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  curBuf.Seek(0, System.IO.SeekOrigin.Begin);</div> |
| <div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  curAvail = bufSizes[curBufIndex];</div> |
| <div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  }</div> |
| <div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  curBuf.Read(b, offset, len);</div> |
| <div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  curAvail -= len;</div> |
| <div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  }</div> |
| <div class="line"><a name="l00417"></a><span class="lineno"> 417</span> </div> |
| <div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">long</span> FilePointer</div> |
| <div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  {</div> |
| <div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keyword">get</span> { <span class="keywordflow">return</span> ((<span class="keywordtype">long</span>) curBufIndex*maxBufSize) + curBuf.Position; }</div> |
| <div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  }</div> |
| <div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div> |
| <div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">void</span> Seek(<span class="keywordtype">long</span> pos)</div> |
| <div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  {</div> |
| <div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  curBufIndex = (int) (pos / maxBufSize);</div> |
| <div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  curBuf = buffers[curBufIndex];</div> |
| <div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keywordtype">int</span> bufOffset = (int) (pos - ((<span class="keywordtype">long</span>) curBufIndex * maxBufSize));</div> |
| <div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  curBuf.Seek(bufOffset, System.IO.SeekOrigin.Begin);</div> |
| <div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  curAvail = bufSizes[curBufIndex] - bufOffset;</div> |
| <div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  }</div> |
| <div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  </div> |
| <div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="keyword">public</span> <span class="keyword">override</span> <span class="keywordtype">long</span> Length()</div> |
| <div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  {</div> |
| <div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="keywordflow">return</span> length;</div> |
| <div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  }</div> |
| <div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  </div> |
| <div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="keyword">public</span> <span class="keyword">override</span> System.Object Clone()</div> |
| <div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  {</div> |
| <div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  MultiMMapIndexInput clone = (MultiMMapIndexInput) base.Clone();</div> |
| <div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  clone.isClone = <span class="keyword">true</span>;</div> |
| <div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  clone.buffers = <span class="keyword">new</span> System.IO.MemoryStream[buffers.Length];</div> |
| <div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="comment">// No need to clone bufSizes.</span></div> |
| <div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="comment">// Since most clones will use only one buffer, duplicate() could also be</span></div> |
| <div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <span class="comment">// done lazy in clones, e.g. when adapting curBuf.</span></div> |
| <div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> bufNr = 0; bufNr < buffers.Length; bufNr++)</div> |
| <div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  {</div> |
| <div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  clone.buffers[bufNr] = buffers[bufNr]; <span class="comment">// clone.buffers[bufNr] = buffers[bufNr].duplicate(); // {{Aroush-1.9}} how do we clone?!</span></div> |
| <div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  }</div> |
| <div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <span class="keywordflow">try</span></div> |
| <div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  {</div> |
| <div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  clone.Seek(FilePointer);</div> |
| <div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  }</div> |
| <div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keywordflow">catch</span> (System.IO.IOException ioe)</div> |
| <div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  {</div> |
| <div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  System.SystemException newException = <span class="keyword">new</span> System.SystemException(ioe.Message, ioe);</div> |
| <div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="keywordflow">throw</span> newException;</div> |
| <div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  }</div> |
| <div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keywordflow">return</span> clone;</div> |
| <div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  }</div> |
| <div class="line"><a name="l00460"></a><span class="lineno"> 460</span> </div> |
| <div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <span class="keyword">protected</span> <span class="keyword">override</span> <span class="keywordtype">void</span> Dispose(<span class="keywordtype">bool</span> disposing)</div> |
| <div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  {</div> |
| <div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keywordflow">if</span> (isDisposed) <span class="keywordflow">return</span>;</div> |
| <div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">if</span> (isClone || buffers == null)</div> |
| <div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordflow">return</span>;</div> |
| <div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="keywordflow">try</span></div> |
| <div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  {</div> |
| <div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> bufNr = 0; bufNr < buffers.Length; bufNr++)</div> |
| <div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  {</div> |
| <div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <span class="comment">// unmap the buffer (if enabled) and at least unset it for GC</span></div> |
| <div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordflow">try</span></div> |
| <div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  {</div> |
| <div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  Enclosing_Instance.CleanMapping(buffers[bufNr]);</div> |
| <div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  }</div> |
| <div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <span class="keywordflow">finally</span></div> |
| <div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  {</div> |
| <div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  buffers[bufNr] = null;</div> |
| <div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  }</div> |
| <div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  }</div> |
| <div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  }</div> |
| <div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="keywordflow">finally</span></div> |
| <div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  {</div> |
| <div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  buffers = null;</div> |
| <div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  }</div> |
| <div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  isDisposed = <span class="keyword">true</span>;</div> |
| <div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  }</div> |
| <div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  }</div> |
| <div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  </div> |
| <div class="line"><a name="l00490"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html#ac56071555f9bc3b4948bd2c396952378"> 490</a></span>  <span class="keyword">public</span> <span class="keyword">override</span> <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_index_input.html" title="Abstract base class for input from a file in a Directory. A random-access input stream. Used for all Lucene index input operations. ">IndexInput</a> OpenInput(System.String name, <span class="keywordtype">int</span> bufferSize)</div> |
| <div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  {</div> |
| <div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  EnsureOpen();</div> |
| <div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  System.String path = System.IO.Path.Combine(<a class="code" href="class_lucene_1_1_net_1_1_store_1_1_directory.html" title="A Directory is a flat list of files. Files may be written once, when they are created. Once a file is created it may only be opened for read, or deleted. Random access is permitted both when reading and writing.">Directory</a>.FullName, name);</div> |
| <div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  System.IO.FileStream raf = <span class="keyword">new</span> System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);</div> |
| <div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <span class="keywordflow">try</span></div> |
| <div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  {</div> |
| <div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <span class="keywordflow">return</span> (raf.Length <= (<span class="keywordtype">long</span>) maxBBuf)?(<a class="code" href="_byte_slice_reader_8cs.html#a12195e9150e4d7af469b90ac95cc47ee">IndexInput</a>) <span class="keyword">new</span> MMapIndexInput(<span class="keyword">this</span>, raf):(<a class="code" href="_byte_slice_reader_8cs.html#a12195e9150e4d7af469b90ac95cc47ee">IndexInput</a>) <span class="keyword">new</span> MultiMMapIndexInput(<span class="keyword">this</span>, raf, maxBBuf);</div> |
| <div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  }</div> |
| <div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <span class="keywordflow">finally</span></div> |
| <div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  {</div> |
| <div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  raf.Close();</div> |
| <div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  }</div> |
| <div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  }</div> |
| <div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  </div> |
| <div class="line"><a name="l00506"></a><span class="lineno"><a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html#ad420384aa67b5b39141ac46f754f21a9"> 506</a></span>  <span class="keyword">public</span> <span class="keyword">override</span> <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_index_output.html" title="Abstract base class for output to a file in a Directory. A random-access output stream. Used for all Lucene index output operations. ">IndexOutput</a> CreateOutput(System.String name)</div> |
| <div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  {</div> |
| <div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  InitOutput(name);</div> |
| <div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_simple_f_s_directory.html" title="A straightforward implementation of FSDirectory using java.io.RandomAccessFile. However, this class has poor concurrent performance (multiple threads will bottleneck) as it synchronizes when multiple threads read from the same file. It's usually better to use NIOFSDirectory or MMapDirectory instead. ">SimpleFSDirectory</a>.SimpleFSIndexOutput(<span class="keyword">new</span> System.IO.FileInfo(System.IO.Path.Combine(internalDirectory.FullName, name)));</div> |
| <div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  }</div> |
| <div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="keyword">static</span> <a class="code" href="class_lucene_1_1_net_1_1_store_1_1_m_map_directory.html" title="File-based Directory implementation that uses mmap for reading, and SimpleFSDirectory.SimpleFSIndexOutput for writing.">MMapDirectory</a>()</div> |
| <div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  {</div> |
| <div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  {</div> |
| <div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordtype">bool</span> v;</div> |
| <div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="keywordflow">try</span></div> |
| <div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  {</div> |
| <div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <span class="comment">// {{Aroush-2.9</span></div> |
| <div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="comment">/*</span></div> |
| <div class="line"><a name="l00519"></a><span class="lineno"> 519</span> <span class="comment"> System.Type.GetType("sun.misc.Cleaner"); // {{Aroush-2.9}} port issue?</span></div> |
| <div class="line"><a name="l00520"></a><span class="lineno"> 520</span> <span class="comment"> System.Type.GetType("java.nio.DirectByteBuffer").GetMethod("cleaner", (NO_PARAM_TYPES == null)?new System.Type[0]:(System.Type[]) NO_PARAM_TYPES);</span></div> |
| <div class="line"><a name="l00521"></a><span class="lineno"> 521</span> <span class="comment"> */</span></div> |
| <div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="comment">//System.Diagnostics.Debug.Fail("Port issue:", "sun.misc.Cleaner.clean()"); // {{Aroush-2.9}}</span></div> |
| <div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordflow">throw</span> <span class="keyword">new</span> NotImplementedException(<span class="stringliteral">"Port issue: sun.misc.Cleaner.clean()"</span>);</div> |
| <div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="comment">// Aroush-2.9}}</span></div> |
| <div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="comment">//v = true;</span></div> |
| <div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  }</div> |
| <div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <span class="keywordflow">catch</span> (System.Exception)</div> |
| <div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  {</div> |
| <div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  v = <span class="keyword">false</span>;</div> |
| <div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  }</div> |
| <div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  UNMAP_SUPPORTED = v;</div> |
| <div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  }</div> |
| <div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  }</div> |
| <div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  }</div> |
| <div class="line"><a name="l00535"></a><span class="lineno"> 535</span> }</div> |
| </div><!-- fragment --></div><!-- contents --> |
| <!-- start footer part --> |
| <hr class="footer"/><address class="footer"><small> |
| Generated on Thu Jan 3 2013 02:12:46 for Lucene.Net by  <a href="http://www.doxygen.org/index.html"> |
| <img class="footer" src="doxygen.png" alt="doxygen"/> |
| </a> 1.8.3 |
| </small></address> |
| </body> |
| </html> |