Package rhn :: Module nonblocking
[hide private]
[frames] | no frames]

Source Code for Module rhn.nonblocking

 1  # 
 2  # 
 3  # 
 4   
 5  import select 
 6  import fcntl 
 7  import os 
 8   
9 -class NonBlockingFile:
10 - def __init__(self, fd):
11 # Keep a copy of the file descriptor 12 self.fd = fd 13 fcntl.fcntl(self.fd.fileno(), fcntl.F_SETFL, os.O_NDELAY) 14 # Set the callback-related stuff 15 self.read_fd_set = [] 16 self.write_fd_set = [] 17 self.exc_fd_set = [] 18 self.user_data = None 19 self.callback = None
20
21 - def set_callback(self, read_fd_set, write_fd_set, exc_fd_set, 22 user_data, callback):
23 self.read_fd_set = read_fd_set 24 # Make the objects non-blocking 25 for f in self.read_fd_set: 26 fcntl.fcntl(f.fileno(), fcntl.F_SETFL, os.O_NDELAY) 27 28 self.write_fd_set = write_fd_set 29 self.exc_fd_set = exc_fd_set 30 self.user_data = user_data 31 self.callback = callback
32
33 - def read(self, amt=0):
34 while 1: 35 status_changed = 0 36 readfds = self.read_fd_set + [self.fd] 37 writefds = self.write_fd_set 38 excfds = self.exc_fd_set 39 print("Calling select", readfds) 40 readfds, writefds, excfds = select.select(readfds, writefds, excfds) 41 print("Select returned", readfds, writefds, excfds) 42 if self.fd in readfds: 43 # Our own file descriptor has changed status 44 # Mark this, but also try to call the callback with the rest 45 # of the file descriptors that changed status 46 status_changed = 1 47 readfds.remove(self.fd) 48 if self.callback and (readfds or writefds or excfds): 49 self.callback(readfds, writefds, excfds, self.user_data) 50 if status_changed: 51 break 52 print("Returning") 53 return self.fd.read(amt)
54
55 - def write(self, data):
56 return self.fd.write(data)
57
58 - def __getattr__(self, name):
59 return getattr(self.fd, name)
60
61 -def callback(r, w, e, user_data):
62 print("Callback called", r, w, e) 63 print(r[0].read())
64 65 if __name__ == '__main__': 66 import socket 67 68 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 69 s.connect(("localhost", 5555)) 70 f = s.makefile() 71 ss = NonBlockingFile(f) 72 73 s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 74 s2.connect(("localhost", 5556)) 75 f = s2.makefile() 76 ss.set_callback([f], [], [], None, callback) 77 78 xx = ss.read() 79 print(len(xx)) 80