From 68aafbde35232a0d0a1a5504960670e9481f5fea Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Tue, 7 Jun 2011 09:25:46 +0100 Subject: [PATCH] Added locking for IO, avoid call collisions on multithreaded applications --- ts3/__init__.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ts3/__init__.py b/ts3/__init__.py index 11c38ca..c065b80 100644 --- a/ts3/__init__.py +++ b/ts3/__init__.py @@ -28,6 +28,7 @@ import time import telnetlib import logging +from threading import Lock from defines import * @@ -85,6 +86,8 @@ class TS3Response(): class TS3Proto(): + io_lock = Lock() + @property def logger(self): if not hasattr(self, "_logger"): @@ -92,6 +95,7 @@ class TS3Proto(): return self._logger def connect(self, ip, port=10011, timeout=5): + self.io_lock.acquire() try: self._telnet = telnetlib.Telnet(ip, port) except telnetlib.socket.error: @@ -99,9 +103,10 @@ class TS3Proto(): self._timeout = timeout self._connected = False - + data = self._telnet.read_until("\n\r", self._timeout) - + self.io_lock.release() + if data.endswith("TS3\n\r"): self._connected = True @@ -120,10 +125,13 @@ class TS3Proto(): commandstr = self.construct_command(command, keys=keys, opts=opts) self.logger.debug("send_command - %s" % commandstr) + + self.io_lock.acquire() self._telnet.write("%s\n\r" % commandstr) data = "" response = self._telnet.read_until("\n\r", self._timeout) + self.io_lock.release() if not response.startswith("error"): # what we just got was extra data