8000 Resource database fully functional. A first attempt at making the li… · python-xlib/python-xlib@d5456bd · GitHub 7FFF
[go: up one dir, main page]

Skip to content

Commit d5456bd

Browse files
committed
Resource database fully functional. A first attempt at making the library (optionally) threadsafe.
1 parent b484759 commit d5456bd

File tree

8 files changed

+969
-190
lines changed

8 files changed

+969
-190
lines changed

Xlib/protocol/display.py

Lines changed: 260 additions & 75 deletions
Large diffs are not rendered by default.

Xlib/protocol/rq.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# $Id: rq.py,v 1.2 2000-08-07 10:30:19 petli Exp $
1+
# $Id: rq.py,v 1.3 2000-08-14 10:51:37 petli Exp $
22
#
33
# Xlib.protocol.rq -- structure primitives for request, events and errors
44
#
@@ -29,6 +29,7 @@
2929

3030
# Xlib modules
3131
from Xlib import X
32+
from Xlib.support import lock
3233

3334
class BadDataError(Exception): pass
3435

@@ -1104,6 +1105,8 @@ def __init__(self, display, defer = 0, *args, **keys):
11041105
self._serial = None
11051106
self._data = None
11061107
self._error = None
1108+
1109+
self._response_lock = lock.allocate_lock()
11071110

11081111
self._display.send_request(self, 1)
11091112
if not defer:
@@ -1113,20 +1116,31 @@ def reply(self):
11131116
# Send request and wait for reply if we hasn't
11141117
# already got one. This means that reply() can safely
11151118
# be called more than one time.
1116-
1117-
if self._data is None and self._error is None:
1119+
1120+
self._response_lock.acquire()
1121+
while self._data is None and self._error is None:
1122+
self._display.send_recv_lock.acquire()
1123+
self._response_lock.release()
1124+
11181125
self._display.send_and_recv(request = self._serial)
1119-
del self._display
1126+
self._response_lock.acquire()
1127+
1128+
self._response_lock.release()
1129+
self._display = None
11201130

1121-
# If error has been set, raise it
1122-
if self._error:
1123-
raise self._error
1131+
# If error has been set, raise it
1132+
if self._error:
1133+
raise self._error
11241134

11251135
def _parse_response(self, data):
1136+
self._response_lock.acquire()
11261137
self._data, d = self._reply.parse_binary(data, self._display, rawdict = 1)
1138+
self._response_lock.release()
11271139

11281140
def _set_error(self, error):
1141+
self._response_lock.acquire()
11291142
self._error = error
1143+
self._response_lock.release()
11301144

11311145
def __repr__(self):
11321146
return '<%s serial = %s, data = %s, error = %s>' % (self.__class__, self._serial, self._data, self._error)

0 commit comments

Comments
 (0)
0