<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>al_destroy_display and cleaning up static memory</title>
		<link>http://www.allegro.cc/forums/view/615882</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 02 Dec 2015 09:39:31 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve been spelunking<span class="ref"><sup>[<a href="#">1</a>]</sup></span> in allegro internals for a few hours now trying to debug my ManyMouse program. I finally figured out I&#39;m accessing a display that has been destroyed already by means of <span class="source-code"><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a></span> returning a destroyed display. Shouldn&#39;t the thread local state (<span class="source-code">tls-&gt;current_display</span>) be reset (zeroed) when a display is destroyed? Or set to another display if one is available?</p><div class="source-code"><div class="toolbar"><span class="name">src/tls.c</span><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 378</span><span class="c">/* Function: al_get_current_display</span>
<span class="number"> 379</span><span class="c"> */</span>
<span class="number"> 380</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number"> 381</span><span class="k2">{</span>
<span class="number"> 382</span>   thread_local_state <span class="k3">*</span>tls<span class="k2">;</span>
<span class="number"> 383</span>
<span class="number"> 384</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>tls <span class="k3">=</span> tls_get<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="number"> 385</span>      <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 386</span>   <span class="k1">return</span> tls-&gt;current_display<span class="k2">;</span>
<span class="number"> 387</span><span class="k2">}</span>
</div></div><p>

Also, <span class="source-code"><a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a></span> does nothing to zero the memory of the display in use, so it just contains leftover garbage when you destroy it. Doesn&#39;t proper practice dictate zeroing memory when you aren&#39;t going to use it anymore? Or setting it to some kind of guard value?</p><div class="source-code"><div class="toolbar"><span class="name">display.c</span><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 139</span><span class="c">/* Function: al_destroy_display</span>
<span class="number"> 140</span><span class="c"> */</span>
<span class="number"> 141</span><span class="k1">void</span> <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display<span class="k2">)</span>
<span class="number"> 142</span><span class="k2">{</span>
<span class="number"> 143</span>   <span class="k1">if</span> <span class="k2">(</span>display<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 144</span>      <span class="c">/* This causes warnings and potential errors on Android because</span>
<span class="number"> 145</span><span class="c">       * it clears the context and Android needs this thread to have</span>
<span class="number"> 146</span><span class="c">       * the context bound in its destroy function and to destroy the</span>
<span class="number"> 147</span><span class="c">       * shader. Just skip this part on Android.</span>
<span class="number"> 148</span><span class="c">       */</span>
<span class="number"> 149</span><span class="p">#ifndef ALLEGRO_ANDROID</span>
<span class="number"> 150</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>bmp<span class="k2">;</span>
<span class="number"> 151</span>
<span class="number"> 152</span>      bmp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_target_bitmap"><span class="a">al_get_target_bitmap</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 153</span>      <span class="k1">if</span> <span class="k2">(</span>bmp <span class="k3">&amp;</span><span class="k3">&amp;</span> _al_get_bitmap_display<span class="k2">(</span>bmp<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> display<span class="k2">)</span>
<span class="number"> 154</span>         <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 155</span>
<span class="number"> 156</span>      <span class="c">/* This can happen if we have a current display, but the target bitmap</span>
<span class="number"> 157</span><span class="c">       * was a memory bitmap.</span>
<span class="number"> 158</span><span class="c">       */</span>
<span class="number"> 159</span>      <span class="k1">if</span> <span class="k2">(</span>display <span class="k3">=</span><span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number"> 160</span>         _al_set_current_display_only<span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 161</span><span class="p">#endif</span>
<span class="number"> 162</span>
<span class="number"> 163</span>      al_destroy_shader<span class="k2">(</span>display-&gt;default_shader<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 164</span>      display-&gt;default_shader <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 165</span>
<span class="number"> 166</span>      <a href="http://www.allegro.cc/manual/ASSERT"><span class="a">ASSERT</span></a><span class="k2">(</span>display-&gt;vt<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 167</span>      display-&gt;vt-&gt;destroy_display<span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 168</span>   <span class="k2">}</span>
<span class="number"> 169</span><span class="k2">}</span>
</div></div><p>

I&#39;m using Windows and D3D at the moment, so display-&gt;vt-&gt;destroy_display is currently set to <span class="source-code">d3d_destroy_display</span>. However, free doesn&#39;t seem to be setting any guard pattern with MinGW 4.8.1 when <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>display<span class="k2">)</span></span> is called (free is being called because the ALLEGRO_MEMORY_INTERFACE* mem is zero [because allegro never calls <span class="source-code"><a href="http://www.allegro.cc/manual/al_set_memory_interface"><span class="a">al_set_memory_interface</span></a></span> anywhere, it is unused]).
</p><div class="source-code"><div class="toolbar"><span class="name">memory.c</span><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 49</span><span class="c">/* Function: al_free_with_context</span>
<span class="number"> 50</span><span class="c"> */</span>
<span class="number"> 51</span><span class="k1">void</span> <a href="http://www.allegro.cc/manual/al_free_with_context"><span class="a">al_free_with_context</span></a><span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>ptr,
<span class="number"> 52</span>   <span class="k1">int</span> <a href="http://www.allegro.cc/manual/line"><span class="a">line</span></a>, <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>file, <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>func<span class="k2">)</span>
<span class="number"> 53</span><span class="k2">{</span>
<span class="number"> 54</span>   <span class="k1">if</span> <span class="k2">(</span>mem<span class="k2">)</span>
<span class="number"> 55</span>      mem-&gt;mi_free<span class="k2">(</span>ptr, <a href="http://www.allegro.cc/manual/line"><span class="a">line</span></a>, file, func<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 56</span>   <span class="k1">else</span>
<span class="number"> 57</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>ptr<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 58</span><span class="k2">}</span>
</div></div><p>

</p><div class="source-code"><div class="toolbar"><span class="name">memory.h</span><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 43</span><span class="c">/* Function: al_free</span>
<span class="number"> 44</span><span class="c"> */</span>
<span class="number"> 45</span><span class="p">#define al_free(p) \</span>
<span class="number"> 46</span><span class="p">   (al_free_with_context((p), __LINE__, __FILE__, __func__)) </span>
</div></div><p>


</p><div class="source-code"><div class="toolbar"><span class="name">d3d_disp.cpp</span><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 893</span><span class="k1">static</span> <span class="k1">void</span> d3d_destroy_display<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display<span class="k2">)</span>
<span class="number"> 894</span><span class="k2">{</span>
<span class="number"> 895</span>   ALLEGRO_SYSTEM_WIN <span class="k3">*</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_802.html" target="_blank">system</a> <span class="k3">=</span> <span class="k2">(</span>ALLEGRO_SYSTEM_WIN <span class="k3">*</span><span class="k2">)</span>al_get_system_driver<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 896</span>   ALLEGRO_DISPLAY_D3D <span class="k3">*</span>d3d_display <span class="k3">=</span> <span class="k2">(</span>ALLEGRO_DISPLAY_D3D <span class="k3">*</span><span class="k2">)</span>display<span class="k2">;</span>
<span class="number"> 897</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>old_disp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 898</span>
<span class="number"> 899</span>   ALLEGRO_INFO<span class="k2">(</span><span class="s">"destroying display %p (current %p)\n"</span>, display, old_disp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 900</span>
<span class="number"> 901</span>   <span class="k1">if</span> <span class="k2">(</span>old_disp <span class="k3">!</span><span class="k3">=</span> display<span class="k2">)</span>
<span class="number"> 902</span>      _al_set_current_display_only<span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 903</span>
<span class="number"> 904</span>   <span class="k1">if</span> <span class="k2">(</span>system-&gt;mouse_grab_display <span class="k3">=</span><span class="k3">=</span> display<span class="k2">)</span>
<span class="number"> 905</span>      <a href="http://www.allegro.cc/manual/al_ungrab_mouse"><span class="a">al_ungrab_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 906</span>
<span class="number"> 907</span>   _al_win_destroy_display_icons<span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 908</span>
<span class="number"> 909</span>   d3d_destroy_display_internals<span class="k2">(</span>d3d_display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 910</span>
<span class="number"> 911</span>   _al_vector_free<span class="k2">(</span><span class="k3">&amp;</span>display-&gt;display_invalidated_callbacks<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 912</span>   _al_vector_free<span class="k2">(</span><span class="k3">&amp;</span>display-&gt;display_validated_callbacks<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 913</span>
<span class="number"> 914</span>   _al_vector_find_and_delete<span class="k2">(</span><span class="k3">&amp;</span>system-&gt;system.displays, <span class="k3">&amp;</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 915</span>
<span class="number"> 916</span>   <span class="k1">if</span> <span class="k2">(</span>system-&gt;system.displays._size <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 917</span>      ffw_set <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 918</span>      already_fullscreen <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 919</span>   <span class="k2">}</span>
<span class="number"> 920</span>
<span class="number"> 921</span>   <span class="k1">if</span> <span class="k2">(</span>d3d_display-&gt;es_inited<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 922</span>      _al_event_source_free<span class="k2">(</span><span class="k3">&amp;</span>display-&gt;es<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 923</span>      d3d_display-&gt;es_inited <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 924</span>   <span class="k2">}</span>
<span class="number"> 925</span>
<span class="number"> 926</span>   _al_vector_free<span class="k2">(</span><span class="k3">&amp;</span>display-&gt;bitmaps<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 927</span>   _al_vector_free<span class="k2">(</span><span class="k3">&amp;</span><span class="k2">(</span><span class="k2">(</span>ALLEGRO_DISPLAY_WIN<span class="k3">*</span><span class="k2">)</span> display<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>msg_callbacks<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 928</span>
<span class="number"> 929</span>   <span class="k1">if</span> <span class="k2">(</span>old_disp <span class="k3">!</span><span class="k3">=</span> display<span class="k2">)</span>
<span class="number"> 930</span>      _al_set_current_display_only<span class="k2">(</span>old_disp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 931</span>
<span class="number"> 932</span>   <a href="http://www.allegro.cc/manual/al_free"><span class="a">al_free</span></a><span class="k2">(</span>display-&gt;vertex_cache<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 933</span>   <a href="http://www.allegro.cc/manual/al_free"><span class="a">al_free</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 934</span><span class="k2">}</span>
</div></div><p>
</p><div class="ref-block"><h2>References</h2><ol><li><a href="http://dictionary.reference.com/browse/spelunking">http://dictionary.reference.com/browse/spelunking</a></li></ol></div></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 18 Nov 2015 15:47:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/615882/1017910#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>Shouldn&#39;t the thread local state (tls-&gt;current_display) be reset (zeroed) when a display is destroyed? Or set to another display if one is available?</p></div></div><p>

I think setting it to zero is what we should do.</p><p>But I already see this, so somehow you must manage to bypass that...</p><p><a href="https://github.com/liballeg/allegro5/blob/5.1/src/win/d3d_disp.cpp#L2416">https://github.com/liballeg/allegro5/blob/5.1/src/win/d3d_disp.cpp#L2416</a></p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Doesn&#39;t proper practice dictate zeroing memory when you aren&#39;t going to use it anymore? </p></div></div><p>

No - the memory may be reclaimed by the next memory allocation in fact and so zeroing out would not do anything. MSVC I believe has a debug setting by which it writes a pattern into free memory and does not re-use it. valgrind does the same in Linux and it&#39;s very useful.</p><p>And you can always use al_set_memory_interface to do exactly that on your own, it&#39;s why that function exists.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Wed, 18 Nov 2015 21:23:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/615882/1017914#target">Elias</a> said:</div><div class="quote"><p>
 I think setting it to zero is what we should do.</p><p>But I already see this, so somehow you must manage to bypass that...</p><p><a href="https://github.com/liballeg/allegro5/blob/5.1/src/win/d3d_disp.cpp#L2416">https://github.com/liballeg/allegro5/blob/5.1/src/win/d3d_disp.cpp#L2416</a>
</p></div></div><p>
The link you gave references <span class="source-code">_al_d3d_destroy_bitmap</span>. Perhaps you meant something else?</p><div class="quote_container"><div class="title">Elias said:</div><div class="quote"><p>
</p><div class="quote_container"><div class="title">I said:</div><div class="quote"><p>
Doesn&#39;t proper practice dictate zeroing memory when you aren&#39;t going to use it anymore?
</p></div></div><p>
No - the memory may be reclaimed by the next memory allocation in fact and so zeroing out would not do anything. MSVC I believe has a debug setting by which it writes a pattern into free memory and does not re-use it. valgrind does the same in Linux and it&#39;s very useful.</p><p>And you can always use al_set_memory_interface to do exactly that on your own, it&#39;s why that function exists. 
</p></div></div><p>
Oh, okay!! That&#39;s what that is for! <img src="http://www.allegro.cc/forums/smileys/shocked.gif" alt=":o" /> I tried looking up bit patterns used by MinGW but I couldn&#39;t find anything on Google. I thought MinGW would fill memory freed by free with some special bit pattern. I see 0xffffffffbaadfood in places (uninitialized allocated memory). How would I &#39;not re-use&#39; memory? Would I have to make my own memory pool and divvy that up when my malloc is called?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 19 Nov 2015 01:26:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/615882/1017925#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>The link you gave references _al_d3d_destroy_bitmap. Perhaps you meant something else?</p></div></div><p>

Oh, yes, I thought the target bitmap is invalid - didn&#39;t realize we&#39;re talking about the display itself getting destroyed. So how can the current display end up pointing to a destroyed one? Only way I can see is if two threads access it at the same time - which is just not supported.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Thu, 19 Nov 2015 02:02:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You may be right, but I&#39;m not sure. I have two displays created on the main thread, and then all the mouse displays are created on the main display&#39;s window process thread that allegro creates in the window callback. Each mouse handles its own drawing on its window process thread that allegro created for the display in its own window process callback function. Mice are told to draw from the main displays callback process through PostMessage, which sends a message to the mouse&#39;s HWND, and drawing is taken care of by drawing from a DIB to the HWND of the mouse.</p><p>I really don&#39;t know what is causing the crash, and like I said I can only debug it on Vista. I&#39;ll try to get more info tonight, and see whether it is the backbuffer that is the bitmap that has been destroyed like you asked.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 02 Dec 2015 09:39:31 +0000</pubDate>
	</item>
</rss>
