Changeset 10566 for trunk/Padre/lib/Padre/SlaveDriver.pm
- Timestamp:
- 02/07/10 03:24:00 (2 years ago)
- File:
-
- 1 edited
-
trunk/Padre/lib/Padre/SlaveDriver.pm (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Padre/lib/Padre/SlaveDriver.pm
r10564 r10566 47 47 use Thread::Queue 2.11; 48 48 49 # This event is triggered by the worker thread main loop after 50 # finishing a task. 51 our $TASK_DONE_EVENT : shared; 52 BEGIN { $TASK_DONE_EVENT = Wx::NewEventType; } 53 54 # This event is triggered by the worker thread main loop before 55 # running a task. 56 our $TASK_START_EVENT : shared; 57 BEGIN { $TASK_START_EVENT = Wx::NewEventType; } 58 49 59 =head3 C<new> 50 60 … … 55 65 =cut 56 66 57 {67 SCOPE: { 58 68 my $SlaveDriver; 59 69 sub new { 60 70 my $class = shift; 61 71 return $SlaveDriver if defined $SlaveDriver; 62 $SlaveDriver = bless {} => $class;63 72 @_ = (); 64 $SlaveDriver->{cmd_queue} = Thread::Queue->new(); 65 $SlaveDriver->{tid_queue} = Thread::Queue->new(); 73 $SlaveDriver = bless { 74 cmd_queue => Thread::Queue->new(), 75 tid_queue => Thread::Queue->new(), 76 task_queue => Thread::Queue->new(), 77 } => $class; 66 78 $SlaveDriver->{master} = threads->create( 67 79 \&_slave_driver_loop, … … 73 85 74 86 END { 75 if (defined $SlaveDriver and defined $SlaveDriver->{master} and defined $SlaveDriver->{cmd_queue}) { 76 $SlaveDriver->{cmd_queue}->enqueue('STOP'); 77 $SlaveDriver->{master}->join(); 78 } 79 } 80 87 $SlaveDriver->cleanup(), undef $SlaveDriver if defined $SlaveDriver; 88 } 81 89 } 82 90 … … 95 103 my $task_manager = shift; 96 104 require Storable; 97 $self->{cmd_queue}->enqueue(Storable::freeze([$ main, $task_manager->task_queue]));105 $self->{cmd_queue}->enqueue(Storable::freeze([$task_manager->task_queue])); 98 106 my $tid = $self->{tid_queue}->dequeue(); 99 107 return threads->object($tid); 108 } 109 110 111 =head3 task_queue 112 113 Returns the task queue (C<Thread::Queue> object) for use by the 114 L<Padre::TaskManager> for passing processing tasks to the worker 115 threads. 116 117 This queue is instantiated by the slave driver because it needs to be available 118 early for passing to the master thread. 119 120 =cut 121 122 sub task_queue { 123 my $self = shift; 124 return $self->{task_queue}; 125 } 126 127 =head3 cleanup 128 129 Reaps the master thread. Will be called by the TaskManager on shutdown and 130 on global destruction. 131 132 =cut 133 134 sub cleanup { 135 my $self = shift; 136 if (defined $self->{master} and defined $self->{cmd_queue}) { 137 $self->{cmd_queue}->enqueue('STOP'); 138 require Time::HiRes; 139 Time::HiRes::usleep(5000); # 5 milli-sec 140 if ($self->{master}->is_joinable) { 141 $self->{master}->join; 142 } 143 } 144 # TaskManager does handle thread *killing* 145 } 146 147 sub DESTROY { 148 my $self = shift; 149 $self->cleanup(); 100 150 } 101 151 … … 103 153 # Worker thread main loop 104 154 sub _worker_loop { 105 my ( $ main, $queue ) = @_; @_ = (); # hack to avoid "Scalars leaked"155 my ( $queue ) = @_; @_ = (); # hack to avoid "Scalars leaked" 106 156 require Storable; 107 157 require Padre::TaskManager; 108 158 109 159 # Set the thread-specific main-window pointer 160 my $main = Wx::wxTheApp->GetTopWindow(); 110 161 $Padre::TaskManager::_main = $main; 111 162 … … 123 174 124 175 my $thread_start_event = 125 Wx::PlThreadEvent->new( -1, $ Padre::TaskManager::TASK_START_EVENT, $task->{__thread_id} . ";" . ref($task) );176 Wx::PlThreadEvent->new( -1, $TASK_START_EVENT, $task->{__thread_id} . ";" . ref($task) ); 126 177 Wx::PostEvent( $main, $thread_start_event ); 127 178 … … 133 184 $task->serialize( \$frozen_task ); 134 185 135 my $thread_done_event = Wx::PlThreadEvent->new( -1, $ Padre::TaskManager::TASK_DONE_EVENT, $frozen_task );186 my $thread_done_event = Wx::PlThreadEvent->new( -1, $TASK_DONE_EVENT, $frozen_task ); 136 187 Wx::PostEvent( $main, $thread_done_event ); 137 188 … … 150 201 last if $args eq 'STOP'; 151 202 152 my $worker_thread = threads->create(\&_worker_loop, @{Storable::thaw($args)}); 203 my $task_queue = Padre::SlaveDriver->new->task_queue; 204 my $worker_thread = threads->create(\&_worker_loop, $task_queue); 153 205 my $tid = $worker_thread->tid(); 154 206 $outqueue->enqueue($tid);
Note: See TracChangeset
for help on using the changeset viewer.
