diff options
author | Jenkins nedprod CI <foo@nowhere> | 2018-06-08 16:03:21 +0300 |
---|---|---|
committer | Jenkins nedprod CI <foo@nowhere> | 2018-06-08 16:03:21 +0300 |
commit | 66dd2bead468c581d736feabff11372500ee8400 (patch) | |
tree | 970dfe64b0830fd5240ad4b3a940b3a25a135d46 | |
parent | 4a8ca65e7c0d19b39caf60f31733cef74b9dedd9 (diff) |
Travis CI updates documentation
-rw-r--r-- | classafio__v2__xxx_1_1algorithm_1_1shared__fs__mutex_1_1memory__map.html | 2 | ||||
-rw-r--r-- | classafio__v2__xxx_1_1io__service.html | 4 | ||||
-rw-r--r-- | config_8hpp.html | 2 | ||||
-rw-r--r-- | index.html | 5 |
4 files changed, 8 insertions, 5 deletions
diff --git a/classafio__v2__xxx_1_1algorithm_1_1shared__fs__mutex_1_1memory__map.html b/classafio__v2__xxx_1_1algorithm_1_1shared__fs__mutex_1_1memory__map.html index fdc3340b..c60f7d90 100644 --- a/classafio__v2__xxx_1_1algorithm_1_1shared__fs__mutex_1_1memory__map.html +++ b/classafio__v2__xxx_1_1algorithm_1_1shared__fs__mutex_1_1memory__map.html @@ -277,7 +277,7 @@ template<template< class > class Hasher = QUICKCPPLIB_NAMESPACE::algori </table> </div><div class="memdoc"> <p>Initialises a shared filing system mutex using the file at <em>lockfile</em>. </p><dl class="section user"><dt>Errors returnable</dt><dd>Awaiting the clang result<> AST parser which auto generates all the error codes which could occur, but a particularly important one is <code>errc::no_lock_available</code> which will be returned if the lock is in use by another computer on a network. </dd></dl> -<div class="fragment"><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  {</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  AFIO_LOG_FUNCTION_CALL(0);</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">try</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  {</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  OUTCOME_TRY(ret, <a class="code" href="classafio__v2__xxx_1_1file__handle.html#accb36f2bfd98393dc868653798c02d34">file_handle::file</a>(base, lockfile, <a class="code" href="classafio__v2__xxx_1_1handle.html#a0489b6c1e25cd2bad2ba1ec86e1aaf18aefb2a684e4afb7d55e6147fbe5a332ee">file_handle::mode::write</a>, file_handle::creation::if_needed, <a class="code" href="classafio__v2__xxx_1_1handle.html#a6f7e37c73271968271c2342023f58c9ea0fb9cf5f04f61bb6f1151da57ceb1ca1">file_handle::caching::reads</a>));</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  file_handle temph;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="comment">// Am I the first person to this file? Lock everything exclusively</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keyword">auto</span> lockinuse = ret.try_lock(_initialisingoffset, 2, <span class="keyword">true</span>);</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keywordflow">if</span>(lockinuse.has_error())</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>(lockinuse.error() != errc::timed_out)</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  {</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keywordflow">return</span> lockinuse.error();</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>  <span class="comment">// Somebody else is also using this file, so try to read the hash index file I ought to use</span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  lockinuse = ret.lock(_lockinuseoffset, 1, <span class="keyword">false</span>); <span class="comment">// inuse shared access, blocking</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordflow">if</span>(!lockinuse)</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="keywordflow">return</span> lockinuse.error();</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>  byte buffer[65536];</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  memset(buffer, 0, <span class="keyword">sizeof</span>(buffer));</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  OUTCOME_TRYV(ret.read(0, {{buffer, 65535}}));</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  path_view temphpath(reinterpret_cast<filesystem::path::value_type *>(buffer));</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  result<file_handle> _temph(in_place_type<file_handle>);</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  _temph = <a class="code" href="classafio__v2__xxx_1_1file__handle.html#accb36f2bfd98393dc868653798c02d34">file_handle::file</a>({}, temphpath, <a class="code" href="classafio__v2__xxx_1_1handle.html#a0489b6c1e25cd2bad2ba1ec86e1aaf18aefb2a684e4afb7d55e6147fbe5a332ee">file_handle::mode::write</a>, file_handle::creation::open_existing, <a class="code" href="classafio__v2__xxx_1_1handle.html#a6f7e37c73271968271c2342023f58c9ead5197d93c063a2b1e22d1630a39b7aef">file_handle::caching::temporary</a>);</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="comment">// If temp file doesn't exist, I am on a different machine</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keywordflow">if</span>(!_temph)</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>  <span class="comment">// Release the exclusive lock and tell caller that this lock is not available</span></div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keywordflow">return</span> errc::no_lock_available;</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>  temph = std::move(_temph.value());</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="comment">// Map the hash index file into memory for read/write access</span></div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  OUTCOME_TRY(temphsection, <a class="code" href="classafio__v2__xxx_1_1section__handle.html#a7e69ae5094da2517f2ed0bd046d18302">section_handle::section</a>(temph, HashIndexSize));</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  OUTCOME_TRY(temphmap, <a class="code" href="classafio__v2__xxx_1_1map__handle.html#a9c43d182b257682d320f12f6e6be30b3">map_handle::map</a>(temphsection, HashIndexSize));</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="comment">// Map the path file into memory with its maximum possible size, read only</span></div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  OUTCOME_TRY(hsection, <a class="code" href="classafio__v2__xxx_1_1section__handle.html#a7e69ae5094da2517f2ed0bd046d18302">section_handle::section</a>(ret, 65536, <a class="code" href="namespaceafio__v2__xxx.html#a3cff8f3910dbf47663e5df1dc7e5ba47">section_handle::flag::read</a>));</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  OUTCOME_TRY(hmap, <a class="code" href="classafio__v2__xxx_1_1map__handle.html#a9c43d182b257682d320f12f6e6be30b3">map_handle::map</a>(hsection, 0, 0, <a class="code" href="namespaceafio__v2__xxx.html#a3cff8f3910dbf47663e5df1dc7e5ba47">section_handle::flag::read</a>));</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keywordflow">return</span> memory_map(std::move(ret), std::move(temph), std::move(lockinuse.value()), std::move(hmap), std::move(temphmap));</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  }</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>  <span class="comment">// I am the first person to be using this (stale?) file, so create a new hash index file in /tmp</span></div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keyword">auto</span> &tempdirh = <a class="code" href="namespaceafio__v2__xxx_1_1path__discovery.html#ae34df4ad4e4f2c977ef99575713fd9bf">path_discovery::memory_backed_temporary_files_directory</a>().<a class="code" href="classafio__v2__xxx_1_1handle.html#a4194a05dd9694d2c47d5a45f925db1d7">is_valid</a>() ? <a class="code" href="namespaceafio__v2__xxx_1_1path__discovery.html#ae34df4ad4e4f2c977ef99575713fd9bf">path_discovery::memory_backed_temporary_files_directory</a>() : path_discovery::<a class="code" href="namespaceafio__v2__xxx_1_1path__discovery.html#af398b6c3762f60aa96cebd270879093e">storage_backed_temporary_files_directory</a>();</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  OUTCOME_TRY(_temph, <a class="code" href="classafio__v2__xxx_1_1file__handle.html#a7fdd164a8af6542c5fb80c514283c585">file_handle::random_file</a>(tempdirh));</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  temph = std::move(_temph);</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="comment">// Truncate it out to the hash index size, and map it into memory for read/write access</span></div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  OUTCOME_TRYV(temph.truncate(HashIndexSize));</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  OUTCOME_TRY(temphsection, <a class="code" href="classafio__v2__xxx_1_1section__handle.html#a7e69ae5094da2517f2ed0bd046d18302">section_handle::section</a>(temph, HashIndexSize));</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  OUTCOME_TRY(temphmap, <a class="code" href="classafio__v2__xxx_1_1map__handle.html#a9c43d182b257682d320f12f6e6be30b3">map_handle::map</a>(temphsection, HashIndexSize));</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="comment">// Write the path of my new hash index file, padding zeros to the nearest page size</span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="comment">// multiple to work around a race condition in the Linux kernel</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  OUTCOME_TRY(temppath, temph.current_path());</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="keywordtype">char</span> buffer[4096];</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  memset(buffer, 0, <span class="keyword">sizeof</span>(buffer));</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordtype">size_t</span> bytes = temppath.native().size() * <span class="keyword">sizeof</span>(*temppath.c_str());</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  file_handle::const_buffer_type buffers[] = {{<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>byte *<span class="keyword">></span>(temppath.c_str()), bytes}, {<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>byte *<span class="keyword">></span>(buffer), 4096 - (bytes % 4096)}};</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  OUTCOME_TRYV(ret.truncate(65536));</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  OUTCOME_TRYV(ret.write({buffers, 0}));</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="comment">// Map for read the maximum possible path file size, again to avoid race problems</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  OUTCOME_TRY(hsection, <a class="code" href="classafio__v2__xxx_1_1section__handle.html#a7e69ae5094da2517f2ed0bd046d18302">section_handle::section</a>(ret, 65536, <a class="code" href="namespaceafio__v2__xxx.html#a3cff8f3910dbf47663e5df1dc7e5ba47">section_handle::flag::read</a>));</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  OUTCOME_TRY(hmap, <a class="code" href="classafio__v2__xxx_1_1map__handle.html#a9c43d182b257682d320f12f6e6be30b3">map_handle::map</a>(hsection, 0, 0, <a class="code" href="namespaceafio__v2__xxx.html#a3cff8f3910dbf47663e5df1dc7e5ba47">section_handle::flag::read</a>));</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="comment">/* Take shared locks on inuse. Even if this implementation doesn't implement</span></div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> <span class="comment"> atomic downgrade of exclusive range to shared range, we're fully prepared for other users</span></div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> <span class="comment"> now. The _initialisingoffset remains exclusive to prevent double entry into this init routine.</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span> <span class="comment"> */</span></div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  OUTCOME_TRY(lockinuse2, ret.lock(_lockinuseoffset, 1, <span class="keyword">false</span>));</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  lockinuse = std::move(lockinuse2); <span class="comment">// releases exclusive lock on all three offsets</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keywordflow">return</span> memory_map(std::move(ret), std::move(temph), std::move(lockinuse.value()), std::move(hmap), std::move(temphmap));</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>  <span class="keywordflow">catch</span>(...)</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  {</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">return</span> error_from_exception();</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  }</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  }</div><div class="ttc" id="classafio__v2__xxx_1_1handle_html_a6f7e37c73271968271c2342023f58c9ea0fb9cf5f04f61bb6f1151da57ceb1ca1"><div class="ttname"><a href="classafio__v2__xxx_1_1handle.html#a6f7e37c73271968271c2342023f58c9ea0fb9cf5f04f61bb6f1151da57ceb1ca1">afio_v2_xxx::handle::caching::reads</a></div><div class="ttdoc">Cache reads only. Writes of data and metadata do not complete until reaching storage (O_SYNC)...</div></div> +<div class="fragment"><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>  AFIO_LOG_FUNCTION_CALL(0);</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="keywordflow">try</span></div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  {</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  OUTCOME_TRY(ret, <a class="code" href="classafio__v2__xxx_1_1file__handle.html#accb36f2bfd98393dc868653798c02d34">file_handle::file</a>(base, lockfile, <a class="code" href="classafio__v2__xxx_1_1handle.html#a0489b6c1e25cd2bad2ba1ec86e1aaf18aefb2a684e4afb7d55e6147fbe5a332ee">file_handle::mode::write</a>, file_handle::creation::if_needed, <a class="code" href="classafio__v2__xxx_1_1handle.html#a6f7e37c73271968271c2342023f58c9ea0fb9cf5f04f61bb6f1151da57ceb1ca1">file_handle::caching::reads</a>));</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  file_handle temph;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="comment">// Am I the first person to this file? Lock everything exclusively</span></div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <span class="keyword">auto</span> lockinuse = ret.try_lock(_initialisingoffset, 2, <span class="keyword">true</span>);</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="keywordflow">if</span>(lockinuse.has_error())</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">if</span>(lockinuse.error() != errc::timed_out)</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>  <span class="keywordflow">return</span> lockinuse.error();</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>  <span class="comment">// Somebody else is also using this file, so try to read the hash index file I ought to use</span></div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  lockinuse = ret.lock(_lockinuseoffset, 1, <span class="keyword">false</span>); <span class="comment">// inuse shared access, blocking</span></div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordflow">if</span>(!lockinuse)</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordflow">return</span> lockinuse.error();</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>  byte buffer[65536];</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  memset(buffer, 0, <span class="keyword">sizeof</span>(buffer));</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  OUTCOME_TRYV(ret.read(0, {{buffer, 65535}}));</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  path_view temphpath(reinterpret_cast<filesystem::path::value_type *>(buffer));</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  result<file_handle> _temph(in_place_type<file_handle>);</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  _temph = <a class="code" href="classafio__v2__xxx_1_1file__handle.html#accb36f2bfd98393dc868653798c02d34">file_handle::file</a>({}, temphpath, <a class="code" href="classafio__v2__xxx_1_1handle.html#a0489b6c1e25cd2bad2ba1ec86e1aaf18aefb2a684e4afb7d55e6147fbe5a332ee">file_handle::mode::write</a>, file_handle::creation::open_existing, <a class="code" href="classafio__v2__xxx_1_1handle.html#a6f7e37c73271968271c2342023f58c9ead5197d93c063a2b1e22d1630a39b7aef">file_handle::caching::temporary</a>);</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="comment">// If temp file doesn't exist, I am on a different machine</span></div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">if</span>(!_temph)</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>  <span class="comment">// Release the exclusive lock and tell caller that this lock is not available</span></div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">return</span> errc::no_lock_available;</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>  temph = std::move(_temph.value());</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="comment">// Map the hash index file into memory for read/write access</span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  OUTCOME_TRY(temphsection, <a class="code" href="classafio__v2__xxx_1_1section__handle.html#a7e69ae5094da2517f2ed0bd046d18302">section_handle::section</a>(temph, HashIndexSize));</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  OUTCOME_TRY(temphmap, <a class="code" href="classafio__v2__xxx_1_1map__handle.html#a9c43d182b257682d320f12f6e6be30b3">map_handle::map</a>(temphsection, HashIndexSize));</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="comment">// Map the path file into memory with its maximum possible size, read only</span></div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  OUTCOME_TRY(hsection, <a class="code" href="classafio__v2__xxx_1_1section__handle.html#a7e69ae5094da2517f2ed0bd046d18302">section_handle::section</a>(ret, 65536, <a class="code" href="namespaceafio__v2__xxx.html#a3cff8f3910dbf47663e5df1dc7e5ba47">section_handle::flag::read</a>));</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  OUTCOME_TRY(hmap, <a class="code" href="classafio__v2__xxx_1_1map__handle.html#a9c43d182b257682d320f12f6e6be30b3">map_handle::map</a>(hsection, 0, 0, <a class="code" href="namespaceafio__v2__xxx.html#a3cff8f3910dbf47663e5df1dc7e5ba47">section_handle::flag::read</a>));</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keywordflow">return</span> memory_map(std::move(ret), std::move(temph), std::move(lockinuse.value()), std::move(hmap), std::move(temphmap));</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="comment">// I am the first person to be using this (stale?) file, so create a new hash index file in /tmp</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keyword">auto</span> &tempdirh = <a class="code" href="namespaceafio__v2__xxx_1_1path__discovery.html#ae34df4ad4e4f2c977ef99575713fd9bf">path_discovery::memory_backed_temporary_files_directory</a>().<a class="code" href="classafio__v2__xxx_1_1handle.html#a4194a05dd9694d2c47d5a45f925db1d7">is_valid</a>() ? <a class="code" href="namespaceafio__v2__xxx_1_1path__discovery.html#ae34df4ad4e4f2c977ef99575713fd9bf">path_discovery::memory_backed_temporary_files_directory</a>() : path_discovery::<a class="code" href="namespaceafio__v2__xxx_1_1path__discovery.html#af398b6c3762f60aa96cebd270879093e">storage_backed_temporary_files_directory</a>();</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  OUTCOME_TRY(_temph, <a class="code" href="classafio__v2__xxx_1_1file__handle.html#a7fdd164a8af6542c5fb80c514283c585">file_handle::random_file</a>(tempdirh));</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  temph = std::move(_temph);</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="comment">// Truncate it out to the hash index size, and map it into memory for read/write access</span></div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  OUTCOME_TRYV(temph.truncate(HashIndexSize));</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  OUTCOME_TRY(temphsection, <a class="code" href="classafio__v2__xxx_1_1section__handle.html#a7e69ae5094da2517f2ed0bd046d18302">section_handle::section</a>(temph, HashIndexSize));</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  OUTCOME_TRY(temphmap, <a class="code" href="classafio__v2__xxx_1_1map__handle.html#a9c43d182b257682d320f12f6e6be30b3">map_handle::map</a>(temphsection, HashIndexSize));</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="comment">// Write the path of my new hash index file, padding zeros to the nearest page size</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="comment">// multiple to work around a race condition in the Linux kernel</span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  OUTCOME_TRY(temppath, temph.current_path());</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordtype">char</span> buffer[4096];</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  memset(buffer, 0, <span class="keyword">sizeof</span>(buffer));</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordtype">size_t</span> bytes = temppath.native().size() * <span class="keyword">sizeof</span>(*temppath.c_str());</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  file_handle::const_buffer_type buffers[] = {{<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>byte *<span class="keyword">></span>(temppath.c_str()), bytes}, {<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>byte *<span class="keyword">></span>(buffer), 4096 - (bytes % 4096)}};</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  OUTCOME_TRYV(ret.truncate(65536));</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  OUTCOME_TRYV(ret.write({buffers, 0}));</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="comment">// Map for read the maximum possible path file size, again to avoid race problems</span></div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  OUTCOME_TRY(hsection, <a class="code" href="classafio__v2__xxx_1_1section__handle.html#a7e69ae5094da2517f2ed0bd046d18302">section_handle::section</a>(ret, 65536, <a class="code" href="namespaceafio__v2__xxx.html#a3cff8f3910dbf47663e5df1dc7e5ba47">section_handle::flag::read</a>));</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  OUTCOME_TRY(hmap, <a class="code" href="classafio__v2__xxx_1_1map__handle.html#a9c43d182b257682d320f12f6e6be30b3">map_handle::map</a>(hsection, 0, 0, <a class="code" href="namespaceafio__v2__xxx.html#a3cff8f3910dbf47663e5df1dc7e5ba47">section_handle::flag::read</a>));</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="comment">/* Take shared locks on inuse. Even if this implementation doesn't implement</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span> <span class="comment"> atomic downgrade of exclusive range to shared range, we're fully prepared for other users</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span> <span class="comment"> now. The _initialisingoffset remains exclusive to prevent double entry into this init routine.</span></div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span> <span class="comment"> */</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  OUTCOME_TRY(lockinuse2, ret.lock(_lockinuseoffset, 1, <span class="keyword">false</span>));</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  lockinuse = std::move(lockinuse2); <span class="comment">// releases exclusive lock on all three offsets</span></div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keywordflow">return</span> memory_map(std::move(ret), std::move(temph), std::move(lockinuse.value()), std::move(hmap), std::move(temphmap));</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  }</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">catch</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="keywordflow">return</span> error_from_exception();</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>  }</div><div class="ttc" id="classafio__v2__xxx_1_1handle_html_a6f7e37c73271968271c2342023f58c9ea0fb9cf5f04f61bb6f1151da57ceb1ca1"><div class="ttname"><a href="classafio__v2__xxx_1_1handle.html#a6f7e37c73271968271c2342023f58c9ea0fb9cf5f04f61bb6f1151da57ceb1ca1">afio_v2_xxx::handle::caching::reads</a></div><div class="ttdoc">Cache reads only. Writes of data and metadata do not complete until reaching storage (O_SYNC)...</div></div> <div class="ttc" id="namespaceafio__v2__xxx_html_a3cff8f3910dbf47663e5df1dc7e5ba47"><div class="ttname"><a href="namespaceafio__v2__xxx.html#a3cff8f3910dbf47663e5df1dc7e5ba47">afio_v2_xxx::read</a></div><div class="ttdeci">io_handle::io_result< io_handle::buffers_type > read(io_handle &self, io_handle::io_request< io_handle::buffers_type > reqs, deadline d=deadline()) noexcept</div><div class="ttdoc">Read data from the open handle. </div><div class="ttdef"><b>Definition:</b> io_handle.hpp:483</div></div> <div class="ttc" id="namespaceafio__v2__xxx_1_1path__discovery_html_af398b6c3762f60aa96cebd270879093e"><div class="ttname"><a href="namespaceafio__v2__xxx_1_1path__discovery.html#af398b6c3762f60aa96cebd270879093e">afio_v2_xxx::path_discovery::storage_backed_temporary_files_directory</a></div><div class="ttdeci">const path_handle & storage_backed_temporary_files_directory() noexcept</div><div class="ttdoc">Returns a reference to an open handle to a verified temporary directory where files created are store...</div></div> <div class="ttc" id="namespaceafio__v2__xxx_1_1path__discovery_html_ae34df4ad4e4f2c977ef99575713fd9bf"><div class="ttname"><a href="namespaceafio__v2__xxx_1_1path__discovery.html#ae34df4ad4e4f2c977ef99575713fd9bf">afio_v2_xxx::path_discovery::memory_backed_temporary_files_directory</a></div><div class="ttdeci">const path_handle & memory_backed_temporary_files_directory() noexcept</div><div class="ttdoc">Returns a reference to an open handle to a verified temporary directory where files created are store...</div></div> diff --git a/classafio__v2__xxx_1_1io__service.html b/classafio__v2__xxx_1_1io__service.html index dba852d5..9b6adbaa 100644 --- a/classafio__v2__xxx_1_1io__service.html +++ b/classafio__v2__xxx_1_1io__service.html @@ -282,7 +282,7 @@ template<class U > </div> </table> </div><div class="memdoc"> <p>Schedule the callable to be invoked by the thread owning this object and executing <code>run()</code> at its next available opportunity. Unlike any other function in this API layer, this function is thread safe. </p> -<div class="fragment"><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> { _post(detail::make_function_ptr<<span class="keywordtype">void</span>(<a class="code" href="classafio__v2__xxx_1_1io__service.html#a444d27f19c042b91f1751621135f65e9">io_service</a> *)>(std::forward<U>(f))); }</div><div class="ttc" id="classafio__v2__xxx_1_1io__service_html_a444d27f19c042b91f1751621135f65e9"><div class="ttname"><a href="classafio__v2__xxx_1_1io__service.html#a444d27f19c042b91f1751621135f65e9">afio_v2_xxx::io_service::io_service</a></div><div class="ttdeci">io_service()</div></div> +<div class="fragment"><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> { _post(detail::make_function_ptr<<span class="keywordtype">void</span>(<a class="code" href="classafio__v2__xxx_1_1io__service.html#a444d27f19c042b91f1751621135f65e9">io_service</a> *)>(std::forward<U>(f))); }</div><div class="ttc" id="classafio__v2__xxx_1_1io__service_html_a444d27f19c042b91f1751621135f65e9"><div class="ttname"><a href="classafio__v2__xxx_1_1io__service.html#a444d27f19c042b91f1751621135f65e9">afio_v2_xxx::io_service::io_service</a></div><div class="ttdeci">io_service()</div></div> </div><!-- fragment --> </div> </div> @@ -309,7 +309,7 @@ template<class U > </div> </table> </div><div class="memdoc"> <p>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. </p> -<div class="fragment"><div class="line"><a name="l00277"></a><span class="lineno"> 277</span> { <span class="keywordflow">return</span> <a class="code" href="classafio__v2__xxx_1_1io__service.html#a72e68348a3f92ee2a91599960132f404">run_until</a>(deadline()); }</div><div class="ttc" id="classafio__v2__xxx_1_1io__service_html_a72e68348a3f92ee2a91599960132f404"><div class="ttname"><a href="classafio__v2__xxx_1_1io__service.html#a72e68348a3f92ee2a91599960132f404">afio_v2_xxx::io_service::run_until</a></div><div class="ttdeci">virtual result< bool > run_until(deadline d) noexcept</div></div> +<div class="fragment"><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> { <span class="keywordflow">return</span> <a class="code" href="classafio__v2__xxx_1_1io__service.html#a72e68348a3f92ee2a91599960132f404">run_until</a>(deadline()); }</div><div class="ttc" id="classafio__v2__xxx_1_1io__service_html_a72e68348a3f92ee2a91599960132f404"><div class="ttname"><a href="classafio__v2__xxx_1_1io__service.html#a72e68348a3f92ee2a91599960132f404">afio_v2_xxx::io_service::run_until</a></div><div class="ttdeci">virtual result< bool > run_until(deadline d) noexcept</div></div> </div><!-- fragment --> </div> </div> diff --git a/config_8hpp.html b/config_8hpp.html index 4d148355..f7a2dd54 100644 --- a/config_8hpp.html +++ b/config_8hpp.html @@ -365,7 +365,7 @@ template<class R , class U , class... Args> </td></tr> </tr> </table> </div><div class="memdoc"> -<b>Value:</b><div class="fragment"><div class="line">{ <a class="code" href="namespaceafio__v2__xxx.html#a08363b8572e6a8971a6d236d54fb8287">\</a></div><div class="line"><a class="code" href="namespaceafio__v2__xxx.html#a08363b8572e6a8971a6d236d54fb8287"> AFIO_V2_NAMESPACE::log</a>().emplace_back(QUICKCPPLIB_NAMESPACE::ringbuffer_log::level::fatal, (message), AFIO_V2_NAMESPACE::detail::unsigned_integer_cast<unsigned>(inst), QUICKCPPLIB_NAMESPACE::utils::thread::this_thread_id(), (<a class="code" href="group__config.html#ga98c874cd585103f72c3c8338b491436b">AFIO_LOG_BACKTRACE_LEVELS</a> & (1U << 1U)) ? <span class="keyword">nullptr</span> : __func__, __LINE__); \</div><div class="line"> AFIO_LOG_FATAL_TO_CERR(message); \</div><div class="line"> }</div><div class="ttc" id="namespaceafio__v2__xxx_html_a08363b8572e6a8971a6d236d54fb8287"><div class="ttname"><a href="namespaceafio__v2__xxx.html#a08363b8572e6a8971a6d236d54fb8287">afio_v2_xxx::log</a></div><div class="ttdeci">QUICKCPPLIB_NAMESPACE::ringbuffer_log::simple_ringbuffer_log< AFIO_LOGGING_MEMORY > & log() noexcept</div><div class="ttdoc">The log used by AFIO. </div><div class="ttdef"><b>Definition:</b> config.hpp:747</div></div> +<b>Value:</b><div class="fragment"><div class="line">{ <a class="code" href="namespaceafio__v2__xxx.html#a08363b8572e6a8971a6d236d54fb8287">\</a></div><div class="line"><a class="code" href="namespaceafio__v2__xxx.html#a08363b8572e6a8971a6d236d54fb8287"> AFIO_V2_NAMESPACE::log</a>().emplace_back(QUICKCPPLIB_NAMESPACE::ringbuffer_log::level::fatal, (message), AFIO_V2_NAMESPACE::detail::unsigned_integer_cast<unsigned>(inst), QUICKCPPLIB_NAMESPACE::utils::thread::this_thread_id(), (<a class="code" href="group__config.html#ga98c874cd585103f72c3c8338b491436b">AFIO_LOG_BACKTRACE_LEVELS</a> & (1U << 1U)) ? <span class="keyword">nullptr</span> : __func__, __LINE__); \</div><div class="line"> AFIO_LOG_FATAL_TO_CERR(message); \</div><div class="line"> }</div><div class="ttc" id="namespaceafio__v2__xxx_html_a08363b8572e6a8971a6d236d54fb8287"><div class="ttname"><a href="namespaceafio__v2__xxx.html#a08363b8572e6a8971a6d236d54fb8287">afio_v2_xxx::log</a></div><div class="ttdeci">QUICKCPPLIB_NAMESPACE::ringbuffer_log::simple_ringbuffer_log< AFIO_LOGGING_MEMORY > & log() noexcept</div><div class="ttdoc">The log used by AFIO. </div><div class="ttdef"><b>Definition:</b> config.hpp:752</div></div> <div class="ttc" id="group__config_html_ga98c874cd585103f72c3c8338b491436b"><div class="ttname"><a href="group__config.html#ga98c874cd585103f72c3c8338b491436b">AFIO_LOG_BACKTRACE_LEVELS</a></div><div class="ttdeci">#define AFIO_LOG_BACKTRACE_LEVELS</div><div class="ttdoc">Bit mask of which log levels should be stack backtraced which will slow those logs thirty fold or so...</div><div class="ttdef"><b>Definition:</b> config.hpp:70</div></div> </div><!-- fragment --> </div> @@ -107,7 +107,10 @@ $(document).ready(function(){initNavTree('index.html','');}); <li>Will make use of any Concepts TS if you have them.</li> <li><code>async_file_handle</code> supports <code>co_await</code> (Coroutines TS).</li> <li>Provides view adapters into the Ranges TS, so ready for STL2.</li> -<li>Original error code is always preserved, even down to the original NT kernel error code if a NT kernel API was used.</li> +<li>Original error code is always preserved, even down to the original NT kernel error code if a NT kernel API was used.<ul> +<li>Optional configuration based on <a href="https://wg21.link/P1028">P1028</a> <em>SG14 status_code and standard error object for P0709 Zero-overhead deterministic exceptions</em>.</li> +</ul> +</li> <li>Race free filesystem design used throughout (i.e. no TOCTOU).</li> <li>Zero malloc, zero exception throw and zero whole system memory copy design used throughout, even down to paths (which can hit 64Kb!).</li> <li>Works very well with the C++ standard library, and is intended to be proposed for standardisation into C++ in Summer 2018.</li> |