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