aboutsummaryrefslogtreecommitdiff
path: root/src/IRCBot.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/IRCBot.py')
-rw-r--r--src/IRCBot.py34
1 files changed, 15 insertions, 19 deletions
diff --git a/src/IRCBot.py b/src/IRCBot.py
index 3af9adc2..4c9e6eb5 100644
--- a/src/IRCBot.py
+++ b/src/IRCBot.py
@@ -36,14 +36,9 @@ class Bot(object):
self._rtrigger_server, self._rtrigger_client = socket.socketpair()
self._read_poll.register(self._rtrigger_server.fileno(), select.EPOLLIN)
- self._wtrigger_server, self._wtrigger_client = socket.socketpair()
- self._write_poll.register(self._wtrigger_server.fileno(),
- select.EPOLLIN)
-
self._rtrigger_lock = threading.Lock()
self._rtriggered = False
- self._wtrigger_lock = threading.Lock()
- self._wtriggered = False
+ self._write_condition = threading.Condition()
self._read_thread = None
self._write_thread = None
@@ -59,10 +54,8 @@ class Bot(object):
self._rtriggered = True
self._rtrigger_client.send(b"TRIGGER")
def trigger_write(self):
- with self._wtrigger_lock:
- if not self._wtriggered:
- self._wtriggered = True
- self._wtrigger_client.send(b"TRIGGER")
+ with self._write_condition:
+ self._write_condition.notify()
def trigger(self,
func: typing.Optional[typing.Callable[[], typing.Any]]=None,
@@ -252,18 +245,21 @@ class Bot(object):
if not self.servers:
break
- for fd, server in self.servers.items():
- if server.socket.waiting_immediate_send():
- self._write_poll.register(fd, select.EPOLLOUT)
+ with self._write_condition:
+ writeable = False
+ for fd, server in self.servers.items():
+ if server.socket.waiting_immediate_send():
+ self._write_poll.register(fd, select.EPOLLOUT)
+ writeable = True
+
+ if not writeable:
+ self._write_condition.wait()
+ continue
events = self._write_poll.poll()
+
for fd, event in events:
- if fd == self._wtrigger_server.fileno():
- # throw away data from trigger socket
- self._wtrigger_server.recv(1024)
- with self._wtrigger_lock:
- self._wtriggered = False
- elif event & select.EPOLLOUT:
+ if event & select.EPOLLOUT:
self._write_poll.unregister(fd)
if fd in self.servers:
server = self.servers[fd]