<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Crash in example(s?) ; ex_threads, </title>
		<link>http://www.allegro.cc/forums/view/616214</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 13 May 2016 03:43:28 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey guys,</p><p>I recently compiled A5.2 from GIT and when I run ex_threads.exe it crashes. Here&#39;s the log and backtrace :</p><div class="source-code"><div class="toolbar"><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">  1</span>c:\mingw\LIBS\A5GITdistro\bin&gt;gdb ex_threads.exe
<span class="number">  2</span>GNU gdb <span class="k2">(</span>GDB<span class="k2">)</span> <span class="n">7</span>.<span class="n">6</span>.<span class="n">1</span>
<span class="number">  3</span>Copyright <span class="k2">(</span>C<span class="k2">)</span> <span class="n">2013</span> Free Software Foundation, Inc.
<span class="number">  4</span>License GPLv3<span class="k3">+</span><span class="k2">:</span> GNU GPL version <span class="n">3</span> <span class="k1">or</span> later <span class="k3">&lt;</span>http:<span class="c">//gnu.org/licenses/gpl.html&gt;</span>
<span class="number">  5</span>This is <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a> software: you are <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a> to change <span class="k1">and</span> redistribute it.
<span class="number">  6</span>There is NO WARRANTY, to the extent permitted by law.  Type <span class="s">"show copying"</span>
<span class="number">  7</span><span class="k1">and</span> <span class="s">"show warranty"</span> <span class="k1">for</span> details.
<span class="number">  8</span>This GDB was configured as <span class="s">"mingw32"</span>.
<span class="number">  9</span>For bug reporting instructions, please see:
<span class="number"> 10</span><span class="k3">&lt;</span>http:<span class="c">//www.gnu.org/software/gdb/bugs/&gt;...</span>
<span class="number"> 11</span>Reading symbols from c:\mingw\LIBS\A5GITdistro\bin\ex_threads.exe...done.
<span class="number"> 12</span><span class="k2">(</span>gdb<span class="k2">)</span> run
<span class="number"> 13</span>Starting program: c:\mingw\LIBS\A5GITdistro\bin<span class="k3">/</span>ex_threads.exe
<span class="number"> 14</span><span class="k2">[</span>New Thread <span class="n">10184</span>.<span class="n">0x208c</span><span class="k2">]</span>
<span class="number"> 15</span><span class="k2">[</span>New Thread <span class="n">10184</span>.<span class="n">0x25a8</span><span class="k2">]</span>
<span class="number"> 16</span><span class="k2">[</span>New Thread <span class="n">10184</span>.<span class="n">0x11e4</span><span class="k2">]</span>
<span class="number"> 17</span><span class="k2">[</span>New Thread <span class="n">10184</span>.<span class="n">0x2014</span><span class="k2">]</span>
<span class="number"> 18</span><span class="k2">[</span>New Thread <span class="n">10184</span>.<span class="n">0xe60</span><span class="k2">]</span>
<span class="number"> 19</span><span class="k2">[</span>New Thread <span class="n">10184</span>.<span class="n">0x254c</span><span class="k2">]</span>
<span class="number"> 20</span><span class="k2">[</span>New Thread <span class="n">10184</span>.<span class="n">0x22e0</span><span class="k2">]</span>
<span class="number"> 21</span><span class="k2">[</span>New Thread <span class="n">10184</span>.<span class="n">0x1aac</span><span class="k2">]</span>
<span class="number"> 22</span>warning: HEAP<span class="k2">[</span>ex_threads.exe<span class="k2">]</span><span class="k2">:</span>
<span class="number"> 23</span>warning: Heap block at <span class="n">00696D60</span> modified at <span class="n">00696D78</span> past requested size of <span class="n">10</span>
<span class="number"> 24</span>
<span class="number"> 25</span>
<span class="number"> 26</span>Program received <a href="http://www.delorie.com/djgpp/doc/libc/libc_724.html" target="_blank">signal</a> SIGTRAP, Trace<span class="k3">/</span>breakpoint trap.
<span class="number"> 27</span><span class="k2">[</span>Switching to Thread <span class="n">10184</span>.<span class="n">0x254c</span><span class="k2">]</span>
<span class="number"> 28</span><span class="n">0x77a8ee8b</span> in ?? <span class="k2">(</span><span class="k2">)</span>
<span class="number"> 29</span><span class="k2">(</span>gdb<span class="k2">)</span> bt
<span class="number"> 30</span><span class="p">#0  0x77a8ee8b in ?? ()</span>
<span class="number"> 31</span><span class="p">#1  0x77a3cc8f in ?? ()</span>
<span class="number"> 32</span><span class="p">#2  0x77a8e598 in ?? ()</span>
<span class="number"> 33</span><span class="p">#3  0x779ea563 in ?? ()</span>
<span class="number"> 34</span><span class="p">#4  0x779ea119 in ?? ()</span>
<span class="number"> 35</span><span class="p">#5  0x779ea043 in ?? ()</span>
<span class="number"> 36</span><span class="p">#6  0x75047d39 in realloc () from C:\WINDOWS\SysWOW64\msvcrt.dll</span>
<span class="number"> 37</span><span class="p">#7  0x00690000 in ?? ()</span>
<span class="number"> 38</span><span class="p">#8  0x675af435 in al_realloc_with_context (ptr=0x696d68, n=48, line=188, file=0x677621ac &lt;__func__.5627+28&gt; "C:\\mingw\\LIBS\\A5GIT\\allegro5\\src\\misc\\vector.c",</span>
<span class="number"> 39</span>    func<span class="k3">=</span><span class="n">0x677622af</span> <span class="k3">&lt;</span>__func__.5372&gt; <span class="s">"_al_vector_alloc_back"</span><span class="k2">)</span> at C:\mingw\LIBS\A5GIT\allegro5\src\memory.c:70
<span class="number"> 40</span><span class="p">#9  0x67617e69 in _al_vector_alloc_back (vec=0x677ded00 &lt;eds_list&gt;) at C:\mingw\LIBS\A5GIT\allegro5\src\misc\vector.c:188</span>
<span class="number"> 41</span><span class="p">#10 0x67633910 in _al_d3d_generate_display_format_list () at C:\mingw\LIBS\A5GIT\allegro5\src\win\d3d_display_formats.cpp:97</span>
<span class="number"> 42</span><span class="p">#11 0x6762f22b in d3d_create_display_internals (d3d_display=0x6970a0, free_on_error=true) at C:\mingw\LIBS\A5GIT\allegro5\src\win\d3d_disp.cpp:1640</span>
<span class="number"> 43</span><span class="p">#12 0x6762fb08 in d3d_create_display_locked (w=300, h=300) at C:\mingw\LIBS\A5GIT\allegro5\src\win\d3d_disp.cpp:1774</span>
<span class="number"> 44</span><span class="p">#13 0x6762fe1e in d3d_create_display (w=300, h=300) at C:\mingw\LIBS\A5GIT\allegro5\src\win\d3d_disp.cpp:1836</span>
<span class="number"> 45</span><span class="p">#14 0x6759f870 in al_create_display (w=300, h=300) at C:\mingw\LIBS\A5GIT\allegro5\src\display.c:53</span>
<span class="number"> 46</span><span class="p">#15 0x00401c97 in thread_func (thr=0x695480, arg=0x63fc60) at C:\mingw\LIBS\A5GIT\allegro5\examples\ex_threads.c:116</span>
<span class="number"> 47</span><span class="p">#16 0x675b4480 in thread_func_trampoline (inner=0x695480, _outer=0x695480) at C:\mingw\LIBS\A5GIT\allegro5\src\threads.c:80</span>
<span class="number"> 48</span><span class="p">#17 0x67627618 in thread_proc_trampoline (data=0x695480) at C:\mingw\LIBS\A5GIT\allegro5\src\win\wxthread.c:33</span>
<span class="number"> 49</span><span class="p">#18 0x750671e6 in msvcrt!_beginthreadex () from C:\WINDOWS\SysWOW64\msvcrt.dll</span>
<span class="number"> 50</span><span class="p">#19 0x750672b1 in msvcrt!_endthreadex () from C:\WINDOWS\SysWOW64\msvcrt.dll</span>
<span class="number"> 51</span><span class="p">#20 0x748438f4 in KERNEL32!BaseThreadInitThunk () from C:\WINDOWS\SysWOW64\kernel32.dll</span>
<span class="number"> 52</span><span class="p">#21 0x77a15de3 in ?? ()</span>
<span class="number"> 53</span><span class="p">#22 0x77a15dae in ?? ()</span>
<span class="number"> 54</span><span class="p">#23 0x00000000 in ?? ()</span>
<span class="number"> 55</span><span class="k2">(</span>gdb<span class="k2">)</span> frame <span class="n">10</span>
<span class="number"> 56</span><span class="p">#10 0x67633910 in _al_d3d_generate_display_format_list () at C:\mingw\LIBS\A5GIT\allegro5\src\win\d3d_display_formats.cpp:97</span>
<span class="number"> 57</span><span class="n">97</span>                     peds <span class="k3">=</span> <span class="k2">(</span>ALLEGRO_EXTRA_DISPLAY_SETTINGS <span class="k3">*</span><span class="k3">*</span><span class="k2">)</span>_al_vector_alloc_back<span class="k2">(</span><span class="k3">&amp;</span>eds_list<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 58</span><span class="k2">(</span>gdb<span class="k2">)</span>
</div></div><p>

I&#39;m investigating this but I haven&#39;t found the cause yet. I looked at <span class="source-code">_al_d3d_generate_display_format_list</span> and <span class="source-code">_al_vector_alloc_back</span> but so far I haven&#39;t really found anything obvious.</p><p>From the addresses and the warnings, it looks like it is trying to write past the allocated memory for <span class="source-code">eds_list-&gt;_items</span> in frame #10.</p><p>What&#39;s weird is that it is crashing in <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_648.html" target="_blank">realloc</a></span>. Can&#39;t explain that one.</p><p>EDIT<br />Okay, so I&#39;ve been doing some debugging, and I&#39;ve been looking at <span class="source-code">_al_d3d_generate_display_format_list</span> and I&#39;m getting some odd values that I can&#39;t explain. On line 90 of d3d_display_formats.cpp, a triply nested loop appears. When it crashes, i, j, and k are all zero, which should indicate it is the first time through each loop. The weird thing is though, that eds_list._size is already 3 and eds_list._unused is already 1, which would indicate al_vector_alloc_back has been called three times, as well as realloc. How can a single line of code in the third level of the loop have been called 3 times when each loop index is zero? It makes no sense. That&#39;s as far as I&#39;ve gotten debugging this.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 20 Apr 2016 08:37:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>ex_threads creates several windows, so that loop is executed several times in parallel - but I didn&#39;t actually look at the code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Wed, 20 Apr 2016 09:08:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think then that the problem is this variable :</p><div class="source-code"><div class="toolbar"><span class="name">d3d_display_formats.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"> 35</span><span class="k1">static</span> _AL_VECTOR eds_list<span class="k2">;</span>
</div></div><p>

Since eds_list is not part of TLS it gets shared among the threads in ex_threads.cpp, which are creating displays in parallel. So eds_list&#39;s contents get reallocated in one thread while another thread has an old memory address for the vector&#39;s contents and then it accesses memory that is no longer valid.</p><p>In addition, there are two other static variables in the <span class="source-code">_al_d3d_generate_display_format_list</span> function. I&#39;m not sure what the comment &quot;stop [the] warning&quot; means or what it is for. It looks like they are there to prevent the function from re-generating the display format list if it has already been created and the adapter and fullscreen variables match the new display options.</p><div class="source-code"><div class="toolbar"><span class="name">d3d_display_formats.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">  47</span><span class="k1">void</span> _al_d3d_generate_display_format_list<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number">  48</span><span class="k2">{</span>
<div class="highlight"><span class="number">  49</span>   <span class="k1">static</span> <span class="k1">bool</span> fullscreen <span class="k3">=</span> <span class="k3">!</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_new_display_flags"><span class="a">al_get_new_display_flags</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">&amp;</span> ALLEGRO_FULLSCREEN<span class="k2">)</span><span class="k2">;</span> <span class="c">/* stop warning */</span> </div><div class="highlight"><span class="number">  50</span>   <span class="k1">static</span> <span class="k1">int</span> adapter <span class="k3">=</span> ~<a href="http://www.allegro.cc/manual/al_get_new_display_adapter"><span class="a">al_get_new_display_adapter</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">/* stop warning */</span> </div><span class="number">  51</span>   <span class="k1">int</span> i<span class="k2">;</span>
<span class="number">  52</span>
<span class="number">  53</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>_al_vector_is_empty<span class="k2">(</span><span class="k3">&amp;</span>eds_list<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>fullscreen <span class="k3">=</span><span class="k3">=</span> <span class="k2">(</span><span class="k1">bool</span><span class="k2">)</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_new_display_flags"><span class="a">al_get_new_display_flags</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">&amp;</span> ALLEGRO_FULLSCREEN<span class="k2">)</span><span class="k2">)</span>
<span class="number">  54</span>         <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>adapter <span class="k3">=</span><span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_new_display_adapter"><span class="a">al_get_new_display_adapter</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  55</span>      <span class="k1">return</span><span class="k2">;</span>
<span class="number">  56</span>   <span class="k2">}</span>
<span class="number">  57</span>   <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>_al_vector_is_empty<span class="k2">(</span><span class="k3">&amp;</span>eds_list<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  58</span>     _al_d3d_destroy_display_format_list<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span>   <span class="k2">}</span>
<span class="number">  60</span>
<span class="number">  61</span>   fullscreen <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_new_display_flags"><span class="a">al_get_new_display_flags</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">&amp;</span> ALLEGRO_FULLSCREEN<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  62</span>   adapter <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_new_display_adapter"><span class="a">al_get_new_display_adapter</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  63</span>   <span class="k1">if</span> <span class="k2">(</span>adapter <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">  64</span>      adapter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  65</span>
<span class="number">  66</span>   _al_vector_init<span class="k2">(</span><span class="k3">&amp;</span>eds_list, <span class="k1">sizeof</span><span class="k2">(</span>ALLEGRO_EXTRA_DISPLAY_SETTINGS <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  67</span>
<span class="number">  68</span>   <span class="c">/* Loop through each bit combination of:</span>
<span class="number">  69</span><span class="c">    * bit 0: 16/32 bit</span>
<span class="number">  70</span><span class="c">    * bit 1: single-buffer</span>
<span class="number">  71</span><span class="c">    * bit 2: vsync</span>
<span class="number">  72</span><span class="c">    */</span>
<span class="number">  73</span>   <span class="k1">for</span> <span class="k2">(</span>i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> <span class="n">8</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  74</span>      <span class="k1">int</span> format_num <span class="k3">=</span> <span class="k3">!</span><span class="k3">!</span><span class="k2">(</span>i <span class="k3">&amp;</span> <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  75</span>      <span class="k1">int</span> single_buffer <span class="k3">=</span> <span class="k3">!</span><span class="k3">!</span><span class="k2">(</span>i <span class="k3">&amp;</span> <span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  76</span>      <span class="k1">int</span> <a href="http://www.allegro.cc/manual/vsync"><span class="a">vsync</span></a> <span class="k3">=</span> <span class="k3">!</span><span class="k3">!</span><span class="k2">(</span>i <span class="k3">&amp;</span> <span class="n">4</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  77</span>      <span class="k1">int</span> allegro_format <span class="k3">=</span> ALLEGRO_PIXEL_FORMAT_XRGB_8888<span class="k2">;</span>
<span class="number">  78</span>      <span class="k1">if</span> <span class="k2">(</span>format_num <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> allegro_format <span class="k3">=</span> ALLEGRO_PIXEL_FORMAT_RGB_565<span class="k2">;</span>
<span class="number">  79</span>      D3DFORMAT d3d_format <span class="k3">=</span> <span class="k2">(</span>D3DFORMAT<span class="k2">)</span>_al_pixel_format_to_d3d<span class="k2">(</span>allegro_format<span class="k2">)</span><span class="k2">;</span>
<span class="number">  80</span>
<span class="number">  81</span>     <span class="c">/* Count available multisample quality levels. */</span>
<span class="number">  82</span>      DWORD quality_levels <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  83</span>
<span class="number">  84</span>      <span class="k1">if</span> <span class="k2">(</span>_al_d3d-&gt;CheckDeviceMultiSampleType<span class="k2">(</span>adapter, D3DDEVTYPE_HAL, d3d_format,
<span class="number">  85</span>         <span class="k3">!</span>fullscreen, D3DMULTISAMPLE_NONMASKABLE, <span class="k3">&amp;</span>quality_levels<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> D3D_OK<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  86</span>         _al_d3d-&gt;CheckDeviceMultiSampleType<span class="k2">(</span>adapter, D3DDEVTYPE_REF, d3d_format,
<span class="number">  87</span>            <span class="k3">!</span>fullscreen, D3DMULTISAMPLE_NONMASKABLE, <span class="k3">&amp;</span>quality_levels<span class="k2">)</span><span class="k2">;</span>
<span class="number">  88</span>      <span class="k2">}</span>
<span class="number">  89</span>
<span class="number">  90</span>      <span class="c">/* Loop through available depth/stencil formats. */</span>
<span class="number">  91</span>      <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> j <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> j <span class="k3">&lt;</span> D3D_DEPTH_FORMATS<span class="k2">;</span> j<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  92</span>         <span class="k1">if</span> <span class="k2">(</span>j <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">|</span><span class="k3">|</span> IsDepthFormatExisting<span class="k2">(</span>
<span class="number">  93</span>               depth_stencil_formats<span class="k2">[</span>j<span class="k2">]</span>.format, d3d_format<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  94</span>            DEPTH_STENCIL_DESC <span class="k3">*</span>ds <span class="k3">=</span> depth_stencil_formats <span class="k3">+</span> j<span class="k2">;</span>
<span class="number">  95</span>            <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> k <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> k <span class="k3">&lt;</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>quality_levels <span class="k3">+</span> <span class="n">1</span><span class="k2">;</span> k<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  96</span>               ALLEGRO_EXTRA_DISPLAY_SETTINGS <span class="k3">*</span>eds, <span class="k3">*</span><span class="k3">*</span>peds<span class="k2">;</span>
<span class="number">  97</span>               peds <span class="k3">=</span> <span class="k2">(</span>ALLEGRO_EXTRA_DISPLAY_SETTINGS <span class="k3">*</span><span class="k3">*</span><span class="k2">)</span>_al_vector_alloc_back<span class="k2">(</span><span class="k3">&amp;</span>eds_list<span class="k2">)</span><span class="k2">;</span>
<span class="number">  98</span>               eds <span class="k3">=</span> <span class="k3">*</span>peds <span class="k3">=</span> <span class="k2">(</span>ALLEGRO_EXTRA_DISPLAY_SETTINGS <span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/al_malloc"><span class="a">al_malloc</span></a><span class="k2">(</span><span class="k1">sizeof</span> <span class="k3">*</span>eds<span class="k2">)</span><span class="k2">;</span>               
<span class="number">  99</span>               <a href="http://www.delorie.com/djgpp/doc/libc/libc_569.html" target="_blank">memset</a><span class="k2">(</span>eds-&gt;settings, <span class="n">0</span>, <span class="k1">sizeof</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span> <span class="k3">*</span> ALLEGRO_DISPLAY_OPTIONS_COUNT<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 100</span>
<span class="number"> 101</span>               eds-&gt;settings<span class="k2">[</span>ALLEGRO_COMPATIBLE_DISPLAY<span class="k2">]</span> <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 102</span>
<span class="number"> 103</span>               <span class="k1">if</span> <span class="k2">(</span>format_num <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 104</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_RED_SIZE<span class="k2">]</span> <span class="k3">=</span> <span class="n">8</span><span class="k2">;</span>
<span class="number"> 105</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_GREEN_SIZE<span class="k2">]</span> <span class="k3">=</span> <span class="n">8</span><span class="k2">;</span>
<span class="number"> 106</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_BLUE_SIZE<span class="k2">]</span> <span class="k3">=</span> <span class="n">8</span><span class="k2">;</span>
<span class="number"> 107</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_RED_SHIFT<span class="k2">]</span> <span class="k3">=</span> <span class="n">16</span><span class="k2">;</span>
<span class="number"> 108</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_GREEN_SHIFT<span class="k2">]</span> <span class="k3">=</span> <span class="n">8</span><span class="k2">;</span>
<span class="number"> 109</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_BLUE_SHIFT<span class="k2">]</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 110</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_COLOR_SIZE<span class="k2">]</span> <span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number"> 111</span>               <span class="k2">}</span>
<span class="number"> 112</span>               <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>format_num <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 113</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_RED_SIZE<span class="k2">]</span> <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 114</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_GREEN_SIZE<span class="k2">]</span> <span class="k3">=</span> <span class="n">6</span><span class="k2">;</span>
<span class="number"> 115</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_BLUE_SIZE<span class="k2">]</span> <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 116</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_RED_SHIFT<span class="k2">]</span> <span class="k3">=</span> <span class="n">11</span><span class="k2">;</span>
<span class="number"> 117</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_GREEN_SHIFT<span class="k2">]</span> <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 118</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_BLUE_SHIFT<span class="k2">]</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 119</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_COLOR_SIZE<span class="k2">]</span> <span class="k3">=</span> <span class="n">16</span><span class="k2">;</span>
<span class="number"> 120</span>               <span class="k2">}</span>
<span class="number"> 121</span>
<span class="number"> 122</span>               <span class="k1">if</span> <span class="k2">(</span>single_buffer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 123</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_SINGLE_BUFFER<span class="k2">]</span> <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 124</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_UPDATE_DISPLAY_REGION<span class="k2">]</span> <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 125</span>               <span class="k2">}</span>
<span class="number"> 126</span>
<span class="number"> 127</span>               <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/vsync"><span class="a">vsync</span></a><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 128</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_VSYNC<span class="k2">]</span> <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 129</span>               <span class="k2">}</span>
<span class="number"> 130</span>
<span class="number"> 131</span>               eds-&gt;settings<span class="k2">[</span>ALLEGRO_DEPTH_SIZE<span class="k2">]</span> <span class="k3">=</span> ds-&gt;d<span class="k2">;</span>
<span class="number"> 132</span>               eds-&gt;settings<span class="k2">[</span>ALLEGRO_STENCIL_SIZE<span class="k2">]</span> <span class="k3">=</span> ds-&gt;s<span class="k2">;</span>
<span class="number"> 133</span>               
<span class="number"> 134</span>               <span class="k1">if</span> <span class="k2">(</span>k <span class="k3">&gt;</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 135</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_SAMPLE_BUFFERS<span class="k2">]</span> <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 136</span>                  <span class="c">// TODO: Is it ok to use the quality level here?</span>
<span class="number"> 137</span>                  eds-&gt;settings<span class="k2">[</span>ALLEGRO_SAMPLES<span class="k2">]</span> <span class="k3">=</span> k<span class="k2">;</span>
<span class="number"> 138</span>               <span class="k2">}</span>
<span class="number"> 139</span>            <span class="k2">}</span>
<span class="number"> 140</span>         <span class="k2">}</span>
<span class="number"> 141</span>      <span class="k2">}</span>
<span class="number"> 142</span>      
<span class="number"> 143</span>   <span class="k2">}</span>
<span class="number"> 144</span>   ALLEGRO_INFO<span class="k2">(</span><span class="s">"found %d format combinations\n"</span>, _al_vector_size<span class="k2">(</span><span class="k3">&amp;</span>eds_list<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 145</span><span class="k2">}</span>
</div></div><p>

So I think that if eds_list, fullscreen, and adapter are moved into TLS then ex_threads will be able to run safely, since then each thread will have its own display settings list.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 20 Apr 2016 10:25:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Or simply <b>not</b> make them global, thread local or not?</p><p>I haven&#39;t looked at the code though so maybe there is a reason those are global - but my first try at fixing it would be to simply not make those variables global.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Thu, 21 Apr 2016 05:20:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>fullscreen and adapter need to persist between function calls, as well as the eds_list. There should be one instance per thread, because each time you create a display they change, and a single thread can have multiple displays.</p><p>Edit<br />Well I guess technically that&#39;s not true. You could recreate the list each time. However, I think the point was to re-use it.</p><p>Edit2<br />Actually, I don&#39;t know. Multiple functions work on the same data, but that could be solved by passing a reference. It would force you to fully re-create the display list each time you create a display though. I don&#39;t know how expensive that is. The list only needs to be re-created when fullscreen or adapter change.</p><p>Edit3 04/28/2016 1:00AM<br />Do you guys want me to work on a patch for this? Right now I&#39;m leaning towards moving <span class="source-code">eds_list</span>, <span class="source-code">fullscreen</span>, and <span class="source-code">adapter</span> into TLS. Or else we could just recreate the list every time <span class="source-code">_al_d3d_generate_display_format_list</span> is called. Thoughts? I&#39;m willing to work on this if you want. Otherwise, ex_threads is broken on Direct3D.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 28 Apr 2016 11:03:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I would say re-create the list every time - but I haven&#39;t looked at the code. My gut feeling just is that it&#39;s always bad to keep stuff around in some global variable - and this is not something that should take a long time nor something that will happen very often, so I&#39;d say re-create it when needed.</p><p>If you make the patch to just move it to TLS that probably also is acceptable though <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Fri, 29 Apr 2016 04:11:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think I will add it to TLS. I&#39;ll do it here in the next few days or so.</p><p>Edit<br />Okay, I&#39;m in the middle of adding it to TLS. How should I interface with the thread local storage though? <span class="source-code">tls_get</span> is not accessible outside of tls.c. Should I make accessor functions? Or can I export tls_get somehow? It seems silly to have three accessor functions just to access three variables in tls.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 13 May 2016 03:43:28 +0000</pubDate>
	</item>
</rss>
