Statistics
| Branch: | Tag: | Revision:

root / lib / daemon.py @ 58b311ca

History | View | Annotate | Download (3.1 kB)

1 821d9e43 Michael Hanselmann
#
2 821d9e43 Michael Hanselmann
#
3 821d9e43 Michael Hanselmann
4 821d9e43 Michael Hanselmann
# Copyright (C) 2006, 2007, 2008 Google Inc.
5 821d9e43 Michael Hanselmann
#
6 821d9e43 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 821d9e43 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 821d9e43 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 821d9e43 Michael Hanselmann
# (at your option) any later version.
10 821d9e43 Michael Hanselmann
#
11 821d9e43 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 821d9e43 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 821d9e43 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 821d9e43 Michael Hanselmann
# General Public License for more details.
15 821d9e43 Michael Hanselmann
#
16 821d9e43 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 821d9e43 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 821d9e43 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 821d9e43 Michael Hanselmann
# 02110-1301, USA.
20 821d9e43 Michael Hanselmann
21 821d9e43 Michael Hanselmann
22 821d9e43 Michael Hanselmann
"""Module with helper classes and functions for daemons"""
23 821d9e43 Michael Hanselmann
24 821d9e43 Michael Hanselmann
25 821d9e43 Michael Hanselmann
import select
26 821d9e43 Michael Hanselmann
import signal
27 821d9e43 Michael Hanselmann
import errno
28 821d9e43 Michael Hanselmann
29 821d9e43 Michael Hanselmann
from ganeti import utils
30 821d9e43 Michael Hanselmann
31 821d9e43 Michael Hanselmann
32 821d9e43 Michael Hanselmann
class Mainloop(object):
33 821d9e43 Michael Hanselmann
  """Generic mainloop for daemons
34 821d9e43 Michael Hanselmann

35 821d9e43 Michael Hanselmann
  """
36 821d9e43 Michael Hanselmann
  def __init__(self):
37 821d9e43 Michael Hanselmann
    self._io_wait = []
38 821d9e43 Michael Hanselmann
    self._signal_wait = []
39 07fc5289 Guido Trotter
    self.sigchld_handler = None
40 a570e2a8 Guido Trotter
    self.sigterm_handler = None
41 a570e2a8 Guido Trotter
    self.quit = False
42 821d9e43 Michael Hanselmann
43 821d9e43 Michael Hanselmann
  def Run(self):
44 821d9e43 Michael Hanselmann
    # TODO: Does not yet support adding new event sources while running
45 821d9e43 Michael Hanselmann
    poller = select.poll()
46 821d9e43 Michael Hanselmann
    for (owner, fd, conditions) in self._io_wait:
47 821d9e43 Michael Hanselmann
      poller.register(fd, conditions)
48 821d9e43 Michael Hanselmann
49 821d9e43 Michael Hanselmann
    self.sigchld_handler = utils.SignalHandler([signal.SIGCHLD])
50 a570e2a8 Guido Trotter
    self.sigterm_handler = utils.SignalHandler([signal.SIGTERM])
51 821d9e43 Michael Hanselmann
    try:
52 a570e2a8 Guido Trotter
      while not self.quit:
53 821d9e43 Michael Hanselmann
        try:
54 821d9e43 Michael Hanselmann
          io_events = poller.poll(1000)
55 821d9e43 Michael Hanselmann
        except select.error, err:
56 821d9e43 Michael Hanselmann
          # EINTR can happen when signals are sent
57 821d9e43 Michael Hanselmann
          if err.args and err.args[0] in (errno.EINTR,):
58 821d9e43 Michael Hanselmann
            io_events = None
59 821d9e43 Michael Hanselmann
          else:
60 821d9e43 Michael Hanselmann
            raise
61 821d9e43 Michael Hanselmann
62 821d9e43 Michael Hanselmann
        if io_events:
63 821d9e43 Michael Hanselmann
          # Check for I/O events
64 821d9e43 Michael Hanselmann
          for (evfd, evcond) in io_events:
65 821d9e43 Michael Hanselmann
            for (owner, fd, conditions) in self._io_wait:
66 821d9e43 Michael Hanselmann
              if fd == evfd and evcond & conditions:
67 821d9e43 Michael Hanselmann
                owner.OnIO(fd, evcond)
68 821d9e43 Michael Hanselmann
69 821d9e43 Michael Hanselmann
        # Check whether signal was raised
70 821d9e43 Michael Hanselmann
        if self.sigchld_handler.called:
71 821d9e43 Michael Hanselmann
          for owner in self._signal_wait:
72 821d9e43 Michael Hanselmann
            owner.OnSignal(signal.SIGCHLD)
73 821d9e43 Michael Hanselmann
          self.sigchld_handler.Clear()
74 a570e2a8 Guido Trotter
75 a570e2a8 Guido Trotter
        if self.sigterm_handler.called:
76 a570e2a8 Guido Trotter
          self.quit = True
77 a570e2a8 Guido Trotter
          self.sigterm_handler.Clear()
78 821d9e43 Michael Hanselmann
    finally:
79 821d9e43 Michael Hanselmann
      self.sigchld_handler.Reset()
80 821d9e43 Michael Hanselmann
      self.sigchld_handler = None
81 a570e2a8 Guido Trotter
      self.sigterm_handler.Reset()
82 a570e2a8 Guido Trotter
      self.sigterm_handler = None
83 a570e2a8 Guido Trotter
84 821d9e43 Michael Hanselmann
85 821d9e43 Michael Hanselmann
  def RegisterIO(self, owner, fd, condition):
86 821d9e43 Michael Hanselmann
    """Registers a receiver for I/O notifications
87 821d9e43 Michael Hanselmann

88 821d9e43 Michael Hanselmann
    The receiver must support a "OnIO(self, fd, conditions)" function.
89 821d9e43 Michael Hanselmann

90 821d9e43 Michael Hanselmann
    @type owner: instance
91 821d9e43 Michael Hanselmann
    @param owner: Receiver
92 821d9e43 Michael Hanselmann
    @type fd: int
93 821d9e43 Michael Hanselmann
    @param fd: File descriptor
94 821d9e43 Michael Hanselmann
    @type condition: int
95 821d9e43 Michael Hanselmann
    @param condition: ORed field of conditions to be notified
96 821d9e43 Michael Hanselmann
                      (see select module)
97 821d9e43 Michael Hanselmann

98 821d9e43 Michael Hanselmann
    """
99 821d9e43 Michael Hanselmann
    self._io_wait.append((owner, fd, condition))
100 821d9e43 Michael Hanselmann
101 821d9e43 Michael Hanselmann
  def RegisterSignal(self, owner):
102 821d9e43 Michael Hanselmann
    """Registers a receiver for signal notifications
103 821d9e43 Michael Hanselmann

104 821d9e43 Michael Hanselmann
    The receiver must support a "OnSignal(self, signum)" function.
105 821d9e43 Michael Hanselmann

106 821d9e43 Michael Hanselmann
    @type owner: instance
107 821d9e43 Michael Hanselmann
    @param owner: Receiver
108 821d9e43 Michael Hanselmann

109 821d9e43 Michael Hanselmann
    """
110 821d9e43 Michael Hanselmann
    self._signal_wait.append(owner)