# GServer (Class)

In: | gserver.rb
Parent: | Object

## Methods

connections in_service? join new serve shutdown start stop stop stopped?

## Constants

DEFAULT_HOST | = | "127.0.0.1"

## Attributes

audit | [RW] |
debug | [RW] |
host | [R] |
maxConnections | [R] |
port | [R] |
stdlog | [RW] |

## Public Class methods

stop(port, host = DEFAULT_HOST)

[Source]

    # File gserver.rb, line 18
      def GServer.stop(port, host = DEFAULT_HOST)
        @@servicesMutex.synchronize {
          @@services[host][port].stop
        }
      end

in_service?(port, host = DEFAULT_HOST)

[Source]

    # File gserver.rb, line 24
      def GServer.in_service?(port, host = DEFAULT_HOST)
        @@services.has_key?(host) and
          @@services[host].has_key?(port)
      end

new(port, host = DEFAULT_HOST, maxConnections = 4, stdlog = $stderr, audit = false, debug = false)

[Source]

    # File gserver.rb, line 93
      def initialize(port, host = DEFAULT_HOST, maxConnections = 4,
        stdlog = $stderr, audit = false, debug = false)
        @tcpServerThread = nil
        @port = port
        @host = host
        @maxConnections = maxConnections
        @connections = []
        @connectionsMutex = Mutex.new
        @connectionsCV = ConditionVariable.new
        @stdlog = stdlog
        @audit = audit
        @debug = debug
      end

## Public Instance methods

serve(io)

[Source]

    # File gserver.rb, line 12
      def serve(io)
      end

stop()

[Source]

    # File gserver.rb, line 29
      def stop
        @connectionsMutex.synchronize  {
          if @tcpServerThread
            @tcpServerThread.raise "stop"
          end
        }
      end

stopped?()

[Source]

    # File gserver.rb, line 37
      def stopped?
        @tcpServerThread == nil
      end

shutdown()

[Source]

    # File gserver.rb, line 41
      def shutdown
        @shutdown = true
      end

connections()

[Source]

    # File gserver.rb, line 45
      def connections
        @connections.size
      end

join()

[Source]

    # File gserver.rb, line 49
      def join
        @tcpServerThread.join if @tcpServerThread
      end

start(maxConnections = -1)

[Source]

    # File gserver.rb, line 107
      def start(maxConnections = -1)
        raise "running" if !stopped?
        @shutdown = false
        @maxConnections = maxConnections if maxConnections > 0
        @@servicesMutex.synchronize  {
          if GServer.in_service?(@port,@host)
            raise "Port already in use: #{host}:#{@port}!"
          end
          @tcpServer = TCPServer.new(@host,@port)
          @port = @tcpServer.addr[1]
          @@services[@host] = {} unless @@services.has_key?(@host)
          @@services[@host][@port] = self;
        }
        @tcpServerThread = Thread.new {
          begin
            starting if @audit
            while !@shutdown
              @connectionsMutex.synchronize  {
                 while @connections.size >= @maxConnections
                   @connectionsCV.wait(@connectionsMutex)
                 end
              }
              client = @tcpServer.accept
              @connections << Thread.new(client)  { |myClient|
                begin
                  myPort = myClient.peeraddr[1]
                  serve(myClient) if !@audit or connecting(myClient)
                rescue => detail
                  error(detail) if @debug
                ensure
                  begin
                    myClient.close
                  rescue
                  end
                  @connectionsMutex.synchronize {
                    @connections.delete(Thread.current)
                    @connectionsCV.signal
                  }
                  disconnecting(myPort) if @audit
                end
              }
            end
          rescue => detail
            error(detail) if @debug
          ensure
            begin
              @tcpServer.close
            rescue
            end
            if @shutdown
              @connectionsMutex.synchronize  {
                 while @connections.size > 0
                   @connectionsCV.wait(@connectionsMutex)
                 end
              }
            else
              @connections.each { |c| c.raise "stop" }
            end
            @tcpServerThread = nil
            @@servicesMutex.synchronize  {
              @@services[@host].delete(@port)
            }
            stopping if @audit
          end
        }
        self
      end

[Validate]