Revision 565fe4c4

b/lib/daemon.py
41 41

  
42 42
    """
43 43
    self._io_wait = {}
44
    self._io_wait_add = []
45
    self._io_wait_remove = []
46 44
    self._signal_wait = []
45
    self._poller = select.poll()
47 46

  
48 47
  def Run(self, handle_sigchld=True, handle_sigterm=True, stop_on_empty=False):
49 48
    """Runs the mainloop.
......
57 56
                          unregistered
58 57

  
59 58
    """
60
    poller = select.poll()
61

  
62 59
    # Setup signal handlers
63 60
    if handle_sigchld:
64 61
      sigchld_handler = utils.SignalHandler([signal.SIGCHLD])
......
75 72

  
76 73
        # Start actual main loop
77 74
        while running:
78
          # Entries could be added again afterwards, hence removing first
79
          if self._io_wait_remove:
80
            for fd in self._io_wait_remove:
81
              try:
82
                poller.unregister(fd)
83
              except KeyError:
84
                pass
85
              try:
86
                del self._io_wait[fd]
87
              except KeyError:
88
                pass
89
            self._io_wait_remove = []
90

  
91
          # Add new entries
92
          if self._io_wait_add:
93
            for (owner, fd, conditions) in self._io_wait_add:
94
              self._io_wait[fd] = owner
95
              poller.register(fd, conditions)
96
            self._io_wait_add = []
97

  
98 75
          # Stop if nothing is listening anymore
99 76
          if stop_on_empty and not (self._io_wait):
100 77
            break
101 78

  
102 79
          # Wait for I/O events
103 80
          try:
104
            io_events = poller.poll(None)
81
            io_events = self._poller.poll(None)
105 82
          except select.error, err:
106 83
            # EINTR can happen when signals are sent
107 84
            if err.args and err.args[0] in (errno.EINTR,):
......
161 138
    assert isinstance(fd, (int, long)), \
162 139
      "Only integers are supported for file descriptors"
163 140

  
164
    self._io_wait_add.append((owner, fd, condition))
165

  
166
  def UnregisterIO(self, fd):
167
    """Unregister a file descriptor.
168

  
169
    It'll be unregistered the next time the mainloop checks for it.
170

  
171
    @type fd: int
172
    @param fd: File descriptor
173

  
174
    """
175
    # select.Poller also supports file() like objects, but we don't.
176
    assert isinstance(fd, (int, long)), \
177
      "Only integers are supported for file descriptors"
178

  
179
    self._io_wait_remove.append(fd)
141
    self._io_wait[fd] = owner
142
    self._poller.register(fd, condition)
180 143

  
181 144
  def RegisterSignal(self, owner):
182 145
    """Registers a receiver for signal notifications

Also available in: Unified diff