File Coverage

blib/lib/Stem/Event/Queue.pm
Criterion Covered Total %
statement 20 28 71.4
branch 2 6 33.3
condition 0 3 0.0
subroutine 6 8 75.0
pod 0 2 0.0
total 28 47 59.5


line stmt bran cond sub pod time code
1             # File: Stem/Event/Queue.pm
2              
3             # This file is part of Stem.
4             # Copyright (C) 1999, 2000, 2001 Stem Systems, Inc.
5              
6             # Stem is free software; you can redistribute it and/or modify
7             # it under the terms of the GNU General Public License as published by
8             # the Free Software Foundation; either version 2 of the License, or
9             # (at your option) any later version.
10              
11             # Stem is distributed in the hope that it will be useful,
12             # but WITHOUT ANY WARRANTY; without even the implied warranty of
13             # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14             # GNU General Public License for more details.
15              
16             # You should have received a copy of the GNU General Public License
17             # along with Stem; if not, write to the Free Software
18             # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19              
20             # For a license to use the Stem under conditions other than those
21             # described here, to purchase support for this software, or to purchase a
22             # commercial warranty contract, please contact Stem Systems at:
23              
24             # Stem Systems, Inc. 781-643-7504
25             # 79 Everett St. info@stemsystems.com
26             # Arlington, MA 02474
27             # USA
28              
29             # this class provides a way to deliver certain events and messages
30             # synchronously with the main event loop. this is done by queueing the
31             # actual event/message and writing a byte down a special pipe used
32             # only inside this process. the other side of the pipe has a read
33             # event that when triggered will then deliver the queued
34             # events/messages.
35              
36             # when using Stem::Event::Signal you need to use this module as
37             # well. perl signals will be delivered (safely) between perl
38             # operations but they could then be delivered inside an executing
39             # event handler and that means possible corruption. so this module
40             # allows those signal events to be delivered by the event loop itself.
41              
42              
43             package Stem::Event::Queue ;
44              
45 4     4   18 use strict ;
  4         9  
  4         118  
46 4     4   22 use warnings ;
  4         6  
  4         127  
47              
48 4     4   2792 use Socket;
  4         13795  
  4         2811  
49 4     4   2733 use IO::Handle ;
  4         23692  
  4         213  
50              
51 4     4   31 use base 'Exporter' ;
  4         12  
  4         1631  
52             our @EXPORT = qw( &mark_not_empty ) ;
53              
54             my( $queue_read, $queue_write, $queue_read_event ) ;
55              
56             my $self ;
57              
58             sub _init_queue {
59              
60 2 50   2   333 socketpair( $queue_read, $queue_write,
61             AF_UNIX, SOCK_STREAM, PF_UNSPEC ) || die <
62             can't create socketpair $!
63             DIE
64              
65             #print fileno( $queue_read ), " FILENO\n" ;
66              
67 2         7 $self = bless {} ;
68              
69 2         35 $queue_read->blocking( 0 ) ;
70 2         16 $queue_read_event = Stem::Event::Read->new(
71             'object' => $self,
72             'fh' => $queue_read,
73             ) ;
74              
75 2 50       24 ref $queue_read_event or die <
76             can't create Stem::Event::Queue read event: $queue_read_event
77             DIE
78              
79             }
80              
81             my $queue_is_marked ;
82              
83             sub mark_not_empty {
84              
85 0     0 0   my( $always_mark ) = @_ ;
86              
87             # don't mark the queue if it is already marked and we aren't forced
88             # the signal queue always marks the queue
89              
90 0 0 0       return if $queue_is_marked && !$always_mark ;
91              
92 0           syswrite( $queue_write, 'x' ) ;
93              
94 0           $queue_is_marked = 1 ;
95             }
96              
97             sub readable {
98              
99 0     0 0   sysread( $queue_read, my $buf, 10 ) ;
100              
101 0           $queue_is_marked = 0 ;
102              
103             # Stem::Event::Plain::process_queue();
104 0           Stem::Event::Signal::process_signal_queue();
105             # Stem::Msg::process_queue() if defined &Stem::Msg::process_queue;
106              
107 0           return ;
108             }
109              
110             1 ;