aboutsummaryrefslogtreecommitdiff
path: root/src/IRCSocket.py
diff options
context:
space:
mode:
authorGravatar jesopo2019-07-04 06:56:05 +0100
committerGravatar jesopo2019-07-04 06:56:05 +0100
commit3afbe5fd8208ee5f8939f534dad3f4dce26bfd5b (patch)
tree7f8e09852ecfc84c9f009d8206b3766ec9f8edf5 /src/IRCSocket.py
parentuse stdout.append_prefix to put user nickname in without color (diff)
signature
threading.Lock() around any access to _write_buffer
Diffstat (limited to 'src/IRCSocket.py')
-rw-r--r--src/IRCSocket.py48
1 files changed, 26 insertions, 22 deletions
diff --git a/src/IRCSocket.py b/src/IRCSocket.py
index f33227be..059c8515 100644
--- a/src/IRCSocket.py
+++ b/src/IRCSocket.py
@@ -1,4 +1,4 @@
-import datetime, socket, ssl, time, typing
+import datetime, socket, ssl, time, threading, typing
from src import IRCLine, Logging, IRCObject, utils
THROTTLE_LINES = 4
@@ -25,6 +25,7 @@ class Socket(IRCObject.Object):
self.connected = False
self._write_buffer = b""
+ self._write_buffer_lock = threading.Lock()
self._queued_lines = [] # type: typing.List[IRCLine.SentLine]
self._buffered_lines = [] # type: typing.List[IRCLine.SentLine]
self._read_buffer = b""
@@ -124,34 +125,37 @@ class Socket(IRCObject.Object):
self._buffered_lines.append(line)
def send(self, line: IRCLine.SentLine, immediate: bool=False):
- if immediate:
- self._immediate_buffer(line)
- else:
- self._queued_lines.append(line)
+ with self._write_buffer_lock:
+ if immediate:
+ self._immediate_buffer(line)
+ else:
+ self._queued_lines.append(line)
def _fill_throttle(self):
- if not self._write_buffer and self._throttle_when_empty:
- self._throttle_when_empty = False
- self._write_throttling = True
- self._recent_sends.clear()
+ with self._write_buffer_lock:
+ if not self._write_buffer and self._throttle_when_empty:
+ self._throttle_when_empty = False
+ self._write_throttling = True
+ self._recent_sends.clear()
- throttle_space = self.throttle_space()
- if throttle_space:
- to_buffer = self._queued_lines[:throttle_space]
- self._queued_lines = self._queued_lines[throttle_space:]
- for line in to_buffer:
- self._immediate_buffer(line)
+ throttle_space = self.throttle_space()
+ if throttle_space:
+ to_buffer = self._queued_lines[:throttle_space]
+ self._queued_lines = self._queued_lines[throttle_space:]
+ for line in to_buffer:
+ self._immediate_buffer(line)
def _send(self) -> typing.List[IRCLine.SentLine]:
- bytes_written_i = self._socket.send(self._write_buffer)
- bytes_written = self._write_buffer[:bytes_written_i]
-
- sent_lines_count = bytes_written.count(b"\n")
sent_lines = [] # type: typing.List[IRCLine.SentLine]
- for i in range(sent_lines_count):
- sent_lines.append(self._buffered_lines.pop(0))
+ with self._write_buffer_lock:
+ bytes_written_i = self._socket.send(self._write_buffer)
+ bytes_written = self._write_buffer[:bytes_written_i]
+
+ sent_lines_count = bytes_written.count(b"\n")
+ for i in range(sent_lines_count):
+ sent_lines.append(self._buffered_lines.pop(0))
- self._write_buffer = self._write_buffer[bytes_written_i:]
+ self._write_buffer = self._write_buffer[bytes_written_i:]
self.bytes_written += bytes_written_i