<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title> SIGSEGV in al_close_native_text_log when multiple log</title>
		<link>http://www.allegro.cc/forums/view/611252</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 16 Oct 2012 19:22:15 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello all,</p><p>I&#39;m using Allegro native text logs to debug my project and use several of them depending of my needs (one for battle computing, one for artificial intelligence, ...).<br />When I use only one, everything is fine. However, when I try to use more, I get a SIGSEGV in al_close_native_text_log when I try to close the second one.</p><p>Here is some code, the problem occurs in the destructor of the SLogger:<br />Le Header:
</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="k1">namespace</span> ELog
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    <span class="k1">enum</span> Type
<span class="number">  4</span>    <span class="k2">{</span>
<span class="number">  5</span>        Battle,
<span class="number">  6</span>        AI,
<span class="number">  7</span>        Dummy,
<span class="number">  8</span>
<span class="number">  9</span>        Length
<span class="number"> 10</span>    <span class="k2">}</span><span class="k2">;</span>
<span class="number"> 11</span><span class="k2">}</span>
<span class="number"> 12</span>
<span class="number"> 13</span><span class="k1">class</span> SLogger
<span class="number"> 14</span><span class="k2">{</span>
<span class="number"> 15</span>    private:
<span class="number"> 16</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_TEXTLOG"><span class="a">ALLEGRO_TEXTLOG</span></a><span class="k3">*</span> Logs<span class="k2">[</span>ELog::Length<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>    private:
<span class="number"> 19</span>    ~SLogger<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>    public:
<span class="number"> 22</span>    <span class="k1">void</span> LoadLogWindows<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span>    <span class="k1">void</span> Log<span class="k2">(</span>ELog::Type which, std::string text<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>Le 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>SLogger::~SLogger<span class="k2">(</span><span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>ELog::Length<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  4</span>    <span class="k2">{</span>
<span class="number">  5</span>        <span class="k1">if</span><span class="k2">(</span>Logs<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="number">  6</span>        <span class="k2">{</span>
<span class="number">  7</span>            <a href="http://www.allegro.cc/manual/al_close_native_text_log"><span class="a">al_close_native_text_log</span></a><span class="k2">(</span>Logs<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>            Logs<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  9</span>        <span class="k2">}</span>
<span class="number"> 10</span>    <span class="k2">}</span>
<span class="number"> 11</span><span class="k2">}</span>
<span class="number"> 12</span>
<span class="number"> 13</span><span class="k1">void</span> SLogger::LoadLogWindows<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 14</span><span class="k2">{</span>
<span class="number"> 15</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>ELog::Length<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 16</span>    <span class="k2">{</span>
<span class="number"> 17</span>        Logs<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 18</span>    <span class="k2">}</span>
<span class="number"> 19</span>
<span class="number"> 20</span>
<span class="number"> 21</span>    Logs<span class="k2">[</span>ELog::Battle<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_open_native_text_log"><span class="a">al_open_native_text_log</span></a><span class="k2">(</span><span class="s">"Battle Log"</span>, ALLEGRO_TEXTLOG_NO_CLOSE <span class="k3">|</span> ALLEGRO_TEXTLOG_MONOSPACE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span>    Logs<span class="k2">[</span>ELog::AI<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_open_native_text_log"><span class="a">al_open_native_text_log</span></a><span class="k2">(</span><span class="s">"AI Log"</span>, ALLEGRO_TEXTLOG_NO_CLOSE <span class="k3">|</span> ALLEGRO_TEXTLOG_MONOSPACE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span>Logs<span class="k2">[</span>ELog::Dummy<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_open_native_text_log"><span class="a">al_open_native_text_log</span></a><span class="k2">(</span><span class="s">"AI Log"</span>, ALLEGRO_TEXTLOG_NO_CLOSE <span class="k3">|</span> ALLEGRO_TEXTLOG_MONOSPACE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span><span class="k2">}</span>
</div></div><p>

Is it a known problem or have I done something wrong?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (URB753)</author>
		<pubDate>Mon, 15 Oct 2012 04:07:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I can&#39;t test right now but just from reading the code, yes, this is likely a problem on Windows and OS X.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Mon, 15 Oct 2012 07:33:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s odd. I have just checked, and it works fine, no matter how many logs. </p><p>Are you sure there&#39;s nothing messes with pointers? Because the only way I&#39;m getting segfaults at log closure is artificially messing with them, like this:
</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><a href="http://www.allegro.cc/manual/ALLEGRO_TEXTLOG"><span class="a">ALLEGRO_TEXTLOG</span></a> <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a><span class="k2">;</span>
<span class="number"> 2</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_open_native_text_log"><span class="a">al_open_native_text_log</span></a> <span class="k2">(</span> <span class="s">"Log"</span>, <span class="n">0</span> <span class="k2">)</span><span class="k2">;</span>
<span class="number"> 3</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a> <span class="k3">=</span> <span class="k2">(</span><span class="k1">char</span><span class="k3">*</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a> <span class="k3">+</span> <span class="n">3</span><span class="k2">;</span>
<span class="number"> 4</span><a href="http://www.allegro.cc/manual/al_close_native_text_log"><span class="a">al_close_native_text_log</span></a> <span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a> <span class="k2">)</span><span class="k2">;</span>
</div></div><p> <br /><b>UPD:</b><br />Segfaults also arise when I close exactly the same log more than once. Make sure you don&#39;t do that either.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Raidho36)</author>
		<pubDate>Mon, 15 Oct 2012 13:31:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Informations I should have given on the first post:<br />I&#39;m using allegro 5.0.6 on Windows 7.</p><p>The only function to have access to those pointer is the writing function which goes like this:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> SLogger::Log<span class="k2">(</span>ELog::Type which, std::string text<span class="k2">)</span>
<span class="k2">{</span>
    Assert<span class="k2">(</span><span class="k2">(</span>Logs<span class="k2">[</span>which<span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span>, <span class="s">"Log doesn't exist. This may be a define error."</span><span class="k2">)</span><span class="k2">;</span>

    <a href="http://www.allegro.cc/manual/al_append_native_text_log"><span class="a">al_append_native_text_log</span></a><span class="k2">(</span>Logs<span class="k2">[</span>which<span class="k2">]</span>, <span class="s">"%s\n"</span>, text.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
And the problem arise even if I don&#39;t use it.</p><p>When I watch them in the debugger, the different pointers are different so it seems I&#39;m not closing the same window twice. Could it be that Windows link them in some sort of way because they are spawned by the same process?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (URB753)</author>
		<pubDate>Mon, 15 Oct 2012 16:50:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh, that. I&#39;m using 5.0.7 on W764 with gcc 4.6 and it works with no problem. Maybe you should upgrade, API haven&#39;t changed anyway.</p><p>On unrelated topic, why would you check whether or not the log window you log into actually exists? Isn&#39;t it obvious that if you manually specify where to log then you&#39;re confident about this being possible?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Raidho36)</author>
		<pubDate>Mon, 15 Oct 2012 17:56:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I was wrong, this is specific to the Windows port. Here is the bug, I think:</p><pre>
diff --git a/addons/native_dialog/win_dialog.c b/addons/native_dialog/win_dialog.c
index 3cc6710..6f35b53 100644
--- a/addons/native_dialog/win_dialog.c
+++ b/addons/native_dialog/win_dialog.c
@@ -600,8 +600,8 @@ bool _al_open_native_text_log(ALLEGRO_NATIVE_DIALOG *textlog)
 
    /* Release RichEdit module. */
    if (wlog_rich_edit_module) {
-      _al_close_library(wlog_rich_edit_module);
-      wlog_rich_edit_module = NULL;
+//       _al_close_library(wlog_rich_edit_module);
+//       wlog_rich_edit_module = NULL;
    }
 
    /* Unregister window class. */
</pre><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Mon, 15 Oct 2012 18:10:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>@Raidho36:<br />I&#39;ve updated to 5.0.7 without it solving the problem.</p><p>And for the second question, let&#39;s say I&#39;m a control freak. The Assert aren&#39;t included in the release version so I put a lot of them.</p><p>@Peter Wang:<br />I can&#39;t really go into Allegro to apply the change you are suggesting since I use the binary version.<br />Do you have any workaround? (I don&#39;t know what RichEdit is, maybe there is a way to deactivate it.)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (URB753)</author>
		<pubDate>Mon, 15 Oct 2012 21:23:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wait for the next release or don&#39;t use multiple text logs.</p><p>edit: fixed in git
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Tue, 16 Oct 2012 07:22:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Okay. I&#39;ll use logging on file instead of extra windows.</p><p>Thanks for the answers.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (URB753)</author>
		<pubDate>Tue, 16 Oct 2012 19:22:15 +0000</pubDate>
	</item>
</rss>
