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#
2929
3030# Xlib modules
3131from Xlib import X
32+ from Xlib .support import lock
3233
3334class 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