Changeset 10585
- Timestamp:
- 02/07/10 06:14:07 (7 months ago)
- Files:
-
- 1 modified
-
trunk/Padre/lib/Padre/SlaveDriver.pm (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Padre/lib/Padre/SlaveDriver.pm
r10579 r10585 38 38 use warnings; 39 39 40 our $VERSION = '0.5 4';40 our $VERSION = '0.56'; 41 41 42 42 # According to Wx docs, … … 54 54 # running a task. 55 55 our $TASK_START_EVENT : shared; 56 57 =pod 56 58 57 59 =head3 C<new> … … 70 72 @_ = (); 71 73 $SlaveDriver = bless { 72 cmd_queue => Thread::Queue->new (),73 tid_queue => Thread::Queue->new (),74 task_queue => Thread::Queue->new (),74 cmd_queue => Thread::Queue->new, 75 tid_queue => Thread::Queue->new, 76 task_queue => Thread::Queue->new, 75 77 } => $class; 76 $SlaveDriver->_init_events ();78 $SlaveDriver->_init_events; 77 79 $SlaveDriver->{master} = threads->create( 78 80 \&_slave_driver_loop, … … 84 86 85 87 END { 86 $SlaveDriver->cleanup(), undef $SlaveDriver if defined $SlaveDriver; 88 if ( defined $SlaveDriver ) { 89 $SlaveDriver->cleanup; 90 undef $SlaveDriver; 91 } 87 92 } 88 93 } … … 90 95 # done late so that the full Wx has been loaded for sure 91 96 sub _init_events { 92 $TASK_DONE_EVENT = Wx::NewEventType() if not defined $TASK_DONE_EVENT;97 $TASK_DONE_EVENT = Wx::NewEventType() if not defined $TASK_DONE_EVENT; 93 98 $TASK_START_EVENT = Wx::NewEventType() if not defined $TASK_START_EVENT; 94 99 } 100 101 =pod 95 102 96 103 =head2 Object methods … … 107 114 my $task_manager = shift; 108 115 require Storable; 109 $self->{cmd_queue}->enqueue(Storable::freeze([$task_manager->task_queue])); 110 my $tid = $self->{tid_queue}->dequeue(); 111 return threads->object($tid); 112 } 113 116 $self->{cmd_queue}->enqueue( 117 Storable::freeze( [ $task_manager->task_queue ] ) 118 ); 119 return threads->object( 120 $self->{tid_queue}->dequeue 121 ); 122 } 123 124 =pod 114 125 115 126 =head3 task_queue … … 125 136 126 137 sub task_queue { 127 my $self = shift; 128 return $self->{task_queue}; 129 } 138 $_[0]->{task_queue}; 139 } 140 141 =pod 130 142 131 143 =head3 cleanup … … 150 162 151 163 sub DESTROY { 152 my $self = shift; 153 $self->cleanup(); 164 $_[0]->cleanup; 154 165 } 155 166 … … 157 168 # Worker thread main loop 158 169 sub _worker_loop { 159 my ( $queue ) = @_; @_ = (); # hack to avoid "Scalars leaked" 170 my ( $queue ) = @_; 171 @_ = (); # hack to avoid "Scalars leaked" 172 160 173 require Storable; 161 174 require Padre::TaskManager; … … 195 208 } 196 209 197 198 210 sub _slave_driver_loop { 199 my ( $inqueue, $outqueue ) = @_; @_ = (); # hack to avoid "Scalars leaked" 211 my ( $inqueue, $outqueue ) = @_; 212 @_ = (); # hack to avoid "Scalars leaked" 200 213 201 214 while ( my $args = $inqueue->dequeue ) { # args is frozen [$main, $queue] 202 215 last if $args eq 'STOP'; 203 204 216 my $task_queue = Padre::SlaveDriver->new->task_queue; 205 217 my $worker_thread = threads->create(\&_worker_loop, $task_queue); 206 my $tid = $worker_thread->tid ();218 my $tid = $worker_thread->tid; 207 219 $outqueue->enqueue($tid); 208 220 }
