File: sockets.rb

package info (click to toggle)
dlr-languages 20090805%2Bgit.e6b28d27%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 51,484 kB
  • ctags: 59,257
  • sloc: cs: 298,829; ruby: 159,643; xml: 19,872; python: 2,820; yacc: 1,960; makefile: 96; sh: 65
file content (62 lines) | stat: -rw-r--r-- 1,421 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
$: << 'C:\M1\Merlin\Main\Languages\Ruby\Libs'

require 'socket'
require 'fcntl'
require 'thread'

class WebServer
  def initialize
    @tokens = SizedQueue.new(5)
    5.times{ @tokens.push(nil) }
  end

  def run
	thgroup = ThreadGroup.new
	@status = :Running
	@listeners = [TCPServer.new("127.0.0.1", 3000)]
	while @status == :Running
	    puts "#{Thread.current.inspect}: waiting"
		if svrs = IO.select(@listeners, nil, nil, 2.0)
		  puts "#{Thread.current.inspect}: selected #{svrs[0]}"
		  
		  svrs[0].each{|svr|
			@tokens.pop          # blocks while no token is there.
			if sock = accept_client(svr)
			  th = start_thread(sock)
			  th[:WEBrickThread] = true
			  thgroup.add(th)
			else
			  @tokens.push(nil)
			end
		  }
		end
	end
  end	
  
  def accept_client(svr)
      puts "#{Thread.current.inspect}: accept_client #{svr}"
      sock = nil
      sock = svr.accept
      puts "#{Thread.current.inspect}: accepted #{sock}"
      sock.sync = true
      return sock
  end
  
  
  def start_thread(sock, &block)
      Thread.start{
        Thread.current[:WEBrickSocket] = sock
        addr = sock.peeraddr
        puts "#{Thread.current.inspect}: working, peer = #{addr.inspect}"
        
        @tokens.push(nil)
        
        Thread.current[:WEBrickSocket] = nil
        
        puts "#{Thread.current.inspect}: close, peer = #{addr.inspect}"
        sock.close
      }
    end
end

WebServer.new.run