<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Crash in d3d_shutdown</title>
		<link>http://www.allegro.cc/forums/view/613372</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 16 Oct 2013 22:52:14 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve been receiving an intermittent crash in d3d_shutdown when my program exits. Why would it crash on the line <span class="source-code">_al_d3d-&gt;Release<span class="k2">(</span><span class="k2">)</span></span> unless _al_d3d was an invalid pointer? My window sets up fine and I don&#39;t believe I am double freeing anything.</p><p>I&#39;m using MinGW 4.5.0 on Vista with latest Allegro from Git.</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>
<span class="number">  2</span>Program received <a href="http://www.delorie.com/djgpp/doc/libc/libc_724.html" target="_blank">signal</a> SIGSEGV, Segmentation fault.
<span class="number">  3</span><span class="n">0x693df8b7</span> in d3d_shutdown <span class="k2">(</span><span class="k2">)</span> at C:\mingw\LIBS\A5GIT\allegro\src\win\d3d_disp.cpp:2604
<span class="number">  4</span><span class="n">2604</span>       _al_d3d-&gt;Release<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span><span class="k2">(</span>gdb<span class="k2">)</span> p _al_d3d
<span class="number">  6</span>$<span class="n">1</span> <span class="k3">=</span> <span class="k2">(</span>LPDIRECT3D9<span class="k2">)</span> <span class="n">0x25b07e0</span>
<span class="number">  7</span><span class="k2">(</span>gdb<span class="k2">)</span> bt
<span class="number">  8</span><span class="p">#0  0x693df8b7 in d3d_shutdown () at C:\mingw\LIBS\A5GIT\allegro\src\win\d3d_disp.cpp:2604</span>
<span class="number">  9</span><span class="p">#1  0x693cfa88 in win_shutdown () at C:\mingw\LIBS\A5GIT\allegro\src\win\wsystem.c:197</span>
<span class="number"> 10</span><span class="p">#2  0x6936fcd1 in shutdown_system_driver () at C:\mingw\LIBS\A5GIT\allegro\src\system.c:77</span>
<span class="number"> 11</span><span class="p">#3  0x69363fe1 in _al_run_exit_funcs () at C:\mingw\LIBS\A5GIT\allegro\src\exitfunc.c:92</span>
<span class="number"> 12</span><span class="p">#4  0x69370015 in al_uninstall_system () at C:\mingw\LIBS\A5GIT\allegro\src\system.c:302</span>
<span class="number"> 13</span><span class="p">#5  0x6ab41086 in __dll_exit () from c:\ctwoplus\progcode\eagle5gui\cbbuild\bin\eagle_a5d.dll</span>
<span class="number"> 14</span><span class="p">#6  0x6ab4110a in DllMainCRTStartup@12 () from c:\ctwoplus\progcode\eagle5gui\cbbuild\bin\eagle_a5d.dll</span>
<span class="number"> 15</span><span class="p">#7  0x778aded4 in ntdll!RtlDefaultNpAcl () from C:\Windows\system32\ntdll.dll</span>
<span class="number"> 16</span><span class="p">#8  0x7789a959 in ntdll!RtlExtendMemoryBlockLookaside () from C:\Windows\system32\ntdll.dll</span>
<span class="number"> 17</span><span class="p">#9  0x7789a8db in ntdll!RtlExtendMemoryBlockLookaside () from C:\Windows\system32\ntdll.dll</span>
<span class="number"> 18</span><span class="p">#10 0x77553d77 in KERNEL32!ExitThread () from C:\Windows\system32\kernel32.dll</span>
<span class="number"> 19</span><span class="p">#11 0x00000000 in ?? ()</span>
<span class="number"> 20</span><span class="k2">(</span>gdb<span class="k2">)</span>
</div></div><p>

Any ideas why this is happening?</p><p>I think it has something to do with my reworked timer class but I don&#39;t know what. I&#39;ve got a thread that runs TimerProcess and communicates with an Allegro5Timer through means of an ALLEGRO_EVENT_QUEUE. States between the TimerProcess and the Allegro5Timer are synchronized using the allegro event queues. When the timer sends a message to the timer process, it waits for a matching return message so that the states are synchronized. I don&#39;t destroy anything twice, I&#39;m sure, and I destroy every ALLEGRO_THREAD, ALLEGRO_TIMER and ALLEGRO_EVENT_QUEUE that I create.</p><p>Here&#39;s the code for Allegro5Timer.cpp if it helps.</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>
<span class="number">   2</span>
<span class="number">   3</span>
<span class="number">   4</span><span class="p">#include "Eagle/backends/Allegro5/Allegro5EventHandler.hpp"</span>
<span class="number">   5</span><span class="p">#include "Eagle/backends/Allegro5/Allegro5Timer.hpp"</span>
<span class="number">   6</span><span class="p">#include "Eagle/backends/Allegro5/Allegro5Threads.hpp"</span>
<span class="number">   7</span>
<span class="number">   8</span>
<span class="number">   9</span>
<span class="number">  10</span>
<span class="number">  11</span><span class="k1">enum</span> EAGLE_TIMER_MESSAGE_TYPE <span class="k2">{</span>
<span class="number">  12</span>   EAGLE_MESSAGE_CREATE_TIMER <span class="k3">=</span> <span class="n">0</span>,
<span class="number">  13</span>   EAGLE_MESSAGE_START_TIMER <span class="k3">=</span> <span class="n">1</span>,
<span class="number">  14</span>   EAGLE_MESSAGE_STOP_TIMER <span class="k3">=</span> <span class="n">2</span>,
<span class="number">  15</span>   EAGLE_MESSAGE_CLOSE_TIMER <span class="k3">=</span> <span class="n">3</span>
<span class="number">  16</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  17</span>
<span class="number">  18</span>
<span class="number">  19</span>
<span class="number">  20</span><span class="k1">void</span><span class="k3">*</span> TimerProcess<span class="k2">(</span>EagleThread<span class="k3">*</span> ethread , <span class="k1">void</span><span class="k3">*</span> etimer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  21</span>   EagleTimer<span class="k3">*</span> eagle_timer <span class="k3">=</span> <span class="k2">(</span>EagleTimer<span class="k3">*</span><span class="k2">)</span>etimer<span class="k2">;</span>
<span class="number">  22</span>   Allegro5Timer<span class="k3">*</span> eagle_a5_timer <span class="k3">=</span> <span class="k1">dynamic_cast</span><span class="k3">&lt;</span>Allegro5Timer<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span>eagle_timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  23</span>   EAGLE_ASSERT<span class="k2">(</span>eagle_a5_timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  24</span>
<span class="number">  25</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span> timer <span class="k3">=</span> eagle_a5_timer-&gt;AllegroTimer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  26</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a><span class="k3">*</span> queue <span class="k3">=</span> eagle_a5_timer-&gt;AllegroEventQueue<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  27</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_SOURCE"><span class="a">ALLEGRO_EVENT_SOURCE</span></a><span class="k3">*</span> event_source <span class="k3">=</span> eagle_a5_timer-&gt;AllegroEventSource<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  28</span>   
<span class="number">  29</span>   EAGLE_ASSERT<span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  30</span>   EAGLE_ASSERT<span class="k2">(</span>queue<span class="k2">)</span><span class="k2">;</span>
<span class="number">  31</span>   EAGLE_ASSERT<span class="k2">(</span>event_source<span class="k2">)</span><span class="k2">;</span>
<span class="number">  32</span>
<span class="number">  33</span>   <span class="k1">int</span> counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  34</span>   <span class="k1">bool</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_104.html" target="_blank">close</a> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  35</span>   <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>ethread-&gt;ShouldStop<span class="k2">(</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_104.html" target="_blank">close</a><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  36</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number">  37</span>      <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>queue , <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number">  38</span>      OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Event "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> ev.type <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  39</span>      <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER <span class="k3">&amp;</span><span class="k3">&amp;</span> ev.timer.source <span class="k3">=</span><span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span><span class="k2">)</span>eagle_a5_timer-&gt;Source<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  40</span>         <span class="k3">+</span><span class="k3">+</span>counter<span class="k2">;</span>
<span class="number">  41</span>         eagle_a5_timer-&gt;Tick<span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  42</span>      <span class="k2">}</span>
<span class="number">  43</span>      <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_USER_START<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  44</span>         <span class="k1">switch</span> <span class="k2">(</span>ev.user.data1<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  45</span>            <span class="k1">case</span> EAGLE_MESSAGE_CREATE_TIMER <span class="k2">:</span>
<span class="number">  46</span>               OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"EAGLE_MESSAGE_CREATE_TIMER received."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  47</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  48</span>            <span class="k1">case</span> EAGLE_MESSAGE_START_TIMER <span class="k2">:</span>
<span class="number">  49</span>               <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  50</span>               OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"EAGLE_MESSAGE_START_TIMER received."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  51</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  52</span>            <span class="k1">case</span> EAGLE_MESSAGE_STOP_TIMER <span class="k2">:</span>
<span class="number">  53</span>               <a href="http://www.allegro.cc/manual/al_stop_timer"><span class="a">al_stop_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  54</span>               OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"EAGLE_MESSAGE_STOP_TIMER received."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  55</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  56</span>            <span class="k1">case</span> EAGLE_MESSAGE_CLOSE_TIMER <span class="k2">:</span>
<span class="number">  57</span>               <a href="http://www.delorie.com/djgpp/doc/libc/libc_104.html" target="_blank">close</a> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  58</span>               OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"EAGLE_MESSAGE_CLOSE_TIMER received."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  59</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  60</span>            <span class="k1">default</span> <span class="k2">:</span> EAGLE_ASSERT<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  62</span>         <span class="k2">}</span>
<span class="number">  63</span>         <a href="http://www.allegro.cc/manual/al_emit_user_event"><span class="a">al_emit_user_event</span></a><span class="k2">(</span>event_source , <span class="k3">&amp;</span>ev , <span class="n">0</span><span class="k2">)</span><span class="k2">;</span><span class="c">// bounce message back to synchronize states</span>
<span class="number">  64</span>      <span class="k2">}</span>
<span class="number">  65</span>   <span class="k2">}</span>
<span class="number">  66</span>   <span class="k1">return</span> <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span>counter<span class="k2">;</span>
<span class="number">  67</span><span class="k2">}</span>
<span class="number">  68</span>
<span class="number">  69</span>
<span class="number">  70</span>
<span class="number">  71</span><span class="k1">void</span> Allegro5Timer::SendTimerProcessMessage<span class="k2">(</span><span class="k1">int</span> message<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  72</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number">  73</span>   ev.type <span class="k3">=</span> EAGLE_EVENT_USER_START<span class="k2">;</span>
<span class="number">  74</span>   ev.user.data1 <span class="k3">=</span> message<span class="k2">;</span>
<span class="number">  75</span>   <a href="http://www.allegro.cc/manual/al_emit_user_event"><span class="a">al_emit_user_event</span></a><span class="k2">(</span><span class="k3">&amp;</span>timer_event_source , <span class="k3">&amp;</span>ev , NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number">  76</span><span class="k2">}</span>
<span class="number">  77</span>
<span class="number">  78</span>
<span class="number">  79</span>
<span class="number">  80</span>Allegro5Timer::Allegro5Timer<span class="k2">(</span><span class="k2">)</span> <span class="k2">:</span>
<span class="number">  81</span>      EagleTimer<span class="k2">(</span><span class="k2">)</span>,
<span class="number">  82</span>      timer<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>,
<span class="number">  83</span>      timer_queue<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>,
<span class="number">  84</span>      process_queue<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>,
<span class="number">  85</span><span class="c">///      queue_lock(0),</span>
<span class="number">  86</span>      timer_event_source<span class="k2">(</span><span class="k2">)</span>,
<span class="number">  87</span>      process_event_source<span class="k2">(</span><span class="k2">)</span>,
<span class="number">  88</span>      ethread<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  89</span><span class="k2">{</span>
<span class="number">  90</span>   <a href="http://www.allegro.cc/manual/al_init_user_event_source"><span class="a">al_init_user_event_source</span></a><span class="k2">(</span><span class="k3">&amp;</span>timer_event_source<span class="k2">)</span><span class="k2">;</span>
<span class="number">  91</span>   <a href="http://www.allegro.cc/manual/al_init_user_event_source"><span class="a">al_init_user_event_source</span></a><span class="k2">(</span><span class="k3">&amp;</span>process_event_source<span class="k2">)</span><span class="k2">;</span>
<span class="number">  92</span><span class="c">//   queue_lock = al_create_mutex();</span>
<span class="number">  93</span><span class="k2">}</span>
<span class="number">  94</span>
<span class="number">  95</span>
<span class="number">  96</span>
<span class="number">  97</span>Allegro5Timer::~Allegro5Timer<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  98</span>   Destroy<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  99</span><span class="c">//   al_destroy_mutex(queue_lock);</span>
<span class="number"> 100</span><span class="c">//   queue_lock = 0;</span>
<span class="number"> 101</span><span class="k2">}</span>
<span class="number"> 102</span>
<span class="number"> 103</span>
<span class="number"> 104</span>
<span class="number"> 105</span><span class="k1">bool</span> Allegro5Timer::Create<span class="k2">(</span><span class="k1">double</span> seconds_per_tick<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 106</span>   EAGLE_ASSERT<span class="k2">(</span>seconds_per_tick <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 107</span>
<span class="number"> 108</span>   Destroy<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 109</span>   
<span class="number"> 110</span>   OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Allegro5Timer::Create this="</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="k1">this</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 111</span>
<span class="number"> 112</span>   timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span>seconds_per_tick<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 113</span>   timer_queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 114</span>   process_queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 115</span>   
<span class="number"> 116</span>   ethread <span class="k3">=</span> <span class="k1">new</span> Allegro5Thread<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 117</span>
<span class="number"> 118</span>   EAGLE_ASSERT<span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 119</span>   EAGLE_ASSERT<span class="k2">(</span>timer_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 120</span>   EAGLE_ASSERT<span class="k2">(</span>process_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</span>
<span class="number"> 122</span>   <span class="k1">if</span> <span class="k2">(</span>timer <span class="k3">&amp;</span><span class="k3">&amp;</span> timer_queue <span class="k3">&amp;</span><span class="k3">&amp;</span> process_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 123</span>      spt <span class="k3">=</span> seconds_per_tick<span class="k2">;</span>
<span class="number"> 124</span>      previous_ticks <span class="k3">=</span> current_ticks <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_timer_count"><span class="a">al_get_timer_count</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 125</span>      <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>process_queue , <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 126</span>      <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>process_queue , <span class="k3">&amp;</span>timer_event_source<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 127</span>      <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>timer_queue , <span class="k3">&amp;</span>process_event_source<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 128</span>      <span class="c">/// MUST create TimerProcess thread AFTER registering event sources or it will wait forever</span>
<span class="number"> 129</span>      ethread-&gt;Create<span class="k2">(</span>TimerProcess , <span class="k1">this</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 130</span>      
<span class="number"> 131</span>      <span class="c">// wait for thread to synchronize</span>
<span class="number"> 132</span>      
<span class="number"> 133</span>      <span class="k1">if</span> <span class="k2">(</span>ethread-&gt;Valid<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 134</span>         ethread-&gt;Start<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 135</span>         
<span class="number"> 136</span>         <span class="c">// send out create message to thread process</span>
<span class="number"> 137</span>         <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number"> 138</span>         ev.type <span class="k3">=</span> EAGLE_EVENT_USER_START<span class="k2">;</span>
<span class="number"> 139</span>         ev.user.data1 <span class="k3">=</span> EAGLE_MESSAGE_CREATE_TIMER<span class="k2">;</span>
<span class="number"> 140</span>         <a href="http://www.allegro.cc/manual/al_emit_user_event"><span class="a">al_emit_user_event</span></a><span class="k2">(</span><span class="k3">&amp;</span>timer_event_source , <span class="k3">&amp;</span>ev , <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 141</span>         
<span class="number"> 142</span>         <span class="c">// wait for return message</span>
<span class="number"> 143</span>         <span class="k1">do</span> <span class="k2">{</span>
<span class="number"> 144</span>            <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>timer_queue , <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 145</span>         <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><span class="k2">(</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_USER_START<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>ev.user.data1 <span class="k3">=</span><span class="k3">=</span> EAGLE_MESSAGE_CREATE_TIMER<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 146</span>      
<span class="number"> 147</span>         <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 148</span>      <span class="k2">}</span>
<span class="number"> 149</span>   <span class="k2">}</span>
<span class="number"> 150</span>
<span class="number"> 151</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>timer_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 152</span>      OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Allegro5Timer::Create - Could not create an Allegro 5 Timer - Couldn't create timer_queue."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 153</span>   <span class="k2">}</span>
<span class="number"> 154</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>process_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 155</span>      OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Allegro5Timer::Create - Could not create an Allegro 5 Timer - Couldn't create process_queue."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 156</span>   <span class="k2">}</span>
<span class="number"> 157</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 158</span>      OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Allegro5Timer::Create - Could not create an Allegro 5 Timer - Couldn't create an ALLEGRO_TIMER."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 159</span>   <span class="k2">}</span>
<span class="number"> 160</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>ethread-&gt;Valid<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 161</span>      OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Allegro5Timer::Create - ethread is not valid."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 162</span>   <span class="k2">}</span>
<span class="number"> 163</span>
<span class="number"> 164</span>   <span class="c">// The queue or the timer failed to be created</span>
<span class="number"> 165</span>   Destroy<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 166</span>   <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 167</span><span class="k2">}</span>
<span class="number"> 168</span>
<span class="number"> 169</span>
<span class="number"> 170</span>
<span class="number"> 171</span><span class="k1">void</span> Allegro5Timer::Destroy<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 172</span>   OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Allegro5Timer::Destroy this="</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="k1">this</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 173</span>   
<span class="number"> 174</span>   Close<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 175</span>   
<span class="number"> 176</span>   <span class="k1">if</span> <span class="k2">(</span>timer_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 177</span>      <a href="http://www.allegro.cc/manual/al_unregister_event_source"><span class="a">al_unregister_event_source</span></a><span class="k2">(</span>timer_queue , <span class="k3">&amp;</span>process_event_source<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 178</span>      <a href="http://www.allegro.cc/manual/al_unregister_event_source"><span class="a">al_unregister_event_source</span></a><span class="k2">(</span>timer_queue , <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 179</span>      <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>timer_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 180</span>      timer_queue <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 181</span>   <span class="k2">}</span>
<span class="number"> 182</span>   <span class="k1">if</span> <span class="k2">(</span>process_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 183</span>      <a href="http://www.allegro.cc/manual/al_unregister_event_source"><span class="a">al_unregister_event_source</span></a><span class="k2">(</span>process_queue , <span class="k3">&amp;</span>timer_event_source<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 184</span>      <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>process_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 185</span>      process_queue <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 186</span>   <span class="k2">}</span>
<span class="number"> 187</span>   <span class="k1">if</span> <span class="k2">(</span>timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 188</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 189</span>      timer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 190</span>   <span class="k2">}</span>
<span class="number"> 191</span>   <span class="k1">if</span> <span class="k2">(</span>ethread<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 192</span>      <span class="k1">delete</span> ethread<span class="k2">;</span>
<span class="number"> 193</span>      ethread <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 194</span>   <span class="k2">}</span>
<span class="number"> 195</span>   spt <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 196</span><span class="k2">}</span>
<span class="number"> 197</span>
<span class="number"> 198</span>
<span class="number"> 199</span>
<span class="number"> 200</span><span class="k1">void</span> Allegro5Timer::Start<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 201</span>   SendTimerProcessMessage<span class="k2">(</span>EAGLE_MESSAGE_START_TIMER<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 202</span>
<span class="number"> 203</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number"> 204</span>   <span class="k1">do</span> <span class="k2">{</span>
<span class="number"> 205</span>      <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>timer_queue , <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 206</span>   <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><span class="k2">(</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_USER_START<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>ev.user.data1 <span class="k3">=</span><span class="k3">=</span> EAGLE_MESSAGE_START_TIMER<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 207</span><span class="k2">}</span>
<span class="number"> 208</span>
<span class="number"> 209</span>
<span class="number"> 210</span>
<span class="number"> 211</span><span class="k1">void</span> Allegro5Timer::Stop<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 212</span>   SendTimerProcessMessage<span class="k2">(</span>EAGLE_MESSAGE_STOP_TIMER<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 213</span>
<span class="number"> 214</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number"> 215</span>   <span class="k1">do</span> <span class="k2">{</span>
<span class="number"> 216</span>      <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>timer_queue , <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 217</span>   <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><span class="k2">(</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_USER_START<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>ev.user.data1 <span class="k3">=</span><span class="k3">=</span> EAGLE_MESSAGE_STOP_TIMER<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 218</span><span class="k2">}</span>
<span class="number"> 219</span>
<span class="number"> 220</span>
<span class="number"> 221</span>
<span class="number"> 222</span><span class="k1">void</span> Allegro5Timer::Close<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 223</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>ethread <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>ethread <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>ethread-&gt;Running<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span><span class="k2">;</span><span class="k2">}</span>
<span class="number"> 224</span>   
<span class="number"> 225</span>   SendTimerProcessMessage<span class="k2">(</span>EAGLE_MESSAGE_CLOSE_TIMER<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 226</span>
<span class="number"> 227</span>   <span class="c">// wait for message to be bounced back</span>
<span class="number"> 228</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number"> 229</span>   <span class="k1">do</span> <span class="k2">{</span>
<span class="number"> 230</span>      <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>timer_queue , <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 231</span>   <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><span class="k2">(</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_USER_START<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>ev.user.data1 <span class="k3">=</span><span class="k3">=</span> EAGLE_MESSAGE_CLOSE_TIMER<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 232</span>   
<span class="number"> 233</span>   ethread-&gt;Join<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 234</span><span class="k2">}</span>
<span class="number"> 235</span>
<span class="number"> 236</span>
<span class="number"> 237</span>
<span class="number"> 238</span><span class="k1">void</span> Allegro5Timer::WaitForTick<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 239</span>   <span class="k1">if</span> <span class="k2">(</span>timer_queue <span class="k3">&amp;</span><span class="k3">&amp;</span> timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 240</span>      <span class="k1">do</span> <span class="k2">{</span>
<span class="number"> 241</span>         <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> e<span class="k2">;</span>
<span class="number"> 242</span>         <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>timer_queue , <span class="k3">&amp;</span>e<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 243</span>         <span class="k1">if</span> <span class="k2">(</span>e.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 244</span>            Tick<span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 245</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 246</span>         <span class="k2">}</span>
<span class="number"> 247</span>      <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 248</span>   <span class="k2">}</span>
<span class="number"> 249</span>   <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 250</span><span class="k2">}</span>
<span class="number"> 251</span>
<span class="number"> 252</span>
<span class="number"> 253</span>
<span class="number"> 254</span><span class="k1">void</span><span class="k3">*</span> Allegro5Timer::Source<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 255</span>   <span class="k1">return</span> timer<span class="k2">;</span>
<span class="number"> 256</span><span class="k2">}</span>
<span class="number"> 257</span>
<span class="number"> 258</span>
<span class="number"> 259</span>
<span class="number"> 260</span><span class="k1">void</span> Allegro5Timer::RefreshTimer<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 261</span>   <span class="k1">if</span> <span class="k2">(</span>timer_queue <span class="k3">&amp;</span><span class="k3">&amp;</span> timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 262</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number"> 263</span>      <span class="k1">while</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_next_event"><span class="a">al_get_next_event</span></a><span class="k2">(</span>timer_queue , <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 264</span>         <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 265</span>            Tick<span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 266</span>         <span class="k2">}</span>
<span class="number"> 267</span>      <span class="k2">}</span>
<span class="number"> 268</span>   <span class="k2">}</span>
<span class="number"> 269</span><span class="k2">}</span>
<span class="number"> 270</span>
<span class="number"> 271</span>
<span class="number"> 272</span>
<span class="number"> 273</span><span class="k1">bool</span> Allegro5Timer::Valid<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 274</span>   <span class="k1">return</span> timer <span class="k3">&amp;</span><span class="k3">&amp;</span> timer_queue <span class="k3">&amp;</span><span class="k3">&amp;</span> process_queue <span class="k3">&amp;</span><span class="k3">&amp;</span> ethread-&gt;Valid<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 275</span><span class="k2">}</span>
<span class="number"> 276</span>
<span class="number"> 277</span>
<span class="number"> 278</span>
<span class="number"> 279</span><span class="k1">long</span> <span class="k1">long</span> <span class="k1">int</span> Allegro5Timer::Count<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 280</span>   <span class="k1">if</span> <span class="k2">(</span>timer<span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <a href="http://www.allegro.cc/manual/al_get_timer_count"><span class="a">al_get_timer_count</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span><span class="k2">}</span>
<span class="number"> 281</span>   <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 282</span><span class="k2">}</span>
<span class="number"> 283</span>
<span class="number"> 284</span>
<span class="number"> 285</span>
<span class="number"> 286</span><span class="k1">void</span> Allegro5Timer::RegisterTimerInput<span class="k2">(</span>EagleEventHandler<span class="k3">*</span> event_handler<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 287</span><span class="c">/*</span>
<span class="number"> 288</span><span class="c">   EAGLE_ASSERT(event_handler);</span>
<span class="number"> 289</span><span class="c">   Allegro5EventHandler* a5_event_handler = dynamic_cast&lt;Allegro5EventHandler*&gt;(event_handler);</span>
<span class="number"> 290</span><span class="c">   EAGLE_ASSERT(allegro_handler);</span>
<span class="number"> 291</span><span class="c"></span>
<span class="number"> 292</span><span class="c">   ALLEGRO_EVENT_QUEUE* allegro_queue = a5_event_handler-&gt;AllegroQueue();</span>
<span class="number"> 293</span><span class="c">   EAGLE_ASSERT(allegro_queue);</span>
<span class="number"> 294</span><span class="c">   al_register_event_source(allegro_queue , al_get_timer_event_source(timer));</span>
<span class="number"> 295</span><span class="c">*/</span>
<span class="number"> 296</span>   <span class="c">// so we don't have timers registered to queues and eagle timers registered as event sources at the same time</span>
<span class="number"> 297</span>   SubscribeListener<span class="k2">(</span>event_handler<span class="k2">)</span><span class="k2">;</span><span class="c">/// TODO Convert to an event source</span>
<span class="number"> 298</span><span class="k2">}</span>
</div></div><p>

And here&#39;s my main function :
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> ThreadingTestMain<span class="k2">(</span><span class="k1">int</span> argc , <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<span class="k2">)</span> <span class="k2">{</span>
   
   <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>argc<span class="k2">;</span>
   <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>argv<span class="k2">;</span>

   Allegro5System sys<span class="k2">;</span>
   sys.InitializeSystem<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

The sys constructor just initializes everything to zero, and here&#39;s the code for InitializeSystem :
</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>
<span class="number">  2</span><span class="k1">bool</span> EagleSystem::InitializeSystem<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  3</span>   system_up <span class="k3">=</span> PrivateInitializeSystem<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>system_up<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  5</span>      OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Eagle : Failed to initialize the system."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  6</span>   <span class="k2">}</span>
<span class="number">  7</span>   <span class="k1">else</span> <span class="k2">{</span>
<span class="number">  8</span>      OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Eagle : Initialized system."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  9</span>   <span class="k2">}</span>
<span class="number"> 10</span>   
<span class="number"> 11</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>input_handler<span class="k2">)</span> <span class="k2">{</span>input_handler <span class="k3">=</span> CreateInputHandler<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span>
<span class="number"> 12</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>system_timer<span class="k2">)</span>  <span class="k2">{</span>system_timer  <span class="k3">=</span> CreateTimer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span>
<span class="number"> 13</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>system_queue<span class="k2">)</span>  <span class="k2">{</span>system_queue  <span class="k3">=</span> CreateEventHandler<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span>
<span class="number"> 14</span>
<span class="number"> 15</span>   system_up <span class="k3">=</span> <span class="k2">(</span>system_up <span class="k3">&amp;</span><span class="k3">&amp;</span> input_handler <span class="k3">&amp;</span><span class="k3">&amp;</span> system_timer <span class="k3">&amp;</span><span class="k3">&amp;</span> system_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>   
<span class="number"> 17</span>   <span class="k1">if</span> <span class="k2">(</span>system_timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 18</span>      <span class="k1">bool</span> created_system_timer <span class="k3">=</span> system_timer-&gt;Create<span class="k2">(</span>system_timer_rate<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>      system_up <span class="k3">=</span> system_up <span class="k3">&amp;</span><span class="k3">&amp;</span> created_system_timer<span class="k2">;</span>
<span class="number"> 20</span>      <span class="k1">if</span> <span class="k2">(</span>created_system_timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 21</span>         SetInputTimer<span class="k2">(</span>system_timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>         <span class="k1">if</span> <span class="k2">(</span>system_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 23</span>            system_timer-&gt;RegisterTimerInput<span class="k2">(</span>system_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>         <span class="k2">}</span>
<span class="number"> 25</span>      <span class="k2">}</span>
<span class="number"> 26</span>   <span class="k2">}</span>
<span class="number"> 27</span>   
<span class="number"> 28</span>   <span class="k1">if</span> <span class="k2">(</span>system_up<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 29</span>      OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Eagle : Initialized the system state."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 30</span>   <span class="k2">}</span>
<span class="number"> 31</span>   <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 32</span>      OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Eagle : System state not fully initialized."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 33</span>   <span class="k2">}</span>
<span class="number"> 34</span>   
<span class="number"> 35</span>   <span class="k1">return</span> system_up<span class="k2">;</span>
<span class="number"> 36</span><span class="k2">}</span>
</div></div><p>

So, my system creates a system timer, calls Create on it to create it, and then it gets destroyed by the destructor. Just simple code to test things right now.</p><p>I don&#39;t see what I&#39;m doing to cause a crash in d3d_shutdown. Ideas?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 13 Oct 2013 11:19:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What&#39;s EagleThread? Are maybe using an Allegro function on a thread not created by it?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Sun, 13 Oct 2013 12:30:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>EagleThread is just a small wrapper around an ALLEGRO_THREAD. Allegro5Timer::Create new&#39;s an Allegro5Thread (the wrapper class) and calls Create on it to create a new thread. If it is successful, the thread is started and synchronized by message. The ALLEGRO_THREAD is destroyed in the destructor of Allegro5Thread, which is called by Allegro5Timer::Destroy after the thread has been joined.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/613372/991310#target">Elias</a> said:</div><div class="quote"><p>Are maybe using an Allegro function on a thread not created by it?</p></div></div><p>
No, all I use are ALLEGRO_THREADS at this point. If I write a driver for a different backend I might have to use pthreads, I don&#39;t know.</p><p>I don&#39;t understand, because all I do is initialize allegro and all the addons, then create a timer which uses an ALLEGRO_THREAD to monitor the ALLEGRO_EVENT_QUEUE that has subscribed to my ALLEGRO_TIMER. I initialize some resources, and then I shut down.</p><p>Where do you think the crash is coming from? A double free? On my part? On Allegro&#39;s part?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 13 Oct 2013 22:05:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Does it also happen if you use a separate allegro.DLL instead of linking it in?</p><p>And just guessing at causes here...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Mon, 14 Oct 2013 01:39:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m currently linking dynamically to allegro, and to my library and to my backend. I built the static debug versions of them and tried it, and results were exactly the same.</p><p>Back in 5.0.0RC1 there was a crash in d3d_shutdown that was similar but I don&#39;t know if it was ever solved :<br /><a href="https://www.allegro.cc/forums/thread/605549/892332#target">https://www.allegro.cc/forums/thread/605549/892332#target</a></p><p>I varied my code according to some ideas in that thread, and it still crashes in the same place.</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>
<span class="number">  2</span><span class="k1">int</span> ThreadingTestMain<span class="k2">(</span><span class="k1">int</span> argc , <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  3</span>   
<span class="number">  4</span>   <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>argc<span class="k2">;</span>
<span class="number">  5</span>   <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>argv<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>   Allegro5System<span class="k3">*</span> sys <span class="k3">=</span> <span class="k1">new</span> Allegro5System<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>   
<span class="number">  9</span>   sys-&gt;InitializeSystem<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>   
<span class="number"> 11</span>   <span class="k1">delete</span> sys<span class="k2">;</span>
<span class="number"> 12</span>   
<span class="number"> 13</span>   <a href="http://www.allegro.cc/manual/al_uninstall_system"><span class="a">al_uninstall_system</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>   
<span class="number"> 15</span>   Sleep<span class="k2">(</span><span class="n">3000</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>   
<span class="number"> 17</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 18</span><span class="k2">}</span>
</div></div><p>

Funny thing is, it doesn&#39;t crash during the manual call to al_uninstall_system but it does crash in al_uninstall_system when the exit routines run.</p><pre>
Program received signal SIGSEGV, Segmentation fault.
0x693df8b7 in d3d_shutdown () at C:\mingw\LIBS\A5GIT\allegro\src\win\d3d_disp.cpp:2604
2604       _al_d3d-&gt;Release();
(gdb) bt
#0  0x693df8b7 in d3d_shutdown () at C:\mingw\LIBS\A5GIT\allegro\src\win\d3d_disp.cpp:2604
#1  0x693cfa88 in win_shutdown () at C:\mingw\LIBS\A5GIT\allegro\src\win\wsystem.c:197
#2  0x6936fcd1 in shutdown_system_driver () at C:\mingw\LIBS\A5GIT\allegro\src\system.c:77
#3  0x69363fe1 in _al_run_exit_funcs () at C:\mingw\LIBS\A5GIT\allegro\src\exitfunc.c:92
#4  0x69370015 in al_uninstall_system () at C:\mingw\LIBS\A5GIT\allegro\src\system.c:302
#5  0x6ab41086 in __dll_exit () from c:\ctwoplus\progcode\eagle5gui\cbbuild\bin\eagle_a5d.dll
#6  0x6ab4110a in DllMainCRTStartup@12 () from c:\ctwoplus\progcode\eagle5gui\cbbuild\bin\eagle_a5d.dll
#7  0x77aaded4 in ntdll!RtlDefaultNpAcl () from C:\Windows\system32\ntdll.dll
#8  0x77a9a959 in ntdll!RtlExtendMemoryBlockLookaside () from C:\Windows\system32\ntdll.dll
#9  0x77a9a8db in ntdll!RtlExtendMemoryBlockLookaside () from C:\Windows\system32\ntdll.dll
#10 0x76933d77 in KERNEL32!ExitThread () from C:\Windows\system32\kernel32.dll
#11 0x00000000 in ?? ()
(gdb)
</pre><p>

<b><u>Edit</u></b></p><p>This does not crash :
</p><div class="source-code snippet"><div class="inner"><pre>   Allegro5System<span class="k3">*</span> sys <span class="k3">=</span> <span class="k1">new</span> Allegro5System<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   <span class="k1">delete</span> sys<span class="k2">;</span>
</pre></div></div><p>

This crashes :
</p><div class="source-code snippet"><div class="inner"><pre>   Allegro5System<span class="k3">*</span> sys <span class="k3">=</span> <span class="k1">new</span> Allegro5System<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   sys-&gt;InitializeSystem<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   <span class="k1">delete</span> sys<span class="k2">;</span>
</pre></div></div><p>

This does not crash :
</p><div class="source-code snippet"><div class="inner"><pre>   Allegro5System<span class="k3">*</span> sys <span class="k3">=</span> <span class="k1">new</span> Allegro5System<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   sys-&gt;InitializeSystem<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   <span class="k1">delete</span> sys<span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/al_uninstall_system"><span class="a">al_uninstall_system</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

And now, this does not crash anymore when it did before :
</p><div class="source-code snippet"><div class="inner"><pre>   Allegro5System<span class="k3">*</span> sys <span class="k3">=</span> <span class="k1">new</span> Allegro5System<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   sys-&gt;InitializeSystem<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   <span class="k1">delete</span> sys<span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/al_uninstall_system"><span class="a">al_uninstall_system</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   Sleep<span class="k2">(</span><span class="n">3000</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Anyone have any ideas how I should go about debugging this? I&#39;ve already been down into every single code branch that InitializeSystem goes into, and I haven&#39;t seen anything wrong.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 14 Oct 2013 11:22:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m really hesitant to say anything here, because I don&#39;t know what&#39;s wrong and don&#39;t have much time to give any REAL help... but the first thing that comes to mind is unfreed D3D resources like shaders or VBOs or... anything like that?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Mon, 14 Oct 2013 11:27:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The only D3D or DX I&#39;m using is whatever Allegro is using behind the scenes. </p><p>Why is D3D running when I haven&#39;t even opened a display yet?</p><p>I just tried ripping the guts out of EagleSystem::InitializeSystem and putting them in main and I can&#39;t reproduce the crash, even while executing pretty much the same code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 14 Oct 2013 12:06:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Probably not related (different platform for one), but a problem I ran into recently was that my program would crash when the main display was destroyed. This turned out to be due to destroying the parent bitmap, but not all of the child bitmaps. When the display was destroyed at the end of the program Allegro would try to turn these into memory bitmaps - and crash because the parent bitmap had already been destroyed.</p><p>Took me a while to find that one, so check if you might have a similar issue. Also, if you haven&#39;t already, try the OpenGL driver. If that works fine it may be a hint with the D3D driver, otherwise it&#39;s either something in your code, or at a higher level but within Allegro itself.</p><p>On Linux I find Valgrind a great help in situations like this, but I guess it isn&#39;t available for Windows?</p><p>EDIT: although, if the crash also happens with the OpenGL driver it may be reproducible on Linux...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Mon, 14 Oct 2013 13:20:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I wasn&#39;t even creating a display though. All I was calling was al_init(). Then create some allegro stuff and then destroy it all and shutdown allegro.</p><p>I could try changing the order I destroy things in and see if that helps. I thought all event sources unsubscribed themselves upon destruction, but maybe they don&#39;t. Well no al_destroy_event_queue says it auto de-registers. So I don&#39;t know why that would be it. Maybe my thread is still running but I join it in the destructor so it shouldn&#39;t be.</p><p>I really don&#39;t have any other idea what it might be.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 15 Oct 2013 01:09:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s either a really strange bug in allegro and/or windows or some kind of memory bug in your own code (this is usually the cause of strange crash bugs like this). Potentially a double free, or something is being corrupted.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 15 Oct 2013 02:10:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You still didn&#39;t tell us if the problem persists when you use opengl.<br />Anyway, you might actually have heap corruption, as Thomas pointed out. Try using crt heap checking functions.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Aikei_c)</author>
		<pubDate>Tue, 15 Oct 2013 02:34:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I said, I don&#39;t even create a display. I can&#39;t choose al_init(OPEN_GL). Do you mean you want me to create a display with OPEN_GL?</p><p>Heap corruption? I can look again I suppose. What are these crt heap checking functions you are talking about?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 15 Oct 2013 02:44:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think you can still change the &quot;new&quot; display driver.</p><p>I do find it odd that its trying to call any d3d &quot;disp&quot; code at all without any displays being created.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 15 Oct 2013 02:55:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That is probably not the most efficient way to check for heap corruption, however, I do the follwing.<br />First, you need to do this in the beginning of your program, better yet in the precompiled header:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#define CRTDBG_MAP_ALLOC</span>
<span class="p">#include &lt;stdlib.h&gt;</span>
<span class="p">#include &lt;crtdbg.h&gt;</span>
</pre></div></div><p>

Then you place somewhere this line:
</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>_CrtCheckMemory<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

If your heap is already corrupted at this point, it should break there. If it doesn&#39;t break at this assert, then put it further down your program. If it breaks at this assert, place your assert closer to the beginning of your program, and so on until you find the offending line.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Aikei_c)</author>
		<pubDate>Tue, 15 Oct 2013 03:07:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sorry, but MinGW 4.5.0 doesn&#39;t come with crtdbg.h or any other header with _CrtCheckMemory in it. Otherwise I would do it. They are specific to MSVC++, which I have installed, but I have never used it, and it would take me a long time to get my libraries set up with a solution. Also, MSVC++ wants me to register, and when I go to obtain a registration code, I am greeted with a Microsoft login. Yet another account to create.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 15 Oct 2013 18:42:36 +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/613372/991354#target">Edgar Reynaldo</a> said:</div><div class="quote"><p> Also, MSVC++ wants me to register, and when I go to obtain a registration code, I am greeted with a Microsoft login. Yet another account to create.</p></div></div><p>I googled for a code without the intrusiveness.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Tue, 15 Oct 2013 19:06:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t see why it&#39;s impossible to use crt function in gcc, since they are all part of msvcrt.dll which every windows user should have (with proper linking and headers). Anyway, I never used mingw, but there should be something specific to gcc/mingw or whatever, which can check if the heap is corrupted.<br />Maybe this question on stackoverflow can help you:<br /><a href="http://stackoverflow.com/questions/1761125/gcc-memory-leak-detection-equivalent-to-microsoft-crtdbg-h/1761159">http://stackoverflow.com/questions/1761125/gcc-memory-leak-detection-equivalent-to-microsoft-crtdbg-h/1761159</a><br />EDIT: However, memory leaks which most of them seem to be talking about is not the same as heap corruption.<br />I still think that on windows you should somehow use windows crt functions and not linux-specific stuff which might actually never work on windows.<br />Ypu can also try to detect the offending code by shortening your program. Create the shortest possible example of your program which causes your problem. Like, try to replace your own timer with the standard allegro one, etc.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Aikei_c)</author>
		<pubDate>Tue, 15 Oct 2013 22:06:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t think it would be that easy to link the Microsoft C Runtime DLL to a GCC-compiled program since GCC provides it&#39;s own C runtime....no? <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /></p><p>Anyway Edgar, I don&#39;t have anythig REALLY useful here to say, but maybe are you able to reprodice the crash w/o Eagle related code?</p><p>Otherwise I&#39;d definitely triple-check your Initialise System routines, particularly the Input and Event Handler (which sources are you registering there?)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (pkrcel)</author>
		<pubDate>Wed, 16 Oct 2013 00:05:59 +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/613372/991364#target">pkrcel</a> said:</div><div class="quote"><p>I don&#39;t think it would be that easy to link the Microsoft C Runtime DLL to a GCC-compiled program since GCC provides it&#39;s own C runtime....no? <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /></p></div></div><p>Nope. MingW&#39;s entire purpose is to be a GCC that uses msvcrt.dll. Otherwise you get stuck with Cygwin and all of its nonsense.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Wed, 16 Oct 2013 00:10:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ah of course that makes sense....so is it possible to import _CrtCheckMemory()?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (pkrcel)</author>
		<pubDate>Wed, 16 Oct 2013 00:19:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It probably is. You&#39;d probably need to find the MSVC declaration and copy it into a gcc compatible format.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Wed, 16 Oct 2013 00:23:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Cool, should look into it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (pkrcel)</author>
		<pubDate>Wed, 16 Oct 2013 00:38:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you can post a complete program that shows the problem I can try compiling it in Linux and run it through valgrind. If there is something in your code it may show up there.</p><p>Cross platform develpmnt is a great way to find bugs.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Wed, 16 Oct 2013 02:29:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>



Well, here is exactly what EagleSystem::InitializeSystem does :
</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>
<span class="number">  2</span><span class="k1">int</span> ThreadingTestMain<span class="k2">(</span><span class="k1">int</span> argc , <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  3</span>   
<span class="number">  4</span>   <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>argc<span class="k2">;</span>
<span class="number">  5</span>   <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>argv<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span><span class="k2">}</span>
<span class="number">  8</span>
<span class="number">  9</span>   EagleInputHandler<span class="k3">*</span> input <span class="k3">=</span> <span class="k1">new</span> Allegro5InputHandler<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>   EagleTimer<span class="k3">*</span> timer <span class="k3">=</span> <span class="k1">new</span> Allegro5Timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>   EagleEventHandler<span class="k3">*</span> queue <span class="k3">=</span> <span class="k1">new</span> Allegro5EventHandler<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>   
<span class="number"> 13</span>   <span class="k1">if</span> <span class="k2">(</span>timer-&gt;Create<span class="k2">(</span><span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 14</span>      OutputLog<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Timer created"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 15</span>      SetInputTimer<span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>      timer-&gt;RegisterTimerInput<span class="k2">(</span>queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>      timer-&gt;Start<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>      <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">5</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>   <span class="k2">}</span>
<span class="number"> 20</span>   <span class="k1">delete</span> timer<span class="k2">;</span>
<span class="number"> 21</span>   <span class="k1">delete</span> input<span class="k2">;</span>
<span class="number"> 22</span>   <span class="k1">delete</span> queue<span class="k2">;</span>
<span class="number"> 23</span>   
<span class="number"> 24</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 25</span><span class="k2">}</span>
</div></div><p>

and that doesn&#39;t crash at all. :/</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/613372/991360#target">Aikei_c</a> said:</div><div class="quote"><p>
Create the shortest possible example of your program which causes your problem. Like, try to replace your own timer with the standard allegro one, etc.
</p></div></div><p>
Created separately none of my objects have problems. The code above is exactly what the line <span class="source-code">sys-&gt;InitializeSystem<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></span> does.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/613372/991364#target">pkrcel</a> said:</div><div class="quote"><p>
but maybe are you able to reprodice the crash w/o Eagle related code?
</p></div></div><p>
No, I haven&#39;t been able to.</p><div class="quote_container"><div class="title">pkrcel said:</div><div class="quote"><p>
Otherwise I&#39;d definitely triple-check your Initialise System routines, particularly the Input and Event Handler (which sources are you registering there?)
</p></div></div><p>
I have and I don&#39;t see anything wrong. No double frees, no leaks. I register the timer output with the event queue.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/613372/991375#target">Evert</a> said:</div><div class="quote"><p>
If you can post a complete program that shows the problem I can try compiling it in Linux and run it through valgrind. If there is something in your code it may show up there.
</p></div></div><p>
Thanks, but you would have to build my library and my allegro 5 backend to do so. I think I will migrate to building in my OpenSUSE VM so I can look for problems. And then I will create some CodeBlocks projects to build on Linux.</p><div class="quote_container"><div class="title">Evert said:</div><div class="quote"><p>
Cross platform development is a great way to find bugs.
</p></div></div><p>
I will try it out.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 16 Oct 2013 22:52:14 +0000</pubDate>
	</item>
</rss>
