Hi wxPerl people,

thanks for the great toolkit. It's mostly a joy to work with.

Unfortunately, I'm experiencing problems with wxPerl in a threaded application. Essentially, I wrote a background task manager that pools threads. After a period of high load, it may terminate (Thread::Queue) and join a couple of threads to reduce the memory load.

The problem seems to be similar to what's been described here:
http://www.nntp.perl.org/group/perl.wxperl.users/2008/07/msg5961.html

Now, the application at hand is Padre. Gabor's been posting about it before, I assume. I'll outline some details I found out while trying to debug this and then explain how you can reproduce the problem using the Padre code. Unfortunately, I have no simple example code that exhibits the issues.

- I have read and understood Wx::Thread.
- I am loading threads and threads::shared before Wx.
- If you create threads before loading Wx, you can join them at any time without a crash. - If you create threads after creating the GUI, then join one thread, you get a Scalars leaked: 1.
- If you join a second thread, the program simply exits.
- The complexity of the threads doesn't matter. Using "threads->create(sub{warn "Hi!"})" is sufficient.

Here's how you can reproduce the crashes:

- $ svn checkout http://svn.perlide.org/padre/branches/padre-with-backgroundthreads
- cd there
- Run Build.PL to check for the dependencies; install them.
- Run dev.pl to launch the application.
Every two seconds, you will see output like "--1 at /home/tsee/padre/branches/padre-with-backgroundthreads/lib/Padre/TaskManager.pm line 157.". It means there's one worker thread being held available.
- Enable the ThreadTest plugin via Plugins->Plugin Manager
- Run Plugins->Thread Test->Test
This will submit 20 or so short jobs to the taskmanager which will see large demand and spawn more threads. When the short jobs are done The --X numbers will go up quickly and you'll see "in task" warnings from the tasks themselves as they're processed. When they're through, you'll see something like this:

8 at ... line 94.
--8 at ... line 144.
--8 at ... line 157.
THREAD TERMINATING at ... line 272.

==> The above warning is from the worker thread which acknowledges that it's being shut down. It simply does a "return 1".

8 at ...line 94.
--8 at ... line 144.
Joining thread 3 at ... line 148.

==> This is from right before "$thread->join()" is called

Scalars leaked: 1

==> This is from that call.

joined at ... line 150.

==> This is from right after the call. Now, observe what happens with the second thread that's being joined:

--7 at ... line 157.
THREAD TERMINATING at ... line 272.
7 at ... line 94.
--7 at ... line 144.
Joining thread 1 at ... line 148.


And then you're back to the shell.

I really don't know how to fix this. Any help would be great. I understand it's likely an issue in the C++ part of WxPerl or wxWidgets. Any pointer with regards to how *I* can debug that would be appreciated as well.

Best regards,
Steffen

Reply via email to