コード例 #1
0
ファイル: test_Selector.py プロジェクト: casibbald/kamaelia
    def test_ActivityOnAnyWriterResultsInMessageOnThatWritersService(self):
        "main - Activity on a selectable results in a message appearing in the service provided to the selector for that selectable"

        MOCKSELECTORMODULE = MockSelect(results=[ ([],["LOOKINGFORTHIS"],[]), 
                                                  ([],["THENFORTHIS"],[]), 
                                                  ([],["ANDTHENFORTHIS"],[]) ])
        SELECTORMODULE.select = MOCKSELECTORMODULE
        S = Selector()
        S.activate()
        for i in xrange(100): S.next()
        D = Axon.Component.component()
        E = Axon.Component.component()
        F = Axon.Component.component()
        dummyservice1 = (D, "inbox")
        S._deliver(newWriter(S,( dummyservice1, "LOOKINGFORTHIS") ),"notify")
        dummyservice2 = (E, "inbox")
        S._deliver(newWriter(S,( dummyservice2, "THENFORTHIS") ),"notify")
        dummyservice3 = (F, "inbox")
        S._deliver(newWriter(S,( dummyservice3, "ANDTHENFORTHIS") ),"notify")

        for i in xrange(100):
            S.next();
            try:
               S.postoffice.next()
            except:
               pass
        selectable = D.recv("inbox")
        self.assertEqual(selectable,"LOOKINGFORTHIS")#, "The value returned should be the selectable we originally asked for")
        selectable = E.recv("inbox")
        self.assertEqual(selectable,"THENFORTHIS")#, "The value returned should be the selectable we originally asked for")
        selectable = F.recv("inbox")
        self.assertEqual(selectable,"ANDTHENFORTHIS")#, "The value returned should be the selectable we originally asked for")
コード例 #2
0
    def main(self):
        selectorService, selectorShutdownService, S = Selector.getSelectorServices(
            self.tracker)
        if S:
            S.activate()
        yield 1
        yield 1
        yield 1
        self.link((self, "selector"), (selectorService))

        self.send(newWriter(self, ((self, "ready"), self.fh)), "selector")

        dataPending = ""

        try:
            while 1:

                # no data pending
                if dataPending == "":
                    while not self.dataReady("inbox"):
                        self.checkShutdown(noNeedToWait=True)
                        self.pause()
                        yield 1

                    dataPending = self.recv("inbox")

                # now try to send it
                try:
                    #self.fh.write(dataPending)
                    byteswritten = os.write(self.fh.fileno(), dataPending)
                    if byteswritten >= 0:
                        dataPending = dataPending[byteswritten:]
                    # dataPending=""
                except OSError, IOError:
                    # data pending
                    # wait around until stdin is ready
                    if not self.dataReady("ready"):
                        self.send(newWriter(self, ((self, "ready"), self.fh)),
                                  "selector")
                    while not self.dataReady("ready"):
                        self.checkShutdown(noNeedToWait=False)
                        self.pause()
                        yield 1

                    self.recv("ready")

                self.checkShutdown(noNeedToWait=False)

        except UserWarning:
            pass  # ordered to shutdown!

        self.send(removeWriter(self, (self.fh)), "selector")
        try:
            self.fh.close()
        except:
            pass
        self.send(self.shutdownMsg, "signal")
コード例 #3
0
ファイル: UnixProcess2.py プロジェクト: casibbald/kamaelia
    def main(self):
        selectorService, selectorShutdownService, S = Selector.getSelectorServices(self.tracker)
        if S:
           S.activate()
        yield 1
        yield 1
        yield 1
        self.link((self, "selector"), (selectorService))

        self.send(newWriter(self,((self, "ready"), self.fh)), "selector")

        dataPending=""
        
        try:
            while 1:
                
                # no data pending
                if dataPending=="":
                    while not self.dataReady("inbox"):
                        self.checkShutdown(noNeedToWait=True)
                        self.pause()
                        yield 1
                    
                    dataPending = self.recv("inbox")
                
                # now try to send it
                try:
                    #self.fh.write(dataPending)
                    byteswritten = os.write(self.fh.fileno(),dataPending)
                    if byteswritten >= 0:
                        dataPending = dataPending[byteswritten:]
                    # dataPending=""
                except OSError,IOError:
                    # data pending
                    # wait around until stdin is ready
                    if not self.dataReady("ready"):
                        self.send(newWriter(self,((self, "ready"), self.fh)), "selector")
                    while not self.dataReady("ready"):
                        self.checkShutdown(noNeedToWait=False)
                        self.pause()
                        yield 1
                        
                    self.recv("ready")
                
                self.checkShutdown(noNeedToWait=False)
        
        except UserWarning:
            pass  # ordered to shutdown!
        
        self.send(removeWriter(self,(self.fh)), "selector")
        try:
            self.fh.close()
        except:
            pass
        self.send(self.shutdownMsg,"signal")
コード例 #4
0
   def _safesend(self, sock, data):
       """Internal only function, used for sending data, and handling EAGAIN style
       retry scenarios gracefully"""
       bytes_sent = 0
       try:
          bytes_sent = sock.send(data)
          return bytes_sent

       except socket.error:
          msg = sys.exc_info()[1]
          (errorno, errmsg) = msg.args
          if not (errorno == errno.EAGAIN or  errorno == errno.EWOULDBLOCK):
             self.connectionSENDLive = False
             self.howDied = sg
             # Print( "Oh No! Socket Died - sending!", e)

       except TypeError:
          ex = sys.exc_info()[1]

          if self.noisyErrors:
             print ("CSA: Exception sending on socket: ", ex, "(no automatic conversion to string occurs).")
          if self.crashOnBadDataToSend:
              raise ex
       self.sending = False
       if self.connectionSENDLive:
           self.send(newWriter(self, ((self, "SendReady"), sock)), "_selectorSignal")
       return bytes_sent
コード例 #5
0
ファイル: UDP_ng.py プロジェクト: 3rdandUrban-dev/Nuxleus
    def main(self):
        """ Main loop """
        self.safeBind(self.local)
        self.sock.setblocking(0)

        self.setupSelector()
        yield 1
        self.send(newWriter(self, ((self, "writeReady"), self.sock)),
                  "_selectorSignal")
        self.send(newReader(self, ((self, "readReady"), self.sock)),
                  "_selectorSignal")

        while 1:
            if self.dataReady("control"):
                msg = self.recv("control")
                if isinstance(msg, shutdownMicroprocess):
                    self.send(msg, "signal")
                    break

            if self.dataReady("writeReady"):
                self.recv("writeReady")
                self.sending = True
            if self.dataReady("readReady"):
                self.recv("readReady")
                self.receiving = True

            if self.sending:
                self.sendLoop()
            if self.receiving:
                self.recvLoop()

            if (not self.anyReady() or
                not (self.sending and len(self.sendBuffer[0]) != 0)):
                self.pause()
            yield 1
コード例 #6
0
ファイル: TCPClient.py プロジェクト: thangduong/kamaelia
    def setupCSA(self, sock):
        """\
      setupCSA(sock) -> new ConnectedSocketAdapter component

      Creates a ConnectedSocketAdapter component for the socket, and wires up to
      it. Also sends the CSA to the "selector" service.
      """
        selectorService, selectorShutdownService, newSelector = Selector.getSelectorServices(
            self.tracker)
        if newSelector:
            self.addChildren(newSelector)

        CSA = ConnectedSocketAdapter(
            sock, selectorService)  #  self.createConnectedSocket(sock)
        self.addChildren(CSA)
        self.link((self, "_selectorSignal"), selectorService)

        self.link((CSA, "CreatorFeedback"), (self, "_socketFeedback"))
        self.link((CSA, "outbox"), (self, "outbox"), passthrough=2)
        self.link((CSA, "sslready"), (self, "sslready"), passthrough=2)
        self.link((self, "inbox"), (CSA, "inbox"), passthrough=1)
        self.link((self, "makessl"), (CSA, "makessl"), passthrough=1)

        self.link((self, "control"), (CSA, "control"),
                  passthrough=1)  # propagate shutdown msgs

        self.send(newReader(CSA, ((CSA, "ReadReady"), sock)),
                  "_selectorSignal")
        self.send(newWriter(CSA, ((CSA, "SendReady"), sock)),
                  "_selectorSignal")
        self.CSA = CSA  # We need this for shutdown later

        return self.childComponents()
コード例 #7
0
    def _safesend(self, sock, data):
        """Internal only function, used for sending data, and handling EAGAIN style
       retry scenarios gracefully"""
        bytes_sent = 0
        try:
            bytes_sent = sock.send(data)
            return bytes_sent

        except socket.error:
            msg = sys.exc_info()[1]
            (errorno, errmsg) = msg.args
            if not (errorno == errno.EAGAIN or errorno == errno.EWOULDBLOCK):
                self.connectionSENDLive = False
                self.howDied = sg
                # Print( "Oh No! Socket Died - sending!", e)

        except TypeError:
            ex = sys.exc_info()[1]

            if self.noisyErrors:
                print("CSA: Exception sending on socket: ", ex,
                      "(no automatic conversion to string occurs).")
            if self.crashOnBadDataToSend:
                raise ex
        self.sending = False
        if self.connectionSENDLive:
            self.send(newWriter(self, ((self, "SendReady"), sock)),
                      "_selectorSignal")
        return bytes_sent
コード例 #8
0
    def main(self):
        """ Main loop """
        self.safeBind(self.local)
        self.sock.setblocking(0)

        self.setupSelector()
        yield 1
        self.send(newWriter(self, ((self, "writeReady"), self.sock)),
                  "_selectorSignal")
        self.send(newReader(self, ((self, "readReady"), self.sock)),
                  "_selectorSignal")

        while 1:
            if self.dataReady("control"):
                msg = self.recv("control")
                if isinstance(msg, shutdownMicroprocess):
                    self.send(msg, "signal")
                    break

            if self.dataReady("writeReady"):
                self.recv("writeReady")
                self.sending = True
            if self.dataReady("readReady"):
                self.recv("readReady")
                self.receiving = True

            if self.sending:
                self.sendLoop()
            if self.receiving:
                self.recvLoop()

            if (not self.anyReady()
                    or not (self.sending and len(self.sendBuffer[0]) != 0)):
                self.pause()
            yield 1
コード例 #9
0
   def handleNewConnection(self):
      """\
      Handle notifications from the selector service of new connection requests.

      Accepts and sets up new connections, wiring them up and passing them on via
      the "protocolHandlerSignal" outbox.
      """
      while self.dataReady("newconnection"):
         data = self.recv("newconnection")
         # If we recieve information on data ready, for a server it means we have a new connection
         # to handle
         try:
            newsock, CSA = self.createConnectedSocket(self.listener)
         except socket.error, e:
            (errorno,errmsg) = e
            if errorno != errno.EAGAIN:
               if errorno != errno.EWOULDBLOCK:
                  raise e
         else:
             pass

             self.socket_handlers[newsock] = CSA

             self.send(_ki.newCSA(self, CSA, newsock), "protocolHandlerSignal")
             self.send(newReader(CSA, ((CSA, "ReadReady"), newsock)), "_selectorSignal")            
             self.send(newWriter(CSA, ((CSA, "SendReady"), newsock)), "_selectorSignal")            
             self.addChildren(CSA)
             self.link((CSA, "CreatorFeedback"),(self,"_feedbackFromCSA"))
コード例 #10
0
ファイル: TCPClient.py プロジェクト: casibbald/kamaelia
   def setupCSA(self, sock):
      """\
      setupCSA(sock) -> new ConnectedSocketAdapter component

      Creates a ConnectedSocketAdapter component for the socket, and wires up to
      it. Also sends the CSA to the "selector" service.
      """
      selectorService, selectorShutdownService, newSelector = Selector.getSelectorServices(self.tracker)
      if newSelector:
         self.addChildren(newSelector)

      CSA = ConnectedSocketAdapter(sock, selectorService) #  self.createConnectedSocket(sock)
      self.addChildren(CSA)
      self.link((self, "_selectorSignal"),selectorService)
 
      self.link((CSA, "CreatorFeedback"),(self,"_socketFeedback"))
      self.link((CSA, "outbox"), (self, "outbox"), passthrough=2)
      self.link((CSA, "sslready"), (self, "sslready"), passthrough=2)
      self.link((self, "inbox"), (CSA, "inbox"), passthrough=1)
      self.link((self, "makessl"), (CSA, "makessl"), passthrough=1)

      self.link((self, "control"), (CSA, "control"), passthrough=1)  # propagate shutdown msgs

      self.send(newReader(CSA, ((CSA, "ReadReady"), sock)), "_selectorSignal")            
      self.send(newWriter(CSA, ((CSA, "SendReady"), sock)), "_selectorSignal")            
      self.CSA = CSA # We need this for shutdown later

      return self.childComponents()
コード例 #11
0
    def main(self):
        #       print ("self.selectorService", self, self.selectorService)
        self.link((self, "_selectorSignal"), self.selectorService)
        # self.selectorService ...
        self.sending = True
        self.receiving = True
        self.connectionRECVLive = True
        self.connectionRECVLive = True
        self.connectionSENDLive = True
        # Print( "CSA Activated")

        while self.connectionRECVLive and self.connectionSENDLive:  # Note, this means half close == close
            yield 1
            if self.dataReady("makessl"):
                #             print ("****************************************************** Making SSL ******************************************************")
                # Print( "CSA Made SSL")
                self.recv('makessl')

                self.send(removeReader(self, self.socket), "_selectorSignal")
                self.send(removeWriter(self, self.socket), "_selectorSignal")

                # We need to block to allow the handshake to complete
                self.socket.setblocking(True)
                self.socket = SSLSocket(self.socket)
                self.isSSL = True
                self.socket.setblocking(False)

                self.send(newReader(self, ((self, "ReadReady"), self.socket)),
                          "_selectorSignal")
                self.send(newWriter(self, ((self, "SendReady"), self.socket)),
                          "_selectorSignal")

                self.send('', 'sslready')
                #             print ("****************************************************** SSL IS READY ******************************************************")
                yield 1

            self.checkSocketStatus()  # To be written
            self.handleControl(
            )  # Check for producerFinished message in "control" and shutdown in response
            if self.sending:
                self.flushSendQueue()
            if self.receiving:
                self.handleReceive()
            if not self.canDoSomething():
                self.pause()

#       self.passOnShutdown()
# Print( "Stopping...")
        self.stop()
        # NOTE: the creator of this CSA is responsible for removing it from the selector

        #       print ("")
        #       print ("------------------------------------------------------------------------------------")
        #       print ("DROPPED OFF THE END OF THE GENERATOR",self.socket)
        self.socket = None
        #       print (self.__dict__)
        #       print (self.postoffice)
        #       print ([str(x) for x in self.postoffice.linkages])
        for linkage in self.postoffice.linkages:
            self.unlink(thelinkage=linkage)
コード例 #12
0
   def main(self):
#       print ("self.selectorService", self, self.selectorService)
       self.link((self, "_selectorSignal"), self.selectorService)
       # self.selectorService ...
       self.sending = True
       self.receiving = True
       self.connectionRECVLive = True
       self.connectionRECVLive = True
       self.connectionSENDLive = True
       # Print( "CSA Activated")

       while self.connectionRECVLive and self.connectionSENDLive: # Note, this means half close == close
          yield 1
          if self.dataReady("makessl"):
#             print ("****************************************************** Making SSL ******************************************************")
             # Print( "CSA Made SSL")
             self.recv('makessl')

             self.send(removeReader(self, self.socket), "_selectorSignal")
             self.send(removeWriter(self, self.socket), "_selectorSignal")

             # We need to block to allow the handshake to complete
             self.socket.setblocking(True)
             self.socket = SSLSocket(self.socket)
             self.isSSL = True
             self.socket.setblocking(False)

             self.send(newReader(self, ((self, "ReadReady"), self.socket)), "_selectorSignal")
             self.send(newWriter(self, ((self, "SendReady"), self.socket)), "_selectorSignal")

             self.send('', 'sslready')
#             print ("****************************************************** SSL IS READY ******************************************************")
             yield 1

          self.checkSocketStatus() # To be written
          self.handleControl()     # Check for producerFinished message in "control" and shutdown in response
          if self.sending:
              self.flushSendQueue()
          if self.receiving:
              self.handleReceive()
          if not self.canDoSomething():
              self.pause()
 
#       self.passOnShutdown()
       # Print( "Stopping...")
       self.stop()
       # NOTE: the creator of this CSA is responsible for removing it from the selector

#       print ("") 
#       print ("------------------------------------------------------------------------------------")
#       print ("DROPPED OFF THE END OF THE GENERATOR",self.socket)
       self.socket=None
#       print (self.__dict__)
#       print (self.postoffice)
#       print ([str(x) for x in self.postoffice.linkages])
       for linkage in self.postoffice.linkages:
           self.unlink(thelinkage=linkage)
コード例 #13
0
ファイル: NewDP.py プロジェクト: casibbald/kamaelia
 def main(self):
     selectorService, selectorShutdownService, newSelector = Selector.getSelectorServices()
     if newSelector:
         newSelector.activate()
     self.link((self, "_selectorSignal"), selectorService)
     self.send(newWriter(self, ((self, "WriteReady"), self.sock)),
               "_selectorSignal")
     
     # TODO: Make me shutdown nicely
     while 1:
         #TODO: Write me :D
         pass
コード例 #14
0
ファイル: test_Selector.py プロジェクト: thangduong/kamaelia
    def test_ActivityOnAnyWriterResultsInMessageOnThatWritersService(self):
        "main - Activity on a selectable results in a message appearing in the service provided to the selector for that selectable"

        MOCKSELECTORMODULE = MockSelect(
            results=[([], ["LOOKINGFORTHIS"],
                      []), ([], ["THENFORTHIS"],
                            []), ([], ["ANDTHENFORTHIS"], [])])
        SELECTORMODULE.select = MOCKSELECTORMODULE
        S = Selector()
        S.activate()
        for i in xrange(100):
            S.next()
        D = Axon.Component.component()
        E = Axon.Component.component()
        F = Axon.Component.component()
        dummyservice1 = (D, "inbox")
        S._deliver(newWriter(S, (dummyservice1, "LOOKINGFORTHIS")), "notify")
        dummyservice2 = (E, "inbox")
        S._deliver(newWriter(S, (dummyservice2, "THENFORTHIS")), "notify")
        dummyservice3 = (F, "inbox")
        S._deliver(newWriter(S, (dummyservice3, "ANDTHENFORTHIS")), "notify")

        for i in xrange(100):
            S.next()
            try:
                S.postoffice.next()
            except:
                pass
        selectable = D.recv("inbox")
        self.assertEqual(
            selectable, "LOOKINGFORTHIS"
        )  #, "The value returned should be the selectable we originally asked for")
        selectable = E.recv("inbox")
        self.assertEqual(
            selectable, "THENFORTHIS"
        )  #, "The value returned should be the selectable we originally asked for")
        selectable = F.recv("inbox")
        self.assertEqual(
            selectable, "ANDTHENFORTHIS"
        )  #, "The value returned should be the selectable we originally asked for")
コード例 #15
0
ファイル: NewDP.py プロジェクト: thangduong/kamaelia
    def main(self):
        selectorService, selectorShutdownService, newSelector = Selector.getSelectorServices(
        )
        if newSelector:
            newSelector.activate()
        self.link((self, "_selectorSignal"), selectorService)
        self.send(newWriter(self, ((self, "WriteReady"), self.sock)),
                  "_selectorSignal")

        # TODO: Make me shutdown nicely
        while 1:
            #TODO: Write me :D
            pass
コード例 #16
0
ファイル: UDP_ng.py プロジェクト: thangduong/kamaelia
    def main(self):
        """ Main loop """
        if not self.safeBind(self.local):
            self.send(shutdownMicroprocess,
                      "signal")  # FIXME: Should probably be producer Finished.
            yield 1
            return

        self.sock.setblocking(0)

        self.setupSelector()
        yield 1
        self.send(newWriter(self, ((self, "writeReady"), self.sock)),
                  "_selectorSignal")
        self.send(newReader(self, ((self, "readReady"), self.sock)),
                  "_selectorSignal")

        while 1:
            if self.dataReady("control"):
                msg = self.recv("control")
                if isinstance(msg, shutdownMicroprocess):
                    self.send(msg, "signal")
                    break

            if self.dataReady("target"):
                self.remote = self.recv("target")

            if self.dataReady("writeReady"):
                self.recv("writeReady")
                self.sending = True
            if self.dataReady("readReady"):
                self.recv("readReady")
                self.receiving = True

            if self.sending:
                self.sendLoop(self.remote)
            if self.receiving:
                self.recvLoop()

            if (not self.anyReady()
                    or not (self.sending and len(self.sendBuffer[0]) != 0)):
                self.pause()
            yield 1

        self.send(removeReader(self, self.sock), "_selectorSignal")
        self.send(removeWriter(self, self.sock), "_selectorSignal")
        yield 1
        self.sock.close()
コード例 #17
0
ファイル: UDP_ng.py プロジェクト: casibbald/kamaelia
    def main(self):
        """ Main loop """
        if not self.safeBind(self.local):
            self.send(shutdownMicroprocess, "signal")  # FIXME: Should probably be producer Finished.
            yield 1
            return

        self.sock.setblocking(0)

        self.setupSelector()
        yield 1
        self.send(newWriter(self, ((self, "writeReady"), self.sock)),
                  "_selectorSignal")
        self.send(newReader(self, ((self, "readReady"), self.sock)),
                  "_selectorSignal")

        while 1:
            if self.dataReady("control"):
                msg = self.recv("control")
                if isinstance(msg, shutdownMicroprocess):
                    self.send(msg, "signal")
                    break

            if self.dataReady("target"):
                self.remote = self.recv("target")

            if self.dataReady("writeReady"):
                self.recv("writeReady")
                self.sending = True
            if self.dataReady("readReady"):
                self.recv("readReady")
                self.receiving = True

            if self.sending:
                self.sendLoop(self.remote)
            if self.receiving:
                self.recvLoop()

            if (not self.anyReady() or
                not (self.sending and len(self.sendBuffer[0]) != 0)):
                self.pause()
            yield 1

        self.send(removeReader(self, self.sock), "_selectorSignal")
        self.send(removeWriter(self, self.sock), "_selectorSignal")
        yield 1
        self.sock.close()
コード例 #18
0
ファイル: UDP_ng.py プロジェクト: casibbald/kamaelia
    def main(self):
        """ Main loop """
        self.sock.setblocking(0)
        self.setupSelector()
        yield 1
        self.send(newWriter(self, ((self, "writeReady"), self.sock)),
                  "_selectorSignal")

        shutdownOnEmptyBuffer = False
        while 1:
            if self.dataReady("control"):
                msg = self.recv("control")
                if isinstance(msg, producerFinished):
                    shutdownOnEmptyBuffer = True
                if isinstance(msg, shutdownMicroprocess):
                    self.send(msg, "signal")
                    break

            # Make sure everything which could get sent does so before we
            # exit
            if shutdownOnEmptyBuffer:
                if (not self.dataReady("inbox") and
                    len(self.sendBuffer[0]) == 0):
                    self.send(producerFinished(), "signal")
                    break

            if self.dataReady("writeReady"):
                self.recv("writeReady")
                self.sending = True

            if self.sending:
                self.sendLoop(self.remote)

            # This line is sketchy.  I have a feeling it'll lead to never
            # pausing in certain circumstances.  So far it's not happened...
            if not shutdownOnEmptyBuffer:
                if (not self.anyReady() or
                    not (self.sending and len(self.sendBuffer[0]) != 0)):
                    self.pause()
            yield 1

        self.send(removeWriter(self, self.sock), "_selectorSignal")
        yield 1
        self.sock.close()
コード例 #19
0
ファイル: UDP_ng.py プロジェクト: thangduong/kamaelia
    def main(self):
        """ Main loop """
        self.sock.setblocking(0)
        self.setupSelector()
        yield 1
        self.send(newWriter(self, ((self, "writeReady"), self.sock)),
                  "_selectorSignal")

        shutdownOnEmptyBuffer = False
        while 1:
            if self.dataReady("control"):
                msg = self.recv("control")
                if isinstance(msg, producerFinished):
                    shutdownOnEmptyBuffer = True
                if isinstance(msg, shutdownMicroprocess):
                    self.send(msg, "signal")
                    break

            # Make sure everything which could get sent does so before we
            # exit
            if shutdownOnEmptyBuffer:
                if (not self.dataReady("inbox")
                        and len(self.sendBuffer[0]) == 0):
                    self.send(producerFinished(), "signal")
                    break

            if self.dataReady("writeReady"):
                self.recv("writeReady")
                self.sending = True

            if self.sending:
                self.sendLoop(self.remote)

            # This line is sketchy.  I have a feeling it'll lead to never
            # pausing in certain circumstances.  So far it's not happened...
            if not shutdownOnEmptyBuffer:
                if (not self.anyReady() or
                        not (self.sending and len(self.sendBuffer[0]) != 0)):
                    self.pause()
            yield 1

        self.send(removeWriter(self, self.sock), "_selectorSignal")
        yield 1
        self.sock.close()
コード例 #20
0
ファイル: UDP_ng.py プロジェクト: 3rdandUrban-dev/Nuxleus
    def safeSend(self, data, target):
        """
        Send data over the socket, handling errors gracefully

        Arguments:

        - data   -- the data to send over the socket
        - target -- (address, port) tuple indicating where to send the data
        """

        bytesSent = 0
        try:
            bytesSent = self.sock.sendto(data, target)
            return bytesSent
        except socket.error, socket.msg:
            (errorno, errmsg) = socket.msg.args
            if errorno == errno.AGAIN or errorno == errno.EWOULDBLOCK:
                self.send(newWriter(self, ((self, "writeReady"), self.sock)),
                          "_selectorSignal")
コード例 #21
0
    def safeSend(self, data, target):
        """
        Send data over the socket, handling errors gracefully

        Arguments:

        - data   -- the data to send over the socket
        - target -- (address, port) tuple indicating where to send the data
        """

        bytesSent = 0
        try:
            bytesSent = self.sock.sendto(data, target)
            return bytesSent
        except socket.error, socket.msg:
            (errorno, errmsg) = socket.msg.args
            if errorno == errno.AGAIN or errorno == errno.EWOULDBLOCK:
                self.send(newWriter(self, ((self, "writeReady"), self.sock)),
                          "_selectorSignal")
コード例 #22
0
ファイル: test_Selector.py プロジェクト: casibbald/kamaelia
    def test_RemoveWriter_ResultsInWriterNoLongerBeingSelectedOrWiredIn(self):
        "main - Sending a remove writer message unwires/links a component, and also removes it's selectable from the writers list"
        MOCKSELECTORMODULE = MockSelect(results=[ ([], [], [] )])
        SELECTORMODULE.select = MOCKSELECTORMODULE
        S = Selector()
        S.activate()
        for i in xrange(100): S.next()
        D = Axon.Component.component() 
        dummyservice = (D, "inbox")
        S._deliver(newWriter(S,( dummyservice, "LOOKINGFORTHIS") ),"notify")
        S._deliver(removeWriter(S,"LOOKINGFORTHIS"),"notify")

        for i in xrange(100):
            S.next();
            try:
               S.postoffice.next()
            except:
               pass
        print 
        self.assert_( len(D.inboxes["inbox"]) == 0 )
コード例 #23
0
ファイル: test_Selector.py プロジェクト: thangduong/kamaelia
    def test_RemoveWriter_ResultsInWriterNoLongerBeingSelectedOrWiredIn(self):
        "main - Sending a remove writer message unwires/links a component, and also removes it's selectable from the writers list"
        MOCKSELECTORMODULE = MockSelect(results=[([], [], [])])
        SELECTORMODULE.select = MOCKSELECTORMODULE
        S = Selector()
        S.activate()
        for i in xrange(100):
            S.next()
        D = Axon.Component.component()
        dummyservice = (D, "inbox")
        S._deliver(newWriter(S, (dummyservice, "LOOKINGFORTHIS")), "notify")
        S._deliver(removeWriter(S, "LOOKINGFORTHIS"), "notify")

        for i in xrange(100):
            S.next()
            try:
                S.postoffice.next()
            except:
                pass
        print
        self.assert_(len(D.inboxes["inbox"]) == 0)
コード例 #24
0
ファイル: UnixProcess.py プロジェクト: casibbald/kamaelia
    def main(self):
        writeBuffer = []
        shutdownMessage = False

        selectorService, selectorShutdownService, S = Selector.getSelectorServices(self.tracker)
        if S:
           S.activate()
        yield 1
        yield 1
        yield 1
        self.link((self, "selector"), (selectorService))
#        self.link((self, "selectorsignal"), (selectorShutdownService))

        x = self.openSubprocess()
        self.send(newWriter(self,((self, "stdinready"), x.stdin)), "selector")
        self.send(newReader(self,((self, "stderrready"), x.stderr)), "selector")
        self.send(newReader(self,((self, "stdoutready"), x.stdout)), "selector")
        
        # Assume all ready
        stdin_ready = 1
        stdout_ready = 1
        stderr_ready = 1

        exit_status = x.poll()       # while x.poll() is None
        success = 0
        while exit_status is None:
            exit_status = x.poll()

            if (not self.anyReady()) and not (stdin_ready + stdout_ready + stderr_ready):
#                \
#print (self.name,"Mighty Foo", stdin_ready, stdout_ready, stderr_ready, len(self.inboxes["inbox"]), len(writeBuffer))
                self.pause()
                yield 1
                continue

            while self.dataReady("inbox"):
                d = self.recv("inbox")
                writeBuffer.append(d)

            if self.dataReady("stdinready"):
                self.recv("stdinready")
                stdin_ready = 1

            if self.dataReady("stdoutready"):
                self.recv("stdoutready")
                stdout_ready = 1

            if self.dataReady("stderrready"):
                self.recv("stderrready")
                stderr_ready = 1

            if len(writeBuffer)>10000:
                writeBuffer=writeBuffer[-10000:]
            if stdin_ready:
                while len(writeBuffer) >0:
                    d = writeBuffer[0]
#                    d = writeBuffer.pop(0)
                    try:
                        count = os.write(x.stdin.fileno(), d)
                        writeBuffer.pop(0)
                        success +=1
                    except OSError:
                        e =sys.exc_info()[1]
                        success -=1
#                        \
#print (self.name,"Mighty FooBar", len(self.inboxes["inbox"]), len(writeBuffer))
                        # Stdin wasn't ready. Let's send through a newWriter request
                        # Want to wait
                        stdin_ready = 0
                        writeBuffer=writeBuffer[len(writeBuffer)/2:]
                        self.send(newWriter(self,((self, "stdinready"), x.stdin)), "selector")
#                        \
#print (self.name,"OK, we're waiting....", len(self.inboxes["inbox"]), len(writeBuffer))
                        break # Break out of this loop
                    except:
#                        \
#print (self.name,"Unexpected error whilst trying to write to stdin:")
                        print (sys.exc_info()[0] )
                        break
#                    if count != len(d):
#                        raise RuntimeError("Yay, we broke it")

            if stdout_ready:
                try:
                    Y = os.read(x.stdout.fileno(),2048)
                    if len(Y)>0:
                        self.send(Y, "outbox")
                except OSError:
                    e = sys.exc_info()[1]
#                    print ("Mighty Bingle", len(self.inboxes["inbox"]), len(writeBuffer))
                    # stdout wasn't ready. Let's send through a newReader request
                    stdout_ready = 0
                    self.send(newReader(self,((self, "stdoutready"), x.stdout)), "selector")
                except:
#                    \
#print (self.name,"Unexpected error whilst trying to read stdout:")
                    print (sys.exc_info()[0])
                    pass

            if stderr_ready: # FIXME: This needs fixing before release
                try:
                    Y = os.read(x.stderr.fileno(),2048)
# TEMPORARY DIVERSION OF STDERR TO OUTBOX TOO
#                    \
#if len(Y)>0: self.send(Y,"outbox")
## No particular plans for stderr
                except OSError:
                    e = sys.exc_info()[1]
#                    \
#print (self.name,"Mighty Jibble", len(self.inboxes["inbox"]), len(writeBuffer))
                    # stdout wasn't ready. Let's send through a newReader request
                    stderr_ready = 0
                    self.send(newReader(self,((self, "stderrready"), x.stderr)), "selector")
                except:
#                    \
#print (self.name,"Unexpected error whilst trying to read stderr:")
                    print (sys.exc_info()[0])
                    pass


            if self.dataReady("control"):
                 shutdownMessage = self.recv("control")
                 self.send(removeWriter(self,(x.stdin)), "selector")
                 yield 1
                 x.stdin.close()

            yield 1

#        \
#print (self.name,"UnixPipe finishing up")
        while  self.dataReady("stdoutready"):
#            \
#print (self.name,"flushing")
            self.recv("stdoutready")
            try:
                Y = os.read(x.stdout.fileno(),10)
                while Y:
                    self.send(Y, "outbox")
                    Y = os.read(x.stdout.fileno(),10)
#                \
#print (self.name,"Mighty Floogly")
            except OSError:
                e = sys.exc_info()[1]
                continue
            except:
                break
            yield 1

        # remove now closed file handles from the selector, so it doesn't stay
        # upset
        self.send(removeReader(self,(x.stderr)), "selector")
        self.send(removeReader(self,(x.stdout)), "selector")
        self.send(removeWriter(self,(x.stdin)), "selector")
#        \
#print (self.name,"sending shutdown")
        if not shutdownMessage:
#            \
#print (self.name,"new signal")
            self.send(Axon.Ipc.producerFinished(), "signal")
#            \
#print (self.name,"...sent")
        else:
#            \
#print (self.name,"old signal")
            self.send(shutdownMessage, "signal")
コード例 #25
0
       except socket.error, socket.msg:
          (errorno, errmsg) = socket.msg.args
          if not (errorno == errno.EAGAIN or  errorno == errno.EWOULDBLOCK):
             self.connectionSENDLive = False
             self.howDied = socket.msg

       except TypeError, ex:

          if self.noisyErrors:
             print "CSA: Exception sending on socket: ", ex, "(no automatic conversion to string occurs)."
          if self.crashOnBadDataToSend:
              raise ex
       self.sending = False
       if self.connectionSENDLive:
           self.send(newWriter(self, ((self, "SendReady"), sock)), "_selectorSignal")
       return bytes_sent
   
   def flushSendQueue(self):
       if len(self.sendQueue) > 0:
           data = self.sendQueue[0]
           bytes_sent = self._safesend(self.socket, data)
           if bytes_sent:
               if bytes_sent == len(data):
                   del self.sendQueue[0]
               else:
                   self.sendQueue[0] = data[bytes_sent:]

   def _saferecv(self, sock, size=32768):
       """Internal only function, used for recieving data, and handling EAGAIN style
       retry scenarios gracefully"""
コード例 #26
0
    def main(self):
        writeBuffer = []
        shutdownMessage = False

        selectorService, selectorShutdownService, S = Selector.getSelectorServices(self.tracker)
        if S:
           S.activate()
        yield 1
        yield 1
        yield 1
        self.link((self, "selector"), (selectorService))
#        self.link((self, "selectorsignal"), (selectorShutdownService))

        x = self.openSubprocess()
        self.send(newWriter(self,((self, "stdinready"), x.stdin)), "selector")
        self.send(newReader(self,((self, "stderrready"), x.stderr)), "selector")
        self.send(newReader(self,((self, "stdoutready"), x.stdout)), "selector")
        
        # Assume all ready
        stdin_ready = 1
        stdout_ready = 1
        stderr_ready = 1

        exit_status = x.poll()       # while x.poll() is None
        success = 0
        while exit_status is None:
            exit_status = x.poll()

            if (not self.anyReady()) and not (stdin_ready + stdout_ready + stderr_ready):
#                \
#print self.name,"Mighty Foo", stdin_ready, stdout_ready, stderr_ready, len(self.inboxes["inbox"]), len(writeBuffer)
                self.pause()
                yield 1
                continue

            while self.dataReady("inbox"):
                d = self.recv("inbox")
                writeBuffer.append(d)

            if self.dataReady("stdinready"):
                self.recv("stdinready")
                stdin_ready = 1

            if self.dataReady("stdoutready"):
                self.recv("stdoutready")
                stdout_ready = 1

            if self.dataReady("stderrready"):
                self.recv("stderrready")
                stderr_ready = 1

            if len(writeBuffer)>10000:
                writeBuffer=writeBuffer[-10000:]
            if stdin_ready:
                while len(writeBuffer) >0:
                    d = writeBuffer[0]
#                    d = writeBuffer.pop(0)
                    try:
                        count = os.write(x.stdin.fileno(), d)
                        writeBuffer.pop(0)
                        success +=1
                    except OSError, e:
                        success -=1
#                        \
#print self.name,"Mighty FooBar", len(self.inboxes["inbox"]), len(writeBuffer)
                        # Stdin wasn't ready. Let's send through a newWriter request
                        # Want to wait
                        stdin_ready = 0
                        writeBuffer=writeBuffer[len(writeBuffer)/2:]
                        self.send(newWriter(self,((self, "stdinready"), x.stdin)), "selector")
#                        \
#print self.name,"OK, we're waiting....", len(self.inboxes["inbox"]), len(writeBuffer)
                        break # Break out of this loop
                    except:
#                        \
#print self.name,"Unexpected error whilst trying to write to stdin:"
                        print sys.exc_info()[0]
                        break
コード例 #27
0
ファイル: UnixProcess.py プロジェクト: thangduong/kamaelia
    def main(self):
        writeBuffer = []
        shutdownMessage = False

        selectorService, selectorShutdownService, S = Selector.getSelectorServices(
            self.tracker)
        if S:
            S.activate()
        yield 1
        yield 1
        yield 1
        self.link((self, "selector"), (selectorService))
        #        self.link((self, "selectorsignal"), (selectorShutdownService))

        x = self.openSubprocess()
        self.send(newWriter(self, ((self, "stdinready"), x.stdin)), "selector")
        self.send(newReader(self, ((self, "stderrready"), x.stderr)),
                  "selector")
        self.send(newReader(self, ((self, "stdoutready"), x.stdout)),
                  "selector")

        # Assume all ready
        stdin_ready = 1
        stdout_ready = 1
        stderr_ready = 1

        exit_status = x.poll()  # while x.poll() is None
        success = 0
        while exit_status is None:
            exit_status = x.poll()

            if (not self.anyReady()) and not (stdin_ready + stdout_ready +
                                              stderr_ready):
                #                \
                #print (self.name,"Mighty Foo", stdin_ready, stdout_ready, stderr_ready, len(self.inboxes["inbox"]), len(writeBuffer))
                self.pause()
                yield 1
                continue

            while self.dataReady("inbox"):
                d = self.recv("inbox")
                writeBuffer.append(d)

            if self.dataReady("stdinready"):
                self.recv("stdinready")
                stdin_ready = 1

            if self.dataReady("stdoutready"):
                self.recv("stdoutready")
                stdout_ready = 1

            if self.dataReady("stderrready"):
                self.recv("stderrready")
                stderr_ready = 1

            if len(writeBuffer) > 10000:
                writeBuffer = writeBuffer[-10000:]
            if stdin_ready:
                while len(writeBuffer) > 0:
                    d = writeBuffer[0]
                    #                    d = writeBuffer.pop(0)
                    try:
                        count = os.write(x.stdin.fileno(), d)
                        writeBuffer.pop(0)
                        success += 1
                    except OSError:
                        e = sys.exc_info()[1]
                        success -= 1
                        #                        \
                        #print (self.name,"Mighty FooBar", len(self.inboxes["inbox"]), len(writeBuffer))
                        # Stdin wasn't ready. Let's send through a newWriter request
                        # Want to wait
                        stdin_ready = 0
                        writeBuffer = writeBuffer[len(writeBuffer) / 2:]
                        self.send(
                            newWriter(self, ((self, "stdinready"), x.stdin)),
                            "selector")
                        #                        \
                        #print (self.name,"OK, we're waiting....", len(self.inboxes["inbox"]), len(writeBuffer))
                        break  # Break out of this loop
                    except:
                        #                        \
                        #print (self.name,"Unexpected error whilst trying to write to stdin:")
                        print(sys.exc_info()[0])
                        break
#                    if count != len(d):
#                        raise RuntimeError("Yay, we broke it")

            if stdout_ready:
                try:
                    Y = os.read(x.stdout.fileno(), 2048)
                    if len(Y) > 0:
                        self.send(Y, "outbox")
                except OSError:
                    e = sys.exc_info()[1]
                    #                    print ("Mighty Bingle", len(self.inboxes["inbox"]), len(writeBuffer))
                    # stdout wasn't ready. Let's send through a newReader request
                    stdout_ready = 0
                    self.send(
                        newReader(self, ((self, "stdoutready"), x.stdout)),
                        "selector")
                except:
                    #                    \
                    #print (self.name,"Unexpected error whilst trying to read stdout:")
                    print(sys.exc_info()[0])
                    pass

            if stderr_ready:  # FIXME: This needs fixing before release
                try:
                    Y = os.read(x.stderr.fileno(), 2048)
# TEMPORARY DIVERSION OF STDERR TO OUTBOX TOO
#                    \
#if len(Y)>0: self.send(Y,"outbox")
## No particular plans for stderr
                except OSError:
                    e = sys.exc_info()[1]
                    #                    \
                    #print (self.name,"Mighty Jibble", len(self.inboxes["inbox"]), len(writeBuffer))
                    # stdout wasn't ready. Let's send through a newReader request
                    stderr_ready = 0
                    self.send(
                        newReader(self, ((self, "stderrready"), x.stderr)),
                        "selector")
                except:
                    #                    \
                    #print (self.name,"Unexpected error whilst trying to read stderr:")
                    print(sys.exc_info()[0])
                    pass

            if self.dataReady("control"):
                shutdownMessage = self.recv("control")
                self.send(removeWriter(self, (x.stdin)), "selector")
                yield 1
                x.stdin.close()

            yield 1

#        \
#print (self.name,"UnixPipe finishing up")
        while self.dataReady("stdoutready"):
            #            \
            #print (self.name,"flushing")
            self.recv("stdoutready")
            try:
                Y = os.read(x.stdout.fileno(), 10)
                while Y:
                    self.send(Y, "outbox")
                    Y = os.read(x.stdout.fileno(), 10)
#                \
#print (self.name,"Mighty Floogly")
            except OSError:
                e = sys.exc_info()[1]
                continue
            except:
                break
            yield 1

        # remove now closed file handles from the selector, so it doesn't stay
        # upset
        self.send(removeReader(self, (x.stderr)), "selector")
        self.send(removeReader(self, (x.stdout)), "selector")
        self.send(removeWriter(self, (x.stdin)), "selector")
        #        \
        #print (self.name,"sending shutdown")
        if not shutdownMessage:
            #            \
            #print (self.name,"new signal")
            self.send(Axon.Ipc.producerFinished(), "signal")
#            \
#print (self.name,"...sent")
        else:
            #            \
            #print (self.name,"old signal")
            self.send(shutdownMessage, "signal")
コード例 #28
0
        except socket.error, socket.msg:
            (errorno, errmsg) = socket.msg.args
            if not (errorno == errno.EAGAIN or errorno == errno.EWOULDBLOCK):
                self.connectionSENDLive = False
                self.howDied = socket.msg

        except TypeError, ex:

            if self.noisyErrors:
                print "CSA: Exception sending on socket: ", ex, "(no automatic conversion to string occurs)."
            if self.crashOnBadDataToSend:
                raise ex
        self.sending = False
        if self.connectionSENDLive:
            self.send(newWriter(self, ((self, "SendReady"), sock)),
                      "_selectorSignal")
        return bytes_sent

    def flushSendQueue(self):
        if len(self.sendQueue) > 0:
            data = self.sendQueue[0]
            bytes_sent = self._safesend(self.socket, data)
            if bytes_sent:
                if bytes_sent == len(data):
                    del self.sendQueue[0]
                else:
                    self.sendQueue[0] = data[bytes_sent:]

    def _saferecv(self, sock, size=32768):
        """Internal only function, used for recieving data, and handling EAGAIN style
コード例 #29
0
    def main(self):
        writeBuffer = []
        shutdownMessage = False

        selectorService, selectorShutdownService, S = Selector.getSelectorServices(
            self.tracker)
        if S:
            S.activate()
        yield 1
        yield 1
        yield 1
        self.link((self, "selector"), (selectorService))
        #        self.link((self, "selectorsignal"), (selectorShutdownService))

        x = self.openSubprocess()
        self.send(newWriter(self, ((self, "stdinready"), x.stdin)), "selector")
        self.send(newReader(self, ((self, "stderrready"), x.stderr)),
                  "selector")
        self.send(newReader(self, ((self, "stdoutready"), x.stdout)),
                  "selector")

        # Assume all ready
        stdin_ready = 1
        stdout_ready = 1
        stderr_ready = 1

        exit_status = x.poll()  # while x.poll() is None
        success = 0
        while exit_status is None:
            exit_status = x.poll()

            if (not self.anyReady()) and not (stdin_ready + stdout_ready +
                                              stderr_ready):
                #                \
                #print self.name,"Mighty Foo", stdin_ready, stdout_ready, stderr_ready, len(self.inboxes["inbox"]), len(writeBuffer)
                self.pause()
                yield 1
                continue

            while self.dataReady("inbox"):
                d = self.recv("inbox")
                writeBuffer.append(d)

            if self.dataReady("stdinready"):
                self.recv("stdinready")
                stdin_ready = 1

            if self.dataReady("stdoutready"):
                self.recv("stdoutready")
                stdout_ready = 1

            if self.dataReady("stderrready"):
                self.recv("stderrready")
                stderr_ready = 1

            if len(writeBuffer) > 10000:
                writeBuffer = writeBuffer[-10000:]
            if stdin_ready:
                while len(writeBuffer) > 0:
                    d = writeBuffer[0]
                    #                    d = writeBuffer.pop(0)
                    try:
                        count = os.write(x.stdin.fileno(), d)
                        writeBuffer.pop(0)
                        success += 1
                    except OSError, e:
                        success -= 1
                        #                        \
                        #print self.name,"Mighty FooBar", len(self.inboxes["inbox"]), len(writeBuffer)
                        # Stdin wasn't ready. Let's send through a newWriter request
                        # Want to wait
                        stdin_ready = 0
                        writeBuffer = writeBuffer[len(writeBuffer) / 2:]
                        self.send(
                            newWriter(self, ((self, "stdinready"), x.stdin)),
                            "selector")
                        #                        \
                        #print self.name,"OK, we're waiting....", len(self.inboxes["inbox"]), len(writeBuffer)
                        break  # Break out of this loop
                    except:
                        #                        \
                        #print self.name,"Unexpected error whilst trying to write to stdin:"
                        print sys.exc_info()[0]
                        break