Переход на асинхронное закрытие каналов с таймаутом, чтобы при обрыве соединения...
[vpproxy.git] / clientcounter.py
1 '''
2 Simple Client Counter for VLC VLM
3 '''
4
5 import gevent
6 import logging
7
8 class ClientCounter(object):
9
10     def __init__(self):
11         self.clients = dict()
12         self._lock = gevent.coros.RLock()
13         self.total = 0
14
15     def get(self, id):
16         return self.clients.get(id, (False,))[0]
17
18     def add(self, id, ip, unic):
19         self._lock.acquire()
20         logger = logging.getLogger('clientcounter_Add')
21         if self.clients.has_key(id):
22             self.clients[id][0] += 1
23             self.clients[id][1].append([ip,unic])
24             logger.info('counter for %s incremented to %s' % (id,self.clients[id][0]))
25         else:
26             self.clients[id] = [1, [[ip,unic]]]
27             logger.info('counter for %s started (1)' % id)
28
29         self.total += 1
30         logger.info('total count = %s' % self.total)
31
32         self._lock.release()
33         return self.clients[id][0]
34
35     def delete(self, id, ip, unic):
36         self._lock.acquire()
37         logger = logging.getLogger('clientcounter_Del')
38         if self.clients.has_key(id):
39             self.total -= 1
40             logger.info('total count = %s' % self.total)
41             if self.clients[id][0] == 1:
42                 del self.clients[id]
43                 logger.info('counter for %s decremented to zero' % id )
44                 self._lock.release()
45                 return False
46             else:
47                 self.clients[id][0] -= 1
48                 self.clients[id][1].remove([ip,unic])
49                 logger.info('counter for %s decremented to %s' % (id,self.clients[id][0]))
50         else:
51             self._lock.release()
52             return False
53
54         self._lock.release()
55         return self.clients[id][0]