<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>user event ref counting problem</title>
		<link>http://www.allegro.cc/forums/view/611462</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 18 Nov 2012 21:37:24 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Why does my_event_dtor function get called for each call to al_unref_user_event?</p><p>Surely the event queue should contain 3 events prior to entering the msg pump loop?<br />I would expect to see the dtor function called only once after the ref count reached 0</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 &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro_native_dialog.h&gt;</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#define MY_COMPLEX_EVENT_TYPE    ALLEGRO_GET_EVENT_TYPE('m', 'c', 'e', 't')</span>
<span class="number">  5</span>
<span class="number">  6</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>m_queue<span class="k2">;</span>
<span class="number">  7</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_SOURCE"><span class="a">ALLEGRO_EVENT_SOURCE</span></a> m_userSrc<span class="k2">;</span>
<span class="number">  8</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> m_userEvent<span class="k2">;</span>
<span class="number">  9</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> event<span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">int</span> cnt <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span><span class="k1">static</span> <span class="k1">void</span> my_event_dtor<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_USER_EVENT"><span class="a">ALLEGRO_USER_EVENT</span></a> <span class="k3">*</span>ev<span class="k2">)</span>
<span class="number"> 14</span><span class="k2">{</span>
<span class="number"> 15</span><a href="http://www.allegro.cc/manual/al_show_native_message_box"><span class="a">al_show_native_message_box</span></a><span class="k2">(</span>NULL, NULL, <span class="s">"Event"</span>, <span class="s">"MY_COMPLEX_EVENT_TYPE my_event_dtor called"</span>, NULL, ALLEGRO_MESSAGEBOX_ERROR<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span><span class="k2">}</span>
<span class="number"> 17</span>
<span class="number"> 18</span><span class="k1">int</span> main<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="number"> 19</span><span class="k2">{</span>
<span class="number"> 20</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="number"> 21</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>m_userSrc<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>  m_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"> 23</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>m_queue, <span class="k3">&amp;</span>m_userSrc<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span>  m_userEvent.user.type <span class="k3">=</span> MY_COMPLEX_EVENT_TYPE<span class="k2">;</span>
<span class="number"> 26</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>m_userSrc, <span class="k3">&amp;</span>m_userEvent, my_event_dtor<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</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>m_userSrc, <span class="k3">&amp;</span>m_userEvent, my_event_dtor<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</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>m_userSrc, <span class="k3">&amp;</span>m_userEvent, my_event_dtor<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>
<span class="number"> 30</span>  <span class="k1">while</span> <span class="k2">(</span><span class="k1">true</span><span class="k2">)</span>
<span class="number"> 31</span>  <span class="k2">{</span>
<span class="number"> 32</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>m_queue, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>    <span class="k1">if</span> <span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> MY_COMPLEX_EVENT_TYPE<span class="k2">)</span>
<span class="number"> 34</span>    <span class="k2">{</span>
<span class="number"> 35</span>      <a href="http://www.allegro.cc/manual/al_show_native_message_box"><span class="a">al_show_native_message_box</span></a><span class="k2">(</span>NULL, NULL, <span class="s">"Event"</span>, <span class="s">"MY_COMPLEX_EVENT_TYPE"</span>, NULL, ALLEGRO_MESSAGEBOX_ERROR<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>      <a href="http://www.allegro.cc/manual/al_unref_user_event"><span class="a">al_unref_user_event</span></a><span class="k2">(</span><span class="k3">&amp;</span>event.user<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>    <span class="k2">}</span>
<span class="number"> 38</span>  <span class="k2">}</span>
<span class="number"> 39</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 40</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Sancha)</author>
		<pubDate>Sun, 18 Nov 2012 20:34:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No, al_emit_user_event creates a new event. The reference counting ensures that for each call to al_emit_user_event you get one call of the destructor (once al_unref_user_event has been called on it from all the queues it was sent to).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Sun, 18 Nov 2012 21:09:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok, that makes sense. Thanks
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Sancha)</author>
		<pubDate>Sun, 18 Nov 2012 21:37:24 +0000</pubDate>
	</item>
</rss>
