<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Intro to threading and cpu free waiting for signals</title>
		<link>http://www.allegro.cc/forums/view/613326</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 10 Oct 2013 02:56:38 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I need a way to wait in another thread for allegro&#39;s event queue to pop up with a timer event without disturbing the main thread but also at the same time being able to wake the main thread up if it receives an event.</p><p>Can anyone give me a simple walkthrough of how these things are done? Do I need allegro&#39;s threads, do I need mutexes (I&#39;m guessing I probably do)?, do I need pthreads, or what? I think pthreads had something like a &#39;wait for signal&#39; function but I can&#39;t remember what it was called now.</p><p>Anybody have some knowledge to share about these things?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 01 Oct 2013 10:48:29 +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/613326/990780#target">Edgar Reynaldo</a> said:</div><div class="quote"><p> I need a way to wait in another thread for allegro&#39;s event queue to pop up with a timer event without disturbing the main thread but also at the same time being able to wake the main thread up if it receives an event.</p></div></div><p>I was under the impression that&#39;s what the message loop did by default, as long as there was an al_wait_for_event() to cause it to idle when no events occurred.  I assume you want the main thread to sleep, since you specify &quot;wake the main thread up&quot;.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Tue, 01 Oct 2013 10:58:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think you might want to use 2 event queues, one for each thread.<br />If the main thread needs to be woken up by your second thread, let the second thread send a message on the main thread&#39;s queue and the main thread will wake up. The second thread can listen for events on its own without having to disturb the main thread.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (l j)</author>
		<pubDate>Tue, 01 Oct 2013 11:36:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yup, just send messages back and forth.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 01 Oct 2013 16:32:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Maybe I didn&#39;t explain well. I&#39;m trying to implement my own event sources and I need the timer thread to sleep until the timer goes off, and then emit the timer event. As it is now I have to poll for the timer event in al_wait_for_event, but I want it asynchronous so I can just add the timer events to a message queue w/o disturbing the main thread.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 01 Oct 2013 19:51:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That sounds less clear than your first question...</p><p>any thread can setup an event queue, and event sources, including timers. They can then wait on that queue.</p><p>Any thread can add events to a queue, which will only wake up other threads that are `al_wait_for_event`ing on that queue.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/613326/990797#target">Edgar Reynaldo</a> said:</div><div class="quote"><p> As it is now I have to poll for the timer event in al_wait_for_event</p></div></div><p>`al_wait_for_event` actually sleeps. It does not poll.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 01 Oct 2013 19:58:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m trying to accomplish what allegro does with its event queues, that is it wakes up the thread when the signal goes off.</p><p>Maybe I have to post example code to show what I mean. I&#39;m not at home though so can&#39;t post it atm.</p><p>I have a timer class. I am trying to decide whether to make it an eagle event source or to have my event handler subscribe allegro&#39;s timer event source to its queue. If I make my timer an event source then I need to emit an event whenever the timer goes off. That means I have to call al_wait_for_event (and use up one thread) to poll for the timer event using the private allegro event queue and timer. That&#39;s what I meant by polling.</p><p>So I want to create a thread that will call al_wait_for_event to wait for a timer. I want that thread to access an event queue and post messages to it, what I call an event handler. So do I need a mutex to protect the queue while I am asynchronously adding an event to it? Does allegro&#39;s event queues use mutexes?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 01 Oct 2013 21:17:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Event queues are thread safe. You don&#39;t need to worry about locking around them afaik.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 01 Oct 2013 21:22:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No, do I need a mutex for my eagle event queues, not for an allegro event queue.</p><p>I want one thread to wait on the timer, and then emit events whenever it goes off. However the event queue I want it to post messages to is on a different thread, hence the question about the mutex. I don&#39;t want to access the event queue at the same time I am adding an event to it. Do I need a mutex to keep my eagle event queues thread safe?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 01 Oct 2013 21:30:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh, it depends on how you implemented your event queues. You can implement lockless queue algorithms, but I&#39;m doubting you did so. so yes, you probably do want locking around access to your queue&#39;s internals.</p><p>There are also other locking primitives you could use, like condvars or semaphores.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 01 Oct 2013 21:38:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sounds a bit like you&#39;re reinventing the square wheel that is Allegro&#39;s event queue. Is there a reason that you can&#39;t just use Allegro&#39;s event queues as suggested?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Tue, 01 Oct 2013 23:51:11 +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/613326/990814#target">bamccaig</a> said:</div><div class="quote"><p> Sounds a bit like you&#39;re reinventing the square wheel that is Allegro&#39;s event queue. Is there a reason that you can&#39;t just use Allegro&#39;s event queues as suggested? </p></div></div><p>I believe his library is supposed to support multiple back-ends and I think he doesn&#39;t want the core to have to rely on allegro.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (l j)</author>
		<pubDate>Wed, 02 Oct 2013 00:13:38 +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/613326/990814#target">bamccaig</a> said:</div><div class="quote"><p>
Sounds a bit like you&#39;re reinventing the square wheel that is Allegro&#39;s event queue. Is there a reason that you can&#39;t just use Allegro&#39;s event queues as suggested?
</p></div></div><p>
Well actually yes I am a little bit. I just need mostly the same functionality with a small wrapper over it for abstraction and portabilities sake. I need my Timer class to be an event source but I don&#39;t want to poll for things. I want to post an event right away. Which means I need another thread to work alongside the main one, so I suppose I should wrap a Thread too. It&#39;s just adding another link in the chain of signals I guess. No biggie.</p><div class="quote_container"><div class="title">taron said:</div><div class="quote"><p>
I believe his library is supposed to support multiple back-ends and I think he doesn&#39;t want the core to have to rely on allegro.
</p></div></div><p>
You are correct sir.</p><p>You can look up my latest code on sourceforge through svn :
</p><pre>svn checkout &quot;<a>svn://svn.code.sf.net/p/eagle5gui/code/trunk</a> eagle5gui-code&quot;</pre><p>

or just the url (click on copy link location)<br /><a>svn://svn.code.sf.net/p/eagle5gui/code/trunk eagle5gui-code</a></p><p>It&#39;s building now and I&#39;m working on tests to make sure everything works. Adventurous souls welcome, but the only docs I have are the headers.</p><p>There is a simple example program that displays your input and the frames per second. The build system is currently CB Projects, so you would have to adjust your linking and search directories to match whatever version of A5 you have installed.</p><p>I think what I need are semaphores.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 04 Oct 2013 10:51:02 +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/613326/991007#target">Edgar Reynaldo</a> said:</div><div class="quote"><p> I think what I need are semaphores. </p></div></div><p>AFAIK, semaphores might not work, what if each CPU has differing values in their respective caches?  Of course, if you <i>accessed</i> this semaphore only through a mutex, it&#39;d work.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Fri, 04 Oct 2013 10:55:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What do you mean, semaphores might not work? They&#39;re not reliable ways to sleep and wake up a thread?</p><p>Forgot to post example code :
</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="p">#include "RecordInputTestMain.hpp"</span>
<span class="number">   4</span>
<span class="number">   5</span><span class="p">#include "Eagle/backends/Allegro5Backend.hpp"</span>
<span class="number">   6</span>
<span class="number">   7</span><span class="p">#include &lt;sstream&gt;</span>
<span class="number">   8</span><span class="k1">using</span> std::ostringstream<span class="k2">;</span>
<span class="number">   9</span><span class="p">#include &lt;string&gt;</span>
<span class="number">  10</span><span class="k1">using</span> std::string<span class="k2">;</span>
<span class="number">  11</span>
<span class="number">  12</span><span class="k1">int</span> RecordInputTestMain<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">  13</span>   
<span class="number">  14</span><span class="c">//   if (!SendOutputToFile("RecordInputTestMain.txt" , "Record input test\n\n" , false)) {return 1;}</span>
<span class="number">  15</span>
<span class="number">  16</span>   Allegro5System sys<span class="k2">;</span>
<span class="number">  17</span>   
<span class="number">  18</span>   <span class="k1">int</span> start_state <span class="k3">=</span> EAGLE_FULL_SETUP<span class="k2">;</span>
<span class="number">  19</span>   <span class="k1">if</span> <span class="k2">(</span>sys.Initialize<span class="k2">(</span>start_state<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> start_state<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  20</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  21</span>   <span class="k2">}</span>
<span class="number">  22</span>
<span class="number">  23</span>   <span class="k1">int</span> SCREEN_WIDTH <span class="k3">=</span> <span class="n">800</span><span class="k2">;</span>
<span class="number">  24</span>   <span class="k1">int</span> SCREEN_HEIGHT <span class="k3">=</span> <span class="n">600</span><span class="k2">;</span>
<span class="number">  25</span>   EagleGraphicsContext<span class="k3">*</span> win <span class="k3">=</span> sys.CreateGraphicsContext<span class="k2">(</span>SCREEN_WIDTH , SCREEN_HEIGHT , EAGLE_WINDOWED <span class="k3">|</span> EAGLE_OPENGL<span class="k2">)</span><span class="k2">;</span>
<span class="number">  26</span>   
<span class="number">  27</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>win-&gt;Valid<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  28</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">2</span><span class="k2">;</span>
<span class="number">  29</span>   <span class="k2">}</span>
<span class="number">  30</span>   
<span class="number">  31</span>   EagleFont<span class="k3">*</span> font40 <span class="k3">=</span> win-&gt;LoadFont<span class="k2">(</span><span class="s">"Data/fonts/verdana.ttf"</span> , <span class="n">40</span> , <span class="n">0</span> , VIDEO_IMAGE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  32</span>   EagleFont<span class="k3">*</span> font20 <span class="k3">=</span> win-&gt;LoadFont<span class="k2">(</span><span class="s">"Data/fonts/verdana.ttf"</span> , <span class="n">20</span> , <span class="n">0</span> , VIDEO_IMAGE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  33</span>   
<span class="number">  34</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>font40-&gt;Valid<span class="k2">(</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k3">!</span>font20-&gt;Valid<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  35</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">3</span><span class="k2">;</span>
<span class="number">  36</span>   <span class="k2">}</span>
<span class="number">  37</span>
<span class="number">  38</span>   <span class="k1">int</span> count <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  39</span>   <span class="k1">int</span> scount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  40</span>   <span class="k1">bool</span> quit <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  41</span>   <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  42</span>   <span class="k1">int</span> fps <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  43</span>   <span class="k1">int</span> framecount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  44</span>
<span class="number">  45</span>   Input press<span class="k2">;</span>
<span class="number">  46</span>   Input held<span class="k2">;</span>
<span class="number">  47</span>   InputGroup ig<span class="k2">;</span>
<span class="number">  48</span>   
<span class="number">  49</span>   sys.GetSystemTimer<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Start<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  50</span>
<span class="number">  51</span>   <span class="k1">do</span> <span class="k2">{</span>
<span class="number">  52</span>
<span class="number">  53</span>      <span class="k1">if</span> <span class="k2">(</span>redraw<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  54</span>         
<span class="number">  55</span>         ostringstream oss<span class="k2">;</span>
<span class="number">  56</span>         oss.str<span class="k2">(</span><span class="s">""</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  57</span>         ig.ShowLogic<span class="k2">(</span>oss<span class="k2">)</span><span class="k2">;</span>
<span class="number">  58</span>         
<span class="number">  59</span>         
<span class="number">  60</span>         win-&gt;Clear<span class="k2">(</span>EagleColor<span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>         win-&gt;DrawTextString<span class="k2">(</span>font40 , StringPrintF<span class="k2">(</span><span class="s">"FPS : %i"</span> , fps<span class="k2">)</span> , <span class="n">40</span> , <span class="n">40</span> , EagleColor<span class="k2">(</span><span class="n">0</span>,<span class="n">255</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  62</span>         win-&gt;DrawTextString<span class="k2">(</span>font40 , StringPrintF<span class="k2">(</span><span class="s">"framecount = %i"</span> , framecount <span class="k3">+</span> <span class="n">1</span><span class="k2">)</span> , <span class="n">40</span> , <span class="n">80</span> , EagleColor<span class="k2">(</span><span class="n">0</span>,<span class="n">255</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  63</span>         win-&gt;DrawTextString<span class="k2">(</span>font20 , oss.str<span class="k2">(</span><span class="k2">)</span> , <span class="n">400</span> , <span class="n">300</span> , EagleColor<span class="k2">(</span><span class="n">255</span>,<span class="n">255</span>,<span class="n">255</span><span class="k2">)</span> , DRAW_TEXT_CENTER , DRAW_TEXT_TOP<span class="k2">)</span><span class="k2">;</span>
<span class="number">  64</span>         win-&gt;FlipDisplay<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  65</span>         <span class="k3">+</span><span class="k3">+</span>framecount<span class="k2">;</span>
<span class="number">  66</span>         redraw <span class="k3">=</span> <span class="k1">false</span><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="k1">do</span> <span class="k2">{</span>
<span class="number">  70</span>         EagleEvent ee <span class="k3">=</span> sys.UpdateSystemState<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  71</span>         
<span class="number">  72</span>         <span class="k1">if</span> <span class="k2">(</span>AnyInputPressed<span class="k2">(</span><span class="k3">&amp;</span>press<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  73</span>            <span class="k1">if</span> <span class="k2">(</span>ModifierHeld<span class="k2">(</span><span class="k3">&amp;</span>held<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  74</span>               ig <span class="k3">=</span> press <span class="k3">&amp;</span><span class="k3">&amp;</span> held<span class="k2">;</span>
<span class="number">  75</span>            <span class="k2">}</span>
<span class="number">  76</span>            <span class="k1">else</span> <span class="k2">{</span>
<span class="number">  77</span>               ig <span class="k3">=</span> InputGroup<span class="k2">(</span>press<span class="k2">)</span><span class="k2">;</span>
<span class="number">  78</span>            <span class="k2">}</span>
<span class="number">  79</span>            redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  80</span>         <span class="k2">}</span>
<span class="number">  81</span>         
<span class="number">  82</span>         <span class="k1">if</span> <span class="k2">(</span>ee.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_TIMER <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k1">true</span><span class="c">/*ee.timer.source == sys.GetSystemTimer()*/</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  83</span>            count <span class="k3">+</span><span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  84</span>            <span class="k1">if</span> <span class="k2">(</span>count <span class="k3">=</span><span class="k3">=</span> <span class="n">60</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  85</span>               scount <span class="k3">+</span><span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  86</span>               count <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  87</span>               fps <span class="k3">=</span> framecount<span class="k2">;</span>
<span class="number">  88</span>               framecount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  89</span>            <span class="k2">}</span>
<span class="number">  90</span><span class="c">//            fps = count;</span>
<span class="number">  91</span>            redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  92</span>         <span class="k2">}</span>
<span class="number">  93</span>         <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ee.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_KEY_DOWN<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  94</span>            <span class="k1">if</span> <span class="k2">(</span>ee.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> EAGLE_KEY_ESCAPE<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  95</span>               quit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  96</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  97</span>            <span class="k2">}</span>
<span class="number">  98</span>         <span class="k2">}</span>
<span class="number">  99</span>         <span class="k1">if</span> <span class="k2">(</span>ee.type <span class="k3">=</span><span class="k3">=</span> EAGLE_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 100</span>            quit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 101</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 102</span>         <span class="k2">}</span>
<span class="number"> 103</span>         
<span class="number"> 104</span>      <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>sys.UpToDate<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 105</span>   <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>
<span class="number"> 107</span>
<span class="number"> 108</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 109</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 04 Oct 2013 11:13:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m wrong, <a href="http://en.wikipedia.org/wiki/Semaphore_%28programming%29">Wikipedia</a> says you&#39;re right.  I was thinking you just meant ordinary booleans (like a semaphore flag, on a mailbox or a railroad crossing).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Fri, 04 Oct 2013 11:17:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>yeah, I meant a pthread semaphore.</p><p>I may just wrap Allegro&#39;s Thread routines. They seem solid enough to write a driver around.</p><p>Edit<br />Well, I did just that, and now I have a thread running my TimerProcess but everytime I run my test program, I get two assert failures that don&#39;t crash like they&#39;re supposed to, and the program keeps running in the background and doesn&#39;t return. In addition to that, there are two pointers that are null that should not be.</p><p>Allegro5Timer.cpp
</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="p">#include "Eagle/backends/Allegro5/Allegro5EventHandler.hpp"</span>
<span class="number">   2</span><span class="p">#include "Eagle/backends/Allegro5/Allegro5Timer.hpp"</span>
<span class="number">   3</span><span class="p">#include "Eagle/backends/Allegro5/Allegro5Threads.hpp"</span>
<span class="number">   4</span>
<span class="number">   5</span>
<span class="number">   6</span>
<span class="number">   7</span>
<span class="number">   8</span><span class="k1">enum</span> EAGLE_TIMER_MESSAGE_TYPE <span class="k2">{</span>
<span class="number">   9</span>   EAGLE_MESSAGE_START_TIMER <span class="k3">=</span> <span class="n">1</span>,
<span class="number">  10</span>   EAGLE_MESSAGE_STOP_TIMER <span class="k3">=</span> <span class="n">2</span>,
<span class="number">  11</span>   EAGLE_MESSAGE_CLOSE_TIMER <span class="k3">=</span> <span class="n">3</span>
<span class="number">  12</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  13</span>
<span class="number">  14</span>
<span class="number">  15</span>
<span class="number">  16</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">  17</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">  18</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">  19</span>   EAGLE_ASSERT<span class="k2">(</span>eagle_a5_timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  20</span>
<span class="number">  21</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">  22</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">  23</span>   
<div class="highlight"><span class="number">  24</span>   EAGLE_ASSERT<span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span></div><div class="highlight"><span class="number">  25</span>   EAGLE_ASSERT<span class="k2">(</span>queue<span class="k2">)</span><span class="k2">;</span></div><span class="number">  26</span>
<span class="number">  27</span>   <span class="k1">int</span> counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  28</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">  29</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">  30</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<div class="highlight"><span class="number">  31</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></div><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">"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">  33</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">  34</span>         <span class="k3">+</span><span class="k3">+</span>counter<span class="k2">;</span>
<span class="number">  35</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">  36</span>      <span class="k2">}</span>
<span class="number">  37</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">  38</span>         <span class="k1">switch</span> <span class="k2">(</span>ev.user.data1<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  39</span>            <span class="k1">case</span> EAGLE_MESSAGE_START_TIMER <span class="k2">:</span>
<span class="number">  40</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">  41</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  42</span>            <span class="k1">case</span> EAGLE_MESSAGE_STOP_TIMER <span class="k2">:</span>
<span class="number">  43</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">  44</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  45</span>            <span class="k1">case</span> EAGLE_MESSAGE_CLOSE_TIMER <span class="k2">:</span>
<span class="number">  46</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">  47</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  48</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">  49</span>               <span class="k1">break</span><span class="k2">;</span>
<span class="number">  50</span>         <span class="k2">}</span>
<span class="number">  51</span>      <span class="k2">}</span>
<span class="number">  52</span>   <span class="k2">}</span>
<span class="number">  53</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">  54</span><span class="k2">}</span>
<span class="number">  55</span>
<span class="number">  56</span>
<span class="number">  57</span>
<span class="number">  58</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">  59</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">  60</span>   ev.type <span class="k3">=</span> EAGLE_EVENT_USER_START<span class="k2">;</span>
<span class="number">  61</span>   ev.user.data1 <span class="k3">=</span> message<span class="k2">;</span>
<div class="highlight"><span class="number">  62</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>event_source , <span class="k3">&amp;</span>ev , NULL<span class="k2">)</span><span class="k2">;</span></div><span class="number">  63</span><span class="k2">}</span>
<span class="number">  64</span>
<span class="number">  65</span>
<span class="number">  66</span>
<span class="number">  67</span>Allegro5Timer::Allegro5Timer<span class="k2">(</span><span class="k2">)</span> <span class="k2">:</span>
<span class="number">  68</span>      EagleTimer<span class="k2">(</span><span class="k2">)</span>,
<span class="number">  69</span>      timer<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>,
<span class="number">  70</span>      queue<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>,
<span class="number">  71</span>      queue_lock<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>,
<span class="number">  72</span>      event_source<span class="k2">(</span><span class="k2">)</span>,
<span class="number">  73</span>      ethread<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>
<span class="number">  74</span><span class="k2">{</span>
<div class="highlight"><span class="number">  75</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>event_source<span class="k2">)</span><span class="k2">;</span></div><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>   Destroy<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  82</span><span class="k2">}</span>
<span class="number">  83</span>
<span class="number">  84</span>
<span class="number">  85</span>
<span class="number">  86</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">  87</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">  88</span>
<span class="number">  89</span>   Destroy<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  90</span>   
<span class="number">  91</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">  92</span>   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">  93</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">  94</span>
<span class="number">  95</span>   EAGLE_ASSERT<span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>   EAGLE_ASSERT<span class="k2">(</span>queue<span class="k2">)</span><span class="k2">;</span>
<span class="number">  97</span>
<span class="number">  98</span>   <span class="k1">if</span> <span class="k2">(</span>queue <span class="k3">&amp;</span><span class="k3">&amp;</span> timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  99</span>      spt <span class="k3">=</span> seconds_per_tick<span class="k2">;</span>
<span class="number"> 100</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"> 101</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>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"> 102</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>queue , <span class="k3">&amp;</span>event_source<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 103</span>      <span class="c">/// MUST create TimerProcess thread AFTER registering event sources or it will wait forever</span>
<div class="highlight"><span class="number"> 104</span>      ethread-&gt;Create<span class="k2">(</span>TimerProcess , <span class="k1">this</span><span class="k2">)</span><span class="k2">;</span></div><span class="number"> 105</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"> 106</span>         ethread-&gt;Start<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 107</span>         <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 108</span>      <span class="k2">}</span>
<span class="number"> 109</span>   <span class="k2">}</span>
<span class="number"> 110</span>
<span class="number"> 111</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 112</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_EVENT_QUEUE."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 113</span>   <span class="k2">}</span>
<span class="number"> 114</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"> 115</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"> 116</span>   <span class="k2">}</span>
<span class="number"> 117</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"> 118</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"> 119</span>   <span class="k2">}</span>
<span class="number"> 120</span>
<span class="number"> 121</span>   <span class="c">// The queue or the timer failed to be created</span>
<span class="number"> 122</span>   Destroy<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 123</span>   <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 124</span><span class="k2">}</span>
<span class="number"> 125</span>
<span class="number"> 126</span>
<span class="number"> 127</span>
<span class="number"> 128</span><span class="k1">void</span> Allegro5Timer::Destroy<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 129</span>   <span class="k1">if</span> <span class="k2">(</span>ethread <span class="k3">&amp;</span><span class="k3">&amp;</span> running<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 130</span>      SendTimerProcessMessage<span class="k2">(</span>EAGLE_MESSAGE_CLOSE_TIMER<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 131</span>      ethread-&gt;Join<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 132</span>   <span class="k2">}</span>
<span class="number"> 133</span>   <span class="k1">if</span> <span class="k2">(</span>queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 134</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>queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 135</span>      queue <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 136</span>   <span class="k2">}</span>
<span class="number"> 137</span>   <span class="k1">if</span> <span class="k2">(</span>timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 138</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"> 139</span>      timer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 140</span>   <span class="k2">}</span>
<span class="number"> 141</span>   <span class="k1">if</span> <span class="k2">(</span>ethread<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 142</span>      <span class="k1">delete</span> ethread<span class="k2">;</span>
<span class="number"> 143</span>      ethread <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 144</span>   <span class="k2">}</span>
<span class="number"> 145</span>   spt <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 146</span><span class="k2">}</span>
<span class="number"> 147</span>
<span class="number"> 148</span>
<span class="number"> 149</span>
<span class="number"> 150</span><span class="k1">void</span> Allegro5Timer::Start<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 151</span>   SendTimerProcessMessage<span class="k2">(</span>EAGLE_MESSAGE_START_TIMER<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 152</span><span class="k2">}</span>
<span class="number"> 153</span>
<span class="number"> 154</span>
<span class="number"> 155</span>
<span class="number"> 156</span><span class="k1">void</span> Allegro5Timer::Stop<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 157</span>   SendTimerProcessMessage<span class="k2">(</span>EAGLE_MESSAGE_STOP_TIMER<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 158</span><span class="k2">}</span>
<span class="number"> 159</span>
<span class="number"> 160</span>
<span class="number"> 161</span>
<span class="number"> 162</span><span class="k1">void</span> Allegro5Timer::WaitForTick<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 163</span>   <span class="k1">if</span> <span class="k2">(</span>queue <span class="k3">&amp;</span><span class="k3">&amp;</span> timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 164</span>      <span class="k1">do</span> <span class="k2">{</span>
<span class="number"> 165</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"> 166</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>e<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 167</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"> 168</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"> 169</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 170</span>         <span class="k2">}</span>
<span class="number"> 171</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"> 172</span>   <span class="k2">}</span>
<span class="number"> 173</span>   <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 174</span><span class="k2">}</span>
<span class="number"> 175</span>
<span class="number"> 176</span>
<span class="number"> 177</span>
<span class="number"> 178</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"> 179</span>   <span class="k1">return</span> timer<span class="k2">;</span>
<span class="number"> 180</span><span class="k2">}</span>
<span class="number"> 181</span>
<span class="number"> 182</span>
<span class="number"> 183</span>
<span class="number"> 184</span><span class="k1">void</span> Allegro5Timer::RefreshTimer<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 185</span>   <span class="k1">if</span> <span class="k2">(</span>queue <span class="k3">&amp;</span><span class="k3">&amp;</span> timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 186</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"> 187</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>queue , <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 188</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"> 189</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"> 190</span>         <span class="k2">}</span>
<span class="number"> 191</span>      <span class="k2">}</span>
<span class="number"> 192</span>   <span class="k2">}</span>
<span class="number"> 193</span><span class="k2">}</span>
<span class="number"> 194</span>
<span class="number"> 195</span>
<span class="number"> 196</span>
<span class="number"> 197</span><span class="k1">bool</span> Allegro5Timer::Valid<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 198</span>   <span class="k1">return</span> timer <span class="k3">&amp;</span><span class="k3">&amp;</span> 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"> 199</span><span class="k2">}</span>
<span class="number"> 200</span>
<span class="number"> 201</span>
<span class="number"> 202</span>
<span class="number"> 203</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"> 204</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"> 205</span>   <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 206</span><span class="k2">}</span>
<span class="number"> 207</span>
<span class="number"> 208</span>
<span class="number"> 209</span>
<span class="number"> 210</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"> 211</span><span class="c">/*</span>
<span class="number"> 212</span><span class="c">   EAGLE_ASSERT(event_handler);</span>
<span class="number"> 213</span><span class="c">   Allegro5EventHandler* a5_event_handler = dynamic_cast&lt;Allegro5EventHandler*&gt;(event_handler);</span>
<span class="number"> 214</span><span class="c">   EAGLE_ASSERT(allegro_handler);</span>
<span class="number"> 215</span><span class="c"></span>
<span class="number"> 216</span><span class="c">   ALLEGRO_EVENT_QUEUE* allegro_queue = a5_event_handler-&gt;AllegroQueue();</span>
<span class="number"> 217</span><span class="c">   EAGLE_ASSERT(allegro_queue);</span>
<span class="number"> 218</span><span class="c">   al_register_event_source(allegro_queue , al_get_timer_event_source(timer));</span>
<span class="number"> 219</span><span class="c">*/</span>
<span class="number"> 220</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"> 221</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"> 222</span><span class="k2">}</span>
</div></div><p>

I marked all the lines I thought were important. Does anybody see anything wrong with my logic? I make a new thread in Allegro5Timer::Create, make an allegro timer and queue, and make sure they&#39;re both valid and register the event sources and then and only then do I create and start the thread that runs TimerProcess, where I keep getting the two marked assertion failures that the timer and queue are both null. I don&#39;t get it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 10 Oct 2013 02:56:38 +0000</pubDate>
	</item>
</rss>
