Esempio n. 1
0
    def __init__(self, socket):
        TimeOut.__init__(self)
        self.to_send = None
        self.socket = socket

        # create a PriorityQueue for packets
        self.queue = PriorityQueue()
Esempio n. 2
0
class Msnifier(TimeOut):
    'Rate limiting MSN packet consumer.'

    def __init__(self, socket):
        TimeOut.__init__(self)
        self.to_send = None
        self.socket = socket

        # create a PriorityQueue for packets
        self.queue = PriorityQueue()

    def send_pkt(self, pkt, priority=5, **kw):

        with self._cv:
            self.queue.append((pkt, kw), priority)
            #self._cv.notifyAll()

    def compute_timeout(self):
        if self._finished:
            self._last_computed = -1
        else:
            self._last_computed = 5
            (pkt, kw) = self.next_pkt()
            if pkt is not None:
                self._last_computed = self.socket.time_to_send(str(pkt))
                self.queue.append((iter([pkt]), kw), priority=1)

        return self._last_computed

    def process(self):
        pkt, kw = self.next_pkt()

        if pkt is not None:
            callback = kw.pop('callback', None)
            if not self.socket._send(str(pkt), **kw):
                getattr(callback, 'error', lambda: None)()
            else:
                log.warning("calling after_send: %r",
                            getattr(callback, 'after_send', None))
                getattr(callback, 'after_send', lambda: None)()

    def next_pkt(self):
        pkt = None
        kw = {}
        q = self.queue
        while pkt is None and q:
            try:
                x, kw = q.peek()
                try:
                    pkt = x.next()
                except AttributeError:
                    pkt, kw = q.next(
                    )  # this is x, but now we are removing it from the queue
            except (GeneratorExit, StopIteration, ValueError):
                # head of q is a completed generator, remove it
                q.next()

        return pkt, kw
Esempio n. 3
0
class Msnifier(TimeOut):
    'Rate limiting MSN packet consumer.'

    def __init__(self, socket):
        TimeOut.__init__(self)
        self.to_send = None
        self.socket = socket

        # create a PriorityQueue for packets
        self.queue = PriorityQueue()

    def send_pkt(self, pkt, priority=5, **kw):

        with self._cv:
            self.queue.append((pkt, kw), priority)
            #self._cv.notifyAll()

    def compute_timeout(self):
        if self._finished:
            self._last_computed = -1
        else:
            self._last_computed = 5
            (pkt, kw) = self.next_pkt()
            if pkt is not None:
                self._last_computed = self.socket.time_to_send(str(pkt))
                self.queue.append((iter([pkt]), kw), priority=1)

        return self._last_computed

    def process(self):
        pkt, kw = self.next_pkt()

        if pkt is not None:
            callback = kw.pop('callback', None)
            if not self.socket._send(str(pkt), **kw):
                getattr(callback, 'error', lambda: None)()
            else:
                log.warning("calling after_send: %r", getattr(callback, 'after_send', None))
                getattr(callback, 'after_send', lambda: None)()

    def next_pkt(self):
        pkt = None
        kw = {}
        q = self.queue
        while pkt is None and q:
            try:
                x, kw = q.peek()
                try:
                    pkt = x.next()
                except AttributeError:
                    pkt, kw = q.next() # this is x, but now we are removing it from the queue
            except (GeneratorExit, StopIteration, ValueError):
                # head of q is a completed generator, remove it
                q.next()

        return pkt, kw
Esempio n. 4
0
 def __init__(self, socket):
     TimeOut.__init__(self)
     self.socket = socket
     # create a PriorityQueue for each rate class
     self.queues = [
         PriorityQueue() for __ in xrange(len(socket.rate_classes))
     ]
Esempio n. 5
0
    def __init__(self, socket):
        TimeOut.__init__(self)
        self.to_send = None
        self.socket = socket

        # create a PriorityQueue for packets
        self.queue = PriorityQueue()