rb-kqueue 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/lib/rb-kqueue.rb +1 -1
- data/lib/rb-kqueue/native.rb +3 -0
- data/lib/rb-kqueue/queue.rb +16 -4
- data/lib/rb-kqueue/watcher/file.rb +36 -1
- data/lib/rb-kqueue/watcher/read_write.rb +12 -0
- data/lib/rb-kqueue/watcher/socket_read_write.rb +5 -0
- data/rb-kqueue.gemspec +1 -1
- metadata +1 -1
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.0. | 
| 1 | 
            +
            0.0.3
         | 
    
        data/lib/rb-kqueue.rb
    CHANGED
    
    | @@ -13,7 +13,7 @@ require 'rb-kqueue/queue' | |
| 13 13 | 
             
            # * {Watcher} -- A watcher for a single sort of event
         | 
| 14 14 | 
             
            # * {Event} -- A notification that an event has occurred
         | 
| 15 15 | 
             
            module KQueue
         | 
| 16 | 
            -
              VERSION = [0, 0,  | 
| 16 | 
            +
              VERSION = [0, 0, 3]
         | 
| 17 17 |  | 
| 18 18 | 
             
              # Raise an exception for a native kqueue error.
         | 
| 19 19 | 
             
              #
         | 
    
        data/lib/rb-kqueue/native.rb
    CHANGED
    
    
    
        data/lib/rb-kqueue/queue.rb
    CHANGED
    
    | @@ -66,6 +66,10 @@ module KQueue | |
| 66 66 | 
             
                # The {Event#data} field is set to the number of bytes available.
         | 
| 67 67 | 
             
                # When the last writer disconnects, {Event#eof?} will be set.
         | 
| 68 68 | 
             
                #
         | 
| 69 | 
            +
                # Note that this isn't compatible with JRuby
         | 
| 70 | 
            +
                # unless a native-code file descriptor is passed in.
         | 
| 71 | 
            +
                # This means the file descriptor must be returned by an FFI-wrapped C function.
         | 
| 72 | 
            +
                #
         | 
| 69 73 | 
             
                # @param fd [IO, Fixnum] A Ruby IO stream, or the file descriptor
         | 
| 70 74 | 
             
                #   for a native IO stream.
         | 
| 71 75 | 
             
                # @yield [event] A block that will be run when the specified stream
         | 
| @@ -75,7 +79,6 @@ module KQueue | |
| 75 79 | 
             
                # @return [Watcher] The Watcher for this event.
         | 
| 76 80 | 
             
                # @raise [SystemCallError] If something goes wrong when registering the Watcher.
         | 
| 77 81 | 
             
                def watch_stream_for_read(fd, &callback)
         | 
| 78 | 
            -
                  fd = fd.fileno if fd.respond_to?(:fileno)
         | 
| 79 82 | 
             
                  Watcher::ReadWrite.new(self, fd, :read, callback)
         | 
| 80 83 | 
             
                end
         | 
| 81 84 |  | 
| @@ -97,6 +100,10 @@ module KQueue | |
| 97 100 | 
             
                # It's possible for {Event#eof?} to be set while there's still
         | 
| 98 101 | 
             
                # data pending in the socket buffer.
         | 
| 99 102 | 
             
                #
         | 
| 103 | 
            +
                # Note that this isn't compatible with JRuby
         | 
| 104 | 
            +
                # unless a native-code file descriptor is passed in.
         | 
| 105 | 
            +
                # This means the file descriptor must be returned by an FFI-wrapped C function.
         | 
| 106 | 
            +
                #
         | 
| 100 107 | 
             
                # @param fd [Socket, Fixnum] A Ruby Socket, or the file descriptor
         | 
| 101 108 | 
             
                #   for a native Socket.
         | 
| 102 109 | 
             
                # @param low_water [Fixnum] The low-water mark for new data.
         | 
| @@ -107,7 +114,6 @@ module KQueue | |
| 107 114 | 
             
                # @return [Watcher] The Watcher for this event.
         | 
| 108 115 | 
             
                # @raise [SystemCallError] If something goes wrong when registering the Watcher.
         | 
| 109 116 | 
             
                def watch_socket_for_read(fd, low_water = nil, &callback)
         | 
| 110 | 
            -
                  fd = fd.fileno if fd.respond_to?(:fileno)
         | 
| 111 117 | 
             
                  Watcher::SocketReadWrite.new(self, fd, :read, low_water, callback)
         | 
| 112 118 | 
             
                end
         | 
| 113 119 |  | 
| @@ -119,6 +125,10 @@ module KQueue | |
| 119 125 | 
             
                # remaining in the write buffer.
         | 
| 120 126 | 
             
                # When the reader disconnects, {Event#eof?} will be set.
         | 
| 121 127 | 
             
                #
         | 
| 128 | 
            +
                # Note that this isn't compatible with JRuby
         | 
| 129 | 
            +
                # unless a native-code file descriptor is passed in.
         | 
| 130 | 
            +
                # This means the file descriptor must be returned by an FFI-wrapped C function.
         | 
| 131 | 
            +
                #
         | 
| 122 132 | 
             
                # @param fd [IO, Fixnum] A Ruby IO stream, or the file descriptor
         | 
| 123 133 | 
             
                #   for a native IO stream.
         | 
| 124 134 | 
             
                # @yield [event] A block that will be run when the specified stream
         | 
| @@ -128,7 +138,6 @@ module KQueue | |
| 128 138 | 
             
                # @return [Watcher] The Watcher for this event.
         | 
| 129 139 | 
             
                # @raise [SystemCallError] If something goes wrong when registering the Watcher.
         | 
| 130 140 | 
             
                def watch_stream_for_write(fd, &callback)
         | 
| 131 | 
            -
                  fd = fd.fileno if fd.respond_to?(:fileno)
         | 
| 132 141 | 
             
                  Watcher::ReadWrite.new(self, fd, :write, callback)
         | 
| 133 142 | 
             
                end
         | 
| 134 143 |  | 
| @@ -146,6 +155,10 @@ module KQueue | |
| 146 155 | 
             
                # It's possible for {Event#eof?} to be set while there's still
         | 
| 147 156 | 
             
                # data pending in the socket buffer.
         | 
| 148 157 | 
             
                #
         | 
| 158 | 
            +
                # Note that this isn't compatible with JRuby
         | 
| 159 | 
            +
                # unless a native-code file descriptor is passed in.
         | 
| 160 | 
            +
                # This means the file descriptor must be returned by an FFI-wrapped C function.
         | 
| 161 | 
            +
                #
         | 
| 149 162 | 
             
                # @param fd [Socket, Fixnum] A Ruby Socket, or the file descriptor
         | 
| 150 163 | 
             
                #   for a native Socket.
         | 
| 151 164 | 
             
                # @param low_water [Fixnum] The low-water mark for new data.
         | 
| @@ -156,7 +169,6 @@ module KQueue | |
| 156 169 | 
             
                # @return [Watcher] The Watcher for this event.
         | 
| 157 170 | 
             
                # @raise [SystemCallError] If something goes wrong when registering the Watcher.
         | 
| 158 171 | 
             
                def watch_socket_for_write(fd, low_water = nil, &callback)
         | 
| 159 | 
            -
                  fd = fd.fileno if fd.respond_to?(:fileno)
         | 
| 160 172 | 
             
                  Watcher::SocketReadWrite.new(self, fd, :write, low_water, callback)
         | 
| 161 173 | 
             
                end
         | 
| 162 174 |  | 
| @@ -13,7 +13,42 @@ module KQueue | |
| 13 13 | 
             
                  # @private
         | 
| 14 14 | 
             
                  def initialize(queue, path, flags, callback)
         | 
| 15 15 | 
             
                    @path = path
         | 
| 16 | 
            -
                    @ | 
| 16 | 
            +
                    @fd = Native.open(path, 0) # 0 means "read only"
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    if @fd < 0
         | 
| 19 | 
            +
                      raise SystemCallError.new(
         | 
| 20 | 
            +
                        "Failed to open file #{path}" +
         | 
| 21 | 
            +
                        case FFI.errno
         | 
| 22 | 
            +
                        when Errno::EACCES::Errno; ": Permission denied."
         | 
| 23 | 
            +
                        when Errno::EAGAIN::Errno; ": Slave side of a locked pseudo-terminal device."
         | 
| 24 | 
            +
                        when Errno::EFAULT::Errno; ": Outside the process's allocated address space."
         | 
| 25 | 
            +
                        when Errno::EINTR::Errno; ": Interrupted."
         | 
| 26 | 
            +
                        when Errno::ELOOP::Errno; ": Too many symbolic links (possible loop)."
         | 
| 27 | 
            +
                        when Errno::EMFILE::Errno; ": Too many open files."
         | 
| 28 | 
            +
                        when Errno::ENAMETOOLONG::Errno; ": Name too long."
         | 
| 29 | 
            +
                        when Errno::ENFILE::Errno; ": System file table is full."
         | 
| 30 | 
            +
                        when Errno::ENOENT::Errno; ": File doesn't exist."
         | 
| 31 | 
            +
                        when Errno::ENOTDIR::Errno; ": A component of the path prefix is not a directory."
         | 
| 32 | 
            +
                        when Errno::ENXIO::Errno; ": The device associated with this file doesn't exist."
         | 
| 33 | 
            +
                        when Errno::EOPNOTSUPP::Errno; ": File type not supported."
         | 
| 34 | 
            +
                        when Errno::EOVERFLOW::Errno; ": File too big."
         | 
| 35 | 
            +
                        else; ""
         | 
| 36 | 
            +
                        end,
         | 
| 37 | 
            +
                        FFI.errno)
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                    ObjectSpace.define_finalizer(self, lambda do
         | 
| 41 | 
            +
                        next unless Native.close(@fd) < 0
         | 
| 42 | 
            +
                        raise SystemCallError.new(
         | 
| 43 | 
            +
                          "Failed to close file #{path}" +
         | 
| 44 | 
            +
                          case FFI.errno
         | 
| 45 | 
            +
                          when Errno::EBADF::Errno; ": Invalid file descriptor."
         | 
| 46 | 
            +
                          when Errno::EINTR::Errno; ": Closing interrupted."
         | 
| 47 | 
            +
                          when Errno::EIO::Errno; ": IO error."
         | 
| 48 | 
            +
                          else; ""
         | 
| 49 | 
            +
                          end,
         | 
| 50 | 
            +
                          FFI.errno)
         | 
| 51 | 
            +
                      end)
         | 
| 17 52 | 
             
                    super(queue, @file.fileno, :vnode, flags, nil, callback)
         | 
| 18 53 | 
             
                  end
         | 
| 19 54 | 
             
                end
         | 
| @@ -9,6 +9,13 @@ module KQueue | |
| 9 9 | 
             
                # Note that read and write events for sockets
         | 
| 10 10 | 
             
                # use the {SocketReadWrite} class.
         | 
| 11 11 | 
             
                class ReadWrite < Watcher
         | 
| 12 | 
            +
                  # The Ruby IO object from which the file descriptor was extracted.
         | 
| 13 | 
            +
                  # This is only set if an IO object was used to construct this watcher.
         | 
| 14 | 
            +
                  # Otherwise, it's `nil`.
         | 
| 15 | 
            +
                  #
         | 
| 16 | 
            +
                  # @return [IO, nil]
         | 
| 17 | 
            +
                  attr_reader :io
         | 
| 18 | 
            +
             | 
| 12 19 | 
             
                  # The file descriptor for the stream being watched.
         | 
| 13 20 | 
             
                  #
         | 
| 14 21 | 
             
                  # @return [Fixnum]
         | 
| @@ -23,6 +30,11 @@ module KQueue | |
| 23 30 | 
             
                  #
         | 
| 24 31 | 
             
                  # @private
         | 
| 25 32 | 
             
                  def initialize(queue, fd, type, callback)
         | 
| 33 | 
            +
                    if fd.is_a?(IO)
         | 
| 34 | 
            +
                      @io = fd
         | 
| 35 | 
            +
                      fd = fd.fileno
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
             | 
| 26 38 | 
             
                    @fd = fd
         | 
| 27 39 | 
             
                    @type = type
         | 
| 28 40 | 
             
                    super(queue, @fd, type, [], nil, callback)
         | 
    
        data/rb-kqueue.gemspec
    CHANGED