Commit | Line | Data |
4536f655 |
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 ; |
f4d1dc84 |
44 | our @ISA = qw( Stem::Event ) ; |
4536f655 |
45 | |
46 | use strict ; |
47 | use warnings ; |
48 | |
49 | use Socket; |
50 | use IO::Handle ; |
51 | |
4932dd97 |
52 | my( $self, $queue_read, $queue_write, $queue_read_event, $queue_has_event ) ; |
4536f655 |
53 | |
4932dd97 |
54 | sub _init_event_queue { |
4536f655 |
55 | |
4932dd97 |
56 | return if $self ; |
4536f655 |
57 | |
4932dd97 |
58 | $self = bless {} ; |
4536f655 |
59 | |
60 | socketpair( $queue_read, $queue_write, |
61 | AF_UNIX, SOCK_STREAM, PF_UNSPEC ) || die <<DIE ; |
62 | can't create socketpair $! |
63 | DIE |
64 | |
65 | #print fileno( $queue_read ), " FILENO\n" ; |
66 | |
4536f655 |
67 | |
68 | $queue_read->blocking( 0 ) ; |
69 | $queue_read_event = Stem::Event::Read->new( |
70 | 'object' => $self, |
71 | 'fh' => $queue_read, |
72 | ) ; |
73 | |
74 | ref $queue_read_event or die <<DIE ; |
75 | can't create Stem::Event::Queue read event: $queue_read_event |
76 | DIE |
77 | |
78 | } |
79 | |
4932dd97 |
80 | sub queue_has_event { |
4536f655 |
81 | |
82 | my( $always_mark ) = @_ ; |
83 | |
84 | # don't mark the queue if it is already marked and we aren't forced |
85 | # the signal queue always marks the queue |
86 | |
4932dd97 |
87 | return if $queue_has_event && !$always_mark ; |
4536f655 |
88 | |
89 | syswrite( $queue_write, 'x' ) ; |
90 | |
4932dd97 |
91 | $queue_has_event = 1 ; |
4536f655 |
92 | } |
93 | |
94 | sub readable { |
95 | |
96 | sysread( $queue_read, my $buf, 10 ) ; |
97 | |
4932dd97 |
98 | $queue_has_event = 0 ; |
4536f655 |
99 | |
100 | # Stem::Event::Plain::process_queue(); |
101 | Stem::Event::Signal::process_signal_queue(); |
102 | # Stem::Msg::process_queue() if defined &Stem::Msg::process_queue; |
103 | |
104 | return ; |
105 | } |
106 | |
107 | 1 ; |