comparison server/utils.py @ 22:885532437100

A bit of work on the server python
author Matt Johnston <matt@ucc.asn.au>
date Sat, 26 May 2012 10:17:27 +0800
parents
children b5925cb4f264
comparison
equal deleted inserted replaced
21:2029633912c2 22:885532437100
1 import os
2 import sys
3 import ctypes
4 import time
5 import select
6
7 DEFAULT_TRIES = 3
8
9 __all__ = ('monotonic_time', 'retry')
10
11 clock_gettime = None
12 no_clock_gettime = False
13 def monotonic_time():
14 global clock_gettime
15 global no_clock_gettime
16 if no_clock_gettime:
17 return time.time()
18
19 class timespec(ctypes.Structure):
20 _fields_ = [
21 ('tv_sec', ctypes.c_long),
22 ('tv_nsec', ctypes.c_long)
23 ]
24 if not clock_gettime:
25 try:
26 librt = ctypes.CDLL('librt.so.0', use_errno=True)
27 clock_gettime = librt.clock_gettime
28 clock_gettime.argtypes = [ctypes.c_int, ctypes.POINTER(timespec)]
29 except:
30 print>>sys.stderr, "No clock_gettime(), using fake fallback."
31 no_clock_gettime = True
32 return time.time()
33
34 t = timespec()
35 CLOCK_MONOTONIC = 1 # see <linux/time.h>
36
37 if clock_gettime(CLOCK_MONOTONIC, ctypes.pointer(t)) != 0:
38 errno_ = ctypes.get_errno()
39 raise OSError(errno_, os.strerror(errno_))
40 return t.tv_sec + t.tv_nsec * 1e-9
41
42 # decorator, tries a number of times, returns None on failure, sleeps between
43 # Must be used as "@retry()" if arguments are defaulted
44 def retry(retries=DEFAULT_TRIES, try_time = 1):
45 def inner(func):
46 print "inner"
47 def new_f(*args, **kwargs):
48 print "newf"
49 for i in range(retries):
50 print "retry %d" % i
51 d = func(*args, **kwargs)
52 if d:
53 return d
54 time.sleep(try_time)
55 new_f.func_name = func.func_name
56 return new_f
57 return inner
58
59 def readline(sock):
60 timeout = READLINE_SELECT_TIMEOUT
61 buf = ''
62 while true:
63 (rlist, wlist, xlist) = select.select([sock], [], [], timeout)
64 if sock not in rlist:
65 # hit timeout
66 return None
67
68 c = sock.recv(1)
69 if c == '\r':
70 continue
71
72 buf.append(c)
73 if c == '\n':
74 return buf
75