Ignore:
Timestamp:
02/07/10 03:24:00 (2 years ago)
Author:
tsee
Message:

got experimental slave driving to work

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Padre/lib/Padre/SlaveDriver.pm

    r10564 r10566  
    4747use Thread::Queue 2.11; 
    4848 
     49# This event is triggered by the worker thread main loop after 
     50# finishing a task. 
     51our $TASK_DONE_EVENT : shared; 
     52BEGIN { $TASK_DONE_EVENT = Wx::NewEventType; } 
     53 
     54# This event is triggered by the worker thread main loop before 
     55# running a task. 
     56our $TASK_START_EVENT : shared; 
     57BEGIN { $TASK_START_EVENT = Wx::NewEventType; } 
     58 
    4959=head3 C<new> 
    5060 
     
    5565=cut 
    5666 
    57 { 
     67SCOPE: { 
    5868    my $SlaveDriver; 
    5969    sub new { 
    6070        my $class = shift; 
    6171        return $SlaveDriver if defined $SlaveDriver; 
    62         $SlaveDriver = bless {} => $class; 
    6372        @_ = (); 
    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; 
    6678        $SlaveDriver->{master} = threads->create( 
    6779            \&_slave_driver_loop, 
     
    7385 
    7486    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    } 
    8189} 
    8290 
     
    95103    my $task_manager = shift; 
    96104    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])); 
    98106    my $tid = $self->{tid_queue}->dequeue(); 
    99107    return threads->object($tid); 
     108} 
     109 
     110 
     111=head3 task_queue 
     112 
     113Returns the task queue (C<Thread::Queue> object) for use by the 
     114L<Padre::TaskManager> for passing processing tasks to the worker 
     115threads. 
     116 
     117This queue is instantiated by the slave driver because it needs to be available 
     118early for passing to the master thread. 
     119 
     120=cut 
     121 
     122sub task_queue { 
     123    my $self = shift; 
     124    return $self->{task_queue}; 
     125} 
     126 
     127=head3 cleanup 
     128 
     129Reaps the master thread. Will be called by the TaskManager on shutdown and 
     130on global destruction. 
     131 
     132=cut 
     133 
     134sub 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 
     147sub DESTROY { 
     148    my $self = shift; 
     149    $self->cleanup(); 
    100150} 
    101151 
     
    103153# Worker thread main loop 
    104154sub _worker_loop { 
    105     my ( $main, $queue ) = @_; @_ = (); # hack to avoid "Scalars leaked" 
     155    my ( $queue ) = @_; @_ = (); # hack to avoid "Scalars leaked" 
    106156    require Storable; 
    107157    require Padre::TaskManager; 
    108158 
    109159    # Set the thread-specific main-window pointer 
     160    my $main = Wx::wxTheApp->GetTopWindow(); 
    110161    $Padre::TaskManager::_main = $main; 
    111162 
     
    123174 
    124175        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) ); 
    126177        Wx::PostEvent( $main, $thread_start_event ); 
    127178 
     
    133184        $task->serialize( \$frozen_task ); 
    134185 
    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 ); 
    136187        Wx::PostEvent( $main, $thread_done_event ); 
    137188 
     
    150201        last if $args eq 'STOP'; 
    151202         
    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); 
    153205        my $tid = $worker_thread->tid(); 
    154206        $outqueue->enqueue($tid); 
Note: See TracChangeset for help on using the changeset viewer.