Bugfix: Start the server anyway, even if we failed to bind listener(s)
[bitcoin:eloipool.git] / util.py
1 from hashlib import sha256
2 from struct import unpack
3 import traceback
4
5 def dblsha(b):
6         return sha256(sha256(b).digest()).digest()
7
8 def swap32(b):
9         o = b''
10         for i in range(0, len(b), 4):
11                 o += b[i + 3:i - 1 if i else None:-1]
12         return o
13
14 def Bits2Target(bits):
15         return unpack('<L', bits[:3] + b'\0')[0] * 2**(8*(bits[3] - 3))
16
17 def hash2int(h):
18         n = unpack('<QQQQ', h)
19         n = (n[3] << 192) | (n[2] << 128) | (n[1] << 64) | n[0]
20         return n
21
22 def tryErr(func, *a, **kw):
23         IE = kw.pop('IgnoredExceptions', BaseException)
24         logger = kw.pop('Logger', None)
25         emsg = kw.pop('ErrorMsg', None)
26         try:
27                 return func(*a, **kw)
28         except IE:
29                 if logger:
30                         emsg = "%s\n" % (emsg,) if emsg else ""
31                         emsg += traceback.format_exc()
32                         logger.error(emsg)
33                 return None
34
35 class RejectedShare(ValueError):
36         pass
37
38
39 import heapq
40
41 class ScheduleDict:
42         def __init__(self):
43                 self._dict = {}
44                 self._build_heap()
45         
46         def _build_heap(self):
47                 newheap = list((v[0], k, v[1]) for k, v in self._dict.values())
48                 heapq.heapify(newheap)
49                 self._heap = newheap
50         
51         def nextTime(self):
52                 while True:
53                         (t, k, o) = self._heap[0]
54                         if k in self._dict:
55                                 break
56                         heapq.heappop(self._heap)
57                 return t
58         
59         def shift(self):
60                 while True:
61                         (t, k, o) = heapq.heappop(self._heap)
62                         if k in self._dict:
63                                 break
64                 del self._dict[k]
65                 return o
66         
67         def __setitem__(self, o, t):
68                 k = id(o)
69                 self._dict[k] = (t, o)
70                 if len(self._heap) / 2 > len(self._dict):
71                         self._build_heap()
72                 else:
73                         heapq.heappush(self._heap, (t, k, o))
74         
75         def __getitem__(self, o):
76                 return self._dict[id(o)][0]
77         
78         def __delitem__(self, o):
79                 del self._dict[id(o)]
80                 if len(self._dict) < 2:
81                         self._build_heap()
82         
83         def __len__(self):
84                 return len(self._dict)