Class: Thin::Backends::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/thin/backends/base.rb

Overview

A Backend connects the server to the client. It handles:

  • connection/disconnection to the server

  • initialization of the connections

  • manitoring of the active connections.

Implementing your own backend

You can create your own minimal backend by inheriting this class and defining the connect and disconnect method. If your backend is not based on EventMachine you also need to redefine the start, stop, stop! and config methods.

Direct Known Subclasses

SwiftiplyClient, TcpServer, UnixServer

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeBase

Returns a new instance of Base.



36
37
38
39
40
41
42
43
# File 'lib/thin/backends/base.rb', line 36

def initialize
  @connections                    = []
  @timeout                        = Server::DEFAULT_TIMEOUT
  @persistent_connection_count    = 0
  @maximum_connections            = Server::DEFAULT_MAXIMUM_CONNECTIONS
  @maximum_persistent_connections = Server::DEFAULT_MAXIMUM_PERSISTENT_CONNECTIONS
  @no_epoll                       = false
end

Instance Attribute Details

#maximum_connectionsObject

Maximum number of file or socket descriptors that the server may open.



21
22
23
# File 'lib/thin/backends/base.rb', line 21

def maximum_connections
  @maximum_connections
end

#maximum_persistent_connectionsObject

Maximum number of connections that can be persistent



24
25
26
# File 'lib/thin/backends/base.rb', line 24

def maximum_persistent_connections
  @maximum_persistent_connections
end

#no_epollObject

Disable the use of epoll under Linux



34
35
36
# File 'lib/thin/backends/base.rb', line 34

def no_epoll
  @no_epoll
end

#persistent_connection_countObject

Number of persistent connections currently opened



31
32
33
# File 'lib/thin/backends/base.rb', line 31

def persistent_connection_count
  @persistent_connection_count
end

#serverObject

Server serving the connections throught the backend



15
16
17
# File 'lib/thin/backends/base.rb', line 15

def server
  @server
end

#threaded=(value) ⇒ Object (writeonly)

Allow using threads in the backend.



27
28
29
# File 'lib/thin/backends/base.rb', line 27

def threaded=(value)
  @threaded = value
end

#timeoutObject

Maximum time for incoming data to arrive



18
19
20
# File 'lib/thin/backends/base.rb', line 18

def timeout
  @timeout
end

Instance Method Details

#closeObject

Free up resources used by the backend.



88
89
# File 'lib/thin/backends/base.rb', line 88

def close
end

#configObject

Configure the backend. This method will be called before droping superuser privileges, so you can do crazy stuff that require godlike powers here.



77
78
79
80
81
82
83
84
85
# File 'lib/thin/backends/base.rb', line 77

def config
  # See http://rubyeventmachine.com/pub/rdoc/files/EPOLL.html
  EventMachine.epoll unless @no_epoll
  
  # Set the maximum number of socket descriptors that the server may open.
  # The process needs to have required privilege to set it higher the 1024 on
  # some systems.
  @maximum_connections = EventMachine.set_descriptor_table_size(@maximum_connections) unless Thin.win?
end

#connection_finished(connection) ⇒ Object

Called by a connection when it’s unbinded.



97
98
99
100
101
102
103
# File 'lib/thin/backends/base.rb', line 97

def connection_finished(connection)
  @persistent_connection_count -= 1 if connection.can_persist?
  @connections.delete(connection)
  
  # Finalize gracefull stop if there's no more active connection.
  stop! if @stopping && @connections.empty?
end

#empty?Boolean

Returns true if no active connection.

Returns:

  • (Boolean)


106
107
108
# File 'lib/thin/backends/base.rb', line 106

def empty?
  @connections.empty?
end

#running?Boolean

Returns true if the backend is connected and running.

Returns:

  • (Boolean)


92
93
94
# File 'lib/thin/backends/base.rb', line 92

def running?
  @running
end

#sizeObject

Number of active connections.



111
112
113
# File 'lib/thin/backends/base.rb', line 111

def size
  @connections.size
end

#startObject

Start the backend and connect it.



46
47
48
49
50
51
52
53
# File 'lib/thin/backends/base.rb', line 46

def start
  @stopping = false
  
  EventMachine.run do
    connect
    @running = true
  end
end

#stopObject

Stop of the backend from accepting new connections.



56
57
58
59
60
61
62
63
# File 'lib/thin/backends/base.rb', line 56

def stop
  @running  = false
  @stopping = true
  
  # Do not accept anymore connection
  disconnect
  stop! if @connections.empty?
end

#stop!Object

Force stop of the backend NOW, too bad for the current connections.



66
67
68
69
70
71
72
73
# File 'lib/thin/backends/base.rb', line 66

def stop!
  @running  = false
  @stopping = false
  
  EventMachine.stop if EventMachine.reactor_running?
  @connections.each { |connection| connection.close_connection }
  close
end

#threaded?Boolean

Returns:

  • (Boolean)


28
# File 'lib/thin/backends/base.rb', line 28

def threaded?; @threaded end