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