Mercurial > public > mercurial-scm > hg
comparison mercurial/keepalive.py @ 41408:a43acfa2b76d
keepalive: use collections.defaultdict for host map
Cleaning up the code as part of debugging Python 3 issues.
Differential Revision: https://phab.mercurial-scm.org/D5718
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sat, 26 Jan 2019 13:39:18 -0800 |
parents | 348352658e4b |
children | 1db94ebbc207 |
comparison
equal
deleted
inserted
replaced
41407:6e9bebb65ce7 | 41408:a43acfa2b76d |
---|---|
82 | 82 |
83 # $Id: keepalive.py,v 1.14 2006/04/04 21:00:32 mstenner Exp $ | 83 # $Id: keepalive.py,v 1.14 2006/04/04 21:00:32 mstenner Exp $ |
84 | 84 |
85 from __future__ import absolute_import, print_function | 85 from __future__ import absolute_import, print_function |
86 | 86 |
87 import collections | |
87 import errno | 88 import errno |
88 import hashlib | 89 import hashlib |
89 import socket | 90 import socket |
90 import sys | 91 import sys |
91 import threading | 92 import threading |
112 The connection manager must be able to: | 113 The connection manager must be able to: |
113 * keep track of all existing | 114 * keep track of all existing |
114 """ | 115 """ |
115 def __init__(self): | 116 def __init__(self): |
116 self._lock = threading.Lock() | 117 self._lock = threading.Lock() |
117 self._hostmap = {} # map hosts to a list of connections | 118 self._hostmap = collections.defaultdict(list) # host -> [connection] |
118 self._connmap = {} # map connections to host | 119 self._connmap = {} # map connections to host |
119 self._readymap = {} # map connection to ready state | 120 self._readymap = {} # map connection to ready state |
120 | 121 |
121 def add(self, host, connection, ready): | 122 def add(self, host, connection, ready): |
122 self._lock.acquire() | 123 self._lock.acquire() |
123 try: | 124 try: |
124 if host not in self._hostmap: | |
125 self._hostmap[host] = [] | |
126 self._hostmap[host].append(connection) | 125 self._hostmap[host].append(connection) |
127 self._connmap[connection] = host | 126 self._connmap[connection] = host |
128 self._readymap[connection] = ready | 127 self._readymap[connection] = ready |
129 finally: | 128 finally: |
130 self._lock.release() | 129 self._lock.release() |
153 | 152 |
154 def get_ready_conn(self, host): | 153 def get_ready_conn(self, host): |
155 conn = None | 154 conn = None |
156 self._lock.acquire() | 155 self._lock.acquire() |
157 try: | 156 try: |
158 if host in self._hostmap: | 157 for c in self._hostmap[host]: |
159 for c in self._hostmap[host]: | 158 if self._readymap[c]: |
160 if self._readymap[c]: | 159 self._readymap[c] = 0 |
161 self._readymap[c] = 0 | 160 conn = c |
162 conn = c | 161 break |
163 break | |
164 finally: | 162 finally: |
165 self._lock.release() | 163 self._lock.release() |
166 return conn | 164 return conn |
167 | 165 |
168 def get_all(self, host=None): | 166 def get_all(self, host=None): |
169 if host: | 167 if host: |
170 return list(self._hostmap.get(host, [])) | 168 return list(self._hostmap[host]) |
171 else: | 169 else: |
172 return dict(self._hostmap) | 170 return dict(self._hostmap) |
173 | 171 |
174 class KeepAliveHandler(object): | 172 class KeepAliveHandler(object): |
175 def __init__(self, timeout=None): | 173 def __init__(self, timeout=None): |