This file is indexed.

/usr/share/doc/simgrid/html/uhood.html is in simgrid-doc 3.14.159-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
<!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"/>
<title>SimGrid: Under the Hood</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="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { init_search(); });
</script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
</script><script type="text/javascript" src="/usr/share/javascript/mathjax/MathJax.js/MathJax.js"></script>
<link href="stylesheet.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">SimGrid
   &#160;<span id="projectnumber">3.14.159</span>
   </div>
   <div id="projectbrief">Versatile Simulation of Distributed Systems</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="http://simgrid.gforge.inria.fr/"><span>Home page</span></a></li>
      <li><a href="http://simgrid.gforge.inria.fr/documentation.html"><span>Online documentation</span></a></li>
      <li><a href="javadoc"><span>Java documentation</span></a></li>
      <li><a href="https://gforge.inria.fr/projects/simgrid"><span>Dev's Corner</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> 
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('uhood.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

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

<div class="header">
  <div class="headertitle">
<div class="title">Under the Hood </div>  </div>
</div><!--header-->
<div class="contents">
<div class="toc"><h3>Table of Contents</h3>
<ul><li class="level1"><a href="#simgrid_uhood_s4u">S4U</a></li>
<li class="level1"><a href="#simgrid_uhood_async">Asynchronous operations</a><ul><li class="level2"><a href="#simgrid_uhood_futures">Futures</a></li>
<li class="level2"><a href="#simgrid_uhood_timer">Timers</a></li>
</ul>
</li>
<li class="level1"><a href="#simgrid_uhood_mc">Model Checker</a><ul><li class="level2"><a href="#simgrid_uhood_mc_address_space">Address space</a></li>
<li class="level2"><a href="#simgrid_uhood_mc_address_elf_dwarf">ELF and DWARF</a></li>
</ul>
</li>
</ul>
</div>
<div class="textblock"><p>TBD</p>
<ul>
<li>Simulation Loop, LMM, sharing -&gt; papers</li>
<li>Context Switching, privatization -&gt; papers</li>
</ul>
<h1><a class="anchor" id="simgrid_uhood_s4u"></a>
S4U</h1>
<p>S4U classes are designed to be user process interfaces to Maestro resources. We provide an uniform interface to them:</p>
<ul>
<li>automatic reference count with intrusive smart pointers <code>simgrid::s4u::FooPtr</code> (also called <code>simgrid::s4u::Foo::Ptr</code>);</li>
<li>manual reference count with <code>intrusive_ptr_add_ref(p)</code>, <code>intrusive_ptr_release(p)</code> (which is the interface used by <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/intrusive_ptr.html"><code>boost::intrusive_ptr</code></a>);</li>
<li>delegation of the operations to a opaque <code>pimpl</code> (which is the Maestro object);</li>
<li>the Maestro object and the corresponding S4U object have the same lifetime (and share the same reference count).</li>
</ul>
<p>The ability to manipulate thge objects thought pointers and have the ability to use explicit reference count management is useful for creating C wrappers to the S4U and should play nicely with other language bindings (such as SWIG-based ones).</p>
<p>Some objects currently live for the whole duration of the simulation and do not have refertence counts. We still provide dummy <code>intrusive_ptr_add_ref(p)</code>, <code>intrusive_ptr_release(p)</code> and <code>FooPtr</code> for consistency.</p>
<p>In many cases, we try to have a API which is consistent with the API or corresponding C++ standard classes. For example, the methods of <code><a class="el" href="classsimgrid_1_1s4u_1_1Mutex.html" title="A classical mutex, but blocking in the simulation world. ">simgrid::s4u::Mutex</a></code> are based on <a href="http://en.cppreference.com/w/cpp/thread/mutex"><code>std::mutex</code></a>. This has several benefits:</p>
<ul>
<li>we use a proven interface with a well defined and documented semantic;</li>
<li>the interface is easy to understand and remember for people used to the C++ standard interface;</li>
<li>we can use some standard C++ algorithms and helper classes with our types (<code><a class="el" href="classsimgrid_1_1s4u_1_1Mutex.html" title="A classical mutex, but blocking in the simulation world. ">simgrid::s4u::Mutex</a></code> can be used with <a href="http://en.cppreference.com/w/cpp/thread/lock"><code>std::lock</code></a>, <a href="http://en.cppreference.com/w/cpp/thread/unique_lock"><code>std::unique_lock</code></a>, etc.).</li>
</ul>
<p>Example of <code><a class="el" href="classsimgrid_1_1s4u_1_1Actor.html" title="An actor is an independent stream of execution in your distributed application. ">simgrid::s4u::Actor</a></code>:</p>
<div class="fragment"><div class="line"><span class="keyword">class </span>Actor {</div><div class="line">  <span class="comment">// This is the corresponding maestro object:</span></div><div class="line">  <span class="keyword">friend</span> simgrid::simix::Process;</div><div class="line">  simgrid::simix::Process* pimpl_ = <span class="keyword">nullptr</span>;</div><div class="line"><span class="keyword">public</span>:</div><div class="line"></div><div class="line">  Actor(simgrid::simix::Process* pimpl) : pimpl_(pimpl) {}</div><div class="line">  Actor(Actor <span class="keyword">const</span>&amp;) = <span class="keyword">delete</span>;</div><div class="line">  Actor&amp; operator=(Actor <span class="keyword">const</span>&amp;) = <span class="keyword">delete</span>;</div><div class="line"></div><div class="line">  <span class="comment">// Reference count is delegated to the S4u object:</span></div><div class="line">  <span class="keyword">friend</span> <span class="keywordtype">void</span> <a class="code" href="namespacesimgrid_1_1s4u.html#a48c0e95542045362966c90579bcfed60">intrusive_ptr_add_ref</a>(Actor* actor)</div><div class="line">  {</div><div class="line">    <a class="code" href="group__XBT__error.html#gadd837b8bf67480aea409a8580072f0be">xbt_assert</a>(actor != <span class="keyword">nullptr</span>);</div><div class="line">    <a class="code" href="simix_8h.html#a05664a6480fe4cb1b6f34d581883deda">SIMIX_process_ref</a>(actor-&gt;pimpl_);</div><div class="line">  }</div><div class="line">  <span class="keyword">friend</span> <span class="keywordtype">void</span> <a class="code" href="namespacesimgrid_1_1s4u.html#a19a9d5168427b03b762ad5cf60f1f1c5">intrusive_ptr_release</a>(Actor* actor)</div><div class="line">  {</div><div class="line">    <a class="code" href="group__XBT__error.html#gadd837b8bf67480aea409a8580072f0be">xbt_assert</a>(actor != <span class="keyword">nullptr</span>);</div><div class="line">    <a class="code" href="simix_8h.html#a97fcd3143690eec3b596d28296819a56">SIMIX_process_unref</a>(actor-&gt;pimpl_);</div><div class="line">  }</div><div class="line">  <span class="keyword">using</span> Ptr = boost::intrusive_ptr&lt;Actor&gt;;</div><div class="line"></div><div class="line">  <span class="comment">// Create processes:</span></div><div class="line">  <span class="keyword">static</span> Ptr createActor(<span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="smpi__mpi_8cpp.html#aded70a51d983aedc9dc071e2b2fff252">name</a>, s4u::Host *host, <span class="keywordtype">double</span> killTime, <a class="code" href="smpi__mpi_8cpp.html#a7c3edcb6f1af396c3c82a238febaf8bd">std::function</a>&lt;<span class="keywordtype">void</span>()&gt; code);</div><div class="line"></div><div class="line">  <span class="comment">// [...]</span></div><div class="line">};</div><div class="line"></div><div class="line"><span class="keyword">using</span> <a class="code" href="namespacesimgrid_1_1s4u.html#a8facb5bdf92991f647d980cc3d09689e">ActorPtr</a> = Actor::Ptr;</div></div><!-- fragment --><p>It uses the <code>simgrid::simix::Process</code> as a opaque pimple:</p>
<div class="fragment"><div class="line"><span class="keyword">class </span>Process {</div><div class="line"><span class="keyword">private</span>:</div><div class="line">  std::atomic_int_fast32_t refcount_ { 1 };</div><div class="line">  <span class="comment">// The lifetime of the s4u::Actor is bound to the lifetime of the Process:</span></div><div class="line">  <a class="code" href="classsimgrid_1_1s4u_1_1Actor.html">simgrid::s4u::Actor</a> actor_;</div><div class="line"><span class="keyword">public</span>:</div><div class="line">  Process() : actor_(this) {}</div><div class="line"></div><div class="line">  <span class="comment">// Reference count:</span></div><div class="line">  <span class="keyword">friend</span> <span class="keywordtype">void</span> <a class="code" href="namespacesimgrid_1_1s4u.html#a48c0e95542045362966c90579bcfed60">intrusive_ptr_add_ref</a>(Process* process)</div><div class="line">  {</div><div class="line">    <span class="comment">// Atomic operation! Do not split in two instructions!</span></div><div class="line">    <span class="keyword">auto</span> previous = (process-&gt;refcount_)++;</div><div class="line">    <a class="code" href="group__XBT__error.html#gadd837b8bf67480aea409a8580072f0be">xbt_assert</a>(previous != 0);</div><div class="line">    (<a class="code" href="smpi__mpi_8cpp.html#ac9c84fa68bbad002983e35ce3663c686">void</a>) previous;</div><div class="line">  }</div><div class="line">  <span class="keyword">friend</span> <span class="keywordtype">void</span> <a class="code" href="namespacesimgrid_1_1s4u.html#a19a9d5168427b03b762ad5cf60f1f1c5">intrusive_ptr_release</a>(Process* process)</div><div class="line">  {</div><div class="line">    <span class="comment">// Atomic operation! Do not split in two instructions!</span></div><div class="line">    <span class="keyword">auto</span> <a class="code" href="smpi__mpi_8cpp.html#a5fd414b1e1d8b4d4f94cd964258c4a53">count</a> = --(process-&gt;refcount_);</div><div class="line">    <span class="keywordflow">if</span> (<a class="code" href="smpi__mpi_8cpp.html#a5fd414b1e1d8b4d4f94cd964258c4a53">count</a> == 0)</div><div class="line">      <span class="keyword">delete</span> process;</div><div class="line">  }</div><div class="line"></div><div class="line">  <span class="comment">// [...]</span></div><div class="line">};</div><div class="line"></div><div class="line">smx_process_t <a class="code" href="simix_8h.html#a05664a6480fe4cb1b6f34d581883deda">SIMIX_process_ref</a>(smx_process_t process)</div><div class="line">{</div><div class="line">  <span class="keywordflow">if</span> (process != <span class="keyword">nullptr</span>)</div><div class="line">    <a class="code" href="namespacesimgrid_1_1s4u.html#a48c0e95542045362966c90579bcfed60">intrusive_ptr_add_ref</a>(process);</div><div class="line">  <span class="keywordflow">return</span> process;</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keywordtype">void</span> <a class="code" href="simix_8h.html#a97fcd3143690eec3b596d28296819a56">SIMIX_process_unref</a>(smx_process_t process)</div><div class="line">{</div><div class="line">  <span class="keywordflow">if</span> (process != <span class="keyword">nullptr</span>)</div><div class="line">    <a class="code" href="namespacesimgrid_1_1s4u.html#a19a9d5168427b03b762ad5cf60f1f1c5">intrusive_ptr_release</a>(process);</div><div class="line">}</div></div><!-- fragment --><h1><a class="anchor" id="simgrid_uhood_async"></a>
Asynchronous operations</h1>
<h2><a class="anchor" id="simgrid_uhood_futures"></a>
Futures</h2>
<p>The <code><a class="el" href="classsimgrid_1_1kernel_1_1Future.html" title="Result of some (probably) asynchronous operation in the SimGrid kernel. ">simgrid::kernel::Future</a></code> class has been added to SimGrid as an abstraction to represent asynchronous operations in the SimGrid maestro. Its API is based on <code>std::experimental::future</code> from the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0159r0.html">C++ Extensions for Concurrency Technical Specification</a>:</p>
<ul>
<li><code><a class="el" href="classsimgrid_1_1kernel_1_1Future.html" title="Result of some (probably) asynchronous operation in the SimGrid kernel. ">simgrid::kernel::Future</a>&lt;T&gt;</code> represents the result an asynchronous operations in the simulation inside the SimGrid maestro/kernel;</li>
<li><code><a class="el" href="classsimgrid_1_1kernel_1_1Promise.html" title="Producer side of a simgrid::kernel::Future. ">simgrid::kernel::Promise</a>&lt;T&gt;</code> can be used to set the value of an assocaiated <code><a class="el" href="classsimgrid_1_1kernel_1_1Future.html" title="Result of some (probably) asynchronous operation in the SimGrid kernel. ">simgrid::kernel::Future</a>&lt;T&gt;</code>.</li>
</ul>
<p>The expected way to work with <code><a class="el" href="classsimgrid_1_1kernel_1_1Future.html" title="Result of some (probably) asynchronous operation in the SimGrid kernel. ">simgrid::kernel::Future</a>&lt;T&gt;</code> is to add a completion handler/continuation:</p>
<div class="fragment"><div class="line"><span class="comment">// This code is executed in the maestro context, we cannot block for the result</span></div><div class="line"><span class="comment">// to be ready:</span></div><div class="line"><a class="code" href="classsimgrid_1_1kernel_1_1Future.html">simgrid::kernel::Future&lt;std::vector&lt;char&gt;</a>&gt; <a class="code" href="smpi__mpi_8cpp.html#a6579216cffb6f565d98798aece8e0d2c">result</a> = simgrid::kernel::readFile(<a class="code" href="smpi__mpi_8cpp.html#afab32e5255798738d086a51432feb177">file</a>);</div><div class="line"></div><div class="line"><span class="comment">// Add a completion handler:</span></div><div class="line">result.<a class="code" href="classsimgrid_1_1kernel_1_1Future.html#af9cb00dba33320c7d80c2f455696397b">then</a>([<a class="code" href="smpi__mpi_8cpp.html#afab32e5255798738d086a51432feb177">file</a>](<a class="code" href="classsimgrid_1_1kernel_1_1Future.html">simgrid::kernel::Future</a>&lt;std::vector&lt;char&gt;&gt; result) {</div><div class="line">  <span class="comment">// At this point, the operation is complete and we can safely call .get():</span></div><div class="line">  <a class="code" href="group__XBT__error.html#gadd837b8bf67480aea409a8580072f0be">xbt_assert</a>(result.<a class="code" href="classsimgrid_1_1kernel_1_1Future.html#a0f63fc1cc897d4ecb0fbd157d04d796a">is_ready</a>());</div><div class="line">  <span class="keywordflow">try</span> {</div><div class="line">    std::vector&lt;char&gt; data = result.<a class="code" href="classsimgrid_1_1kernel_1_1Future.html#a45e6e7568ad65d6b4101b0f316b61c4d">get</a>();</div><div class="line">    <a class="code" href="group__XBT__log.html#gaec7da836fa1482fcda89227dfb1284d9">XBT_DEBUG</a>(<span class="stringliteral">&quot;Finished reading file %s: length %zu&quot;</span>, <a class="code" href="smpi__mpi_8cpp.html#afab32e5255798738d086a51432feb177">file</a>.c_str(), data.<a class="code" href="structs__smpi__mpi__datatype.html#a0d55be7f4df6cdba3900d442fb071761">size</a>());</div><div class="line">  }</div><div class="line">  <span class="comment">// If the operation failed, .get() throws an exception:</span></div><div class="line">  <span class="keywordflow">catch</span> (std::runtime_error&amp; e) {</div><div class="line">    <a class="code" href="group__XBT__log.html#ga46c64033e6f2d9f309f498bbb2c475f5">XBT_ERROR</a>(<span class="stringliteral">&quot;Could not read file %s&quot;</span>, <a class="code" href="smpi__mpi_8cpp.html#afab32e5255798738d086a51432feb177">file</a>.c_str());</div><div class="line">  }</div><div class="line">});</div></div><!-- fragment --><p>The SimGrid kernel cannot block so calling <code>.get()</code> or <code>.wait()</code> on a <code><a class="el" href="classsimgrid_1_1kernel_1_1Future.html" title="Result of some (probably) asynchronous operation in the SimGrid kernel. ">simgrid::kernel::Future</a>&lt;T&gt;</code> which is not ready will deadlock. In practice, the simulator detects this and aborts after reporting an error.</p>
<p>In order to generate your own future, you might need to use a <code><a class="el" href="classsimgrid_1_1kernel_1_1Promise.html" title="Producer side of a simgrid::kernel::Future. ">simgrid::kernel::Promise</a>&lt;T&gt;</code>. The promise is a one-way channel which can be used to set the result of an associated <code><a class="el" href="classsimgrid_1_1kernel_1_1Future.html" title="Result of some (probably) asynchronous operation in the SimGrid kernel. ">simgrid::kernel::Future</a>&lt;T&gt;</code> (with either <code>.set_value()</code> or <code>.set_exception()</code>):</p>
<div class="fragment"><div class="line"><a class="code" href="classsimgrid_1_1kernel_1_1Future.html">simgrid::kernel::Future&lt;void&gt;</a> kernel_wait_until(<span class="keywordtype">double</span> date)</div><div class="line">{</div><div class="line">  <span class="keyword">auto</span> promise = std::make_shared&lt;simgrid::kernel::Promise&lt;void&gt;&gt;();</div><div class="line">  <span class="keyword">auto</span> future = promise-&gt;get_future();</div><div class="line">  <a class="code" href="simix_8h.html#abb3c5e7d0f7d1b1f2cc5e0c6023e5e27">SIMIX_timer_set</a>(date, [promise] {</div><div class="line">    promise-&gt;set_value();</div><div class="line">  });</div><div class="line">  <span class="keywordflow">return</span> future;</div><div class="line">}</div></div><!-- fragment --><p>Like the experimental futures, we support chaining <code>.then()</code> methods with automatic future unwrapping. You might want to look at some <a href="https://www.youtube.com/watch?v=mPxIegd9J3w&amp;list=PLHTh1InhhwT75gykhs7pqcR_uSiG601oh&amp;index=43">tutorial on C++ futures</a> for more details and examples. Some operations of the proposed experimental futures are currently not implemented in our futures however such as <code>.wait_for()</code>, <code>.wait_until()</code>, <a href="http://en.cppreference.com/w/cpp/thread/shared_future"><code>shared_future</code></a>, <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0159r0.html#futures.when_any"><code>when_any()</code></a>.</p>
<h2><a class="anchor" id="simgrid_uhood_timer"></a>
Timers</h2>
<h1><a class="anchor" id="simgrid_uhood_mc"></a>
Model Checker</h1>
<p>The current implementation of the model-checker uses two distinct processes:</p>
<ul>
<li>the SimGrid model-checker (<code>simgrid-mc</code>) itself lives in the parent process;</li>
<li>it spaws a child process for the SimGrid simulator/maestro and the simulated processes.</li>
</ul>
<p>They communicate using a <code>AF_UNIX</code> <code>SOCK_DGRAM</code> socket and exchange messages defined in <code>mc_protocol.h</code>. The <code>SIMGRID_MC_SOCKET_FD</code> environment variable it set to the file descriptor of this socket in the child process.</p>
<p>The model-checker analyzes, saves and restores the state of the model-checked process using the following techniques:</p>
<ul>
<li>the model-checker reads and writes in the model-checked address space;</li>
<li>the model-cheker <code>ptrace()</code>s the model-checked process and is thus able to know the state of the model-checked process if it crashes;</li>
<li>DWARF debug informations are used to unwind the stack and identify local variables;</li>
<li>a custom heap is enabled in the model-checked process which allows the model checker to know which chunks are allocated and which are freed.</li>
</ul>
<h2><a class="anchor" id="simgrid_uhood_mc_address_space"></a>
Address space</h2>
<p>The <code>AddressSpace</code> is a base class used for both the model-checked process and its snapshots and has methods to read in the corresponding address space:</p>
<ul>
<li>the <code>Process</code> class is a subclass representing the model-checked process;</li>
<li>the <code>Snapshot</code> class is a subclass representing a snapshot of the process.</li>
</ul>
<p>Additional helper class include:</p>
<ul>
<li><code>Remote&lt;T&gt;</code> is the result of reading a <code>T</code> in a remote AddressSpace. For trivial types (int, etc.), it is convertible t o <code>T</code>;</li>
<li><code>RemotePtr&lt;T&gt;</code> represents the address of an object of type <code>T</code> in some remote <code>AddressSpace</code> (it could be an alias to <code>Remote&lt;T*&gt;</code>).</li>
</ul>
<h2><a class="anchor" id="simgrid_uhood_mc_address_elf_dwarf"></a>
ELF and DWARF</h2>
<p><a href="http://refspecs.linuxbase.org/elf/elf.pdf">ELF</a> is a standard executable file and dynamic libraries file format. <a href="http://dwarfstd.org/">DWARF</a> is a standard for debug informations. Both are used on GNU/Linux systems and exploited by the model-checker to understand the model-checked process:</p>
<ul>
<li><code>ObjectInformation</code> represents the informations about a given ELF module (executable or shared-object);</li>
<li><code>Frame</code> represents a subprogram scope (either a subprogram or a scope within the subprogram);</li>
<li><code>Type</code> represents a type (eg. <code>char*</code>, <code>int</code>, <code>std::string</code>) and is referenced by variables (global, variables, parameters), functions (return type), and other types (type of a <code>struct</code> field, etc.);</li>
<li><code>LocationList</code> and <code>DwarfExpression</code> are used to describe the location of variables. </li>
</ul>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
  </ul>
</div>
</body>
</html>