packet 0.1.0 → 0.1.1

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.
@@ -0,0 +1,10 @@
1
+ # implements worker pools
2
+ # Warning: Work in Progress
3
+ # FIXME: but often what user needs is ability to have different workers and control their execution seperately.
4
+ # Above requirment comes from BackgrounDrb experience, and may not be used otherwise.
5
+
6
+ module Packet
7
+ class WorkerPool
8
+
9
+ end
10
+ end
metadata CHANGED
@@ -1,75 +1,86 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: packet
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.1.0
7
- date: 2007-11-21 00:00:00 +05:30
8
- summary: Packet, Events... we got em.
9
- require_paths:
10
- - lib
11
- email: foo@bar.com
12
- homepage: http://code.google.com/p/packet/
13
- rubyforge_project:
14
- description: Packet, Events... we got em.
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 1.8.4
24
- version:
4
+ version: 0.1.1
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
- - Hemant
7
+ - Hemant Kumar
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2007-12-20 00:00:00 +05:30
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Packet, A Pure Ruby library for Event Driven Network Programming.
17
+ email: mail@gnufied.org
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
24
+ - MIT-LICENSE
25
+ - TODO
31
26
  files:
32
- - LICENSE
27
+ - MIT-LICENSE
33
28
  - README
34
29
  - Rakefile
35
30
  - TODO
36
- - bin/packet_mongrel.rb
37
- - bin/runner.rb
38
- - lib/buftok.rb
39
- - lib/io_worker.rb
40
31
  - lib/disconnect_error.rb
41
- - lib/event.rb
42
- - lib/packet_mongrel.rb
32
+ - lib/nbio.rb
33
+ - lib/worker.rb
43
34
  - lib/meta_pimp.rb
44
- - lib/pimp.rb
45
- - lib/packet.rb
46
- - lib/bin_parser.rb
47
35
  - lib/packet_guid.rb
48
- - lib/core.rb
36
+ - lib/double_keyed_hash.rb
49
37
  - lib/periodic_event.rb
38
+ - lib/callback.rb
50
39
  - lib/connection.rb
51
- - lib/worker.rb
52
- - lib/deferrable.rb
53
- - lib/nbio.rb
54
- - lib/ruby_hacks.rb
40
+ - lib/bin_parser.rb
55
41
  - lib/packet_master.rb
56
- - lib/cpu_worker.rb
57
- - lib/double_keyed_hash.rb
58
- - lib/attribute_accessors.rb
59
- - lib/callback.rb
60
- test_files: []
61
-
42
+ - lib/class_helpers.rb
43
+ - lib/pimp.rb
44
+ - lib/packet.rb
45
+ - lib/event.rb
46
+ - lib/core.rb
47
+ - lib/thread_pool.rb
48
+ - lib/packet_mongrel.rb
49
+ - lib/timer_store.rb
50
+ - lib/worker_pool.rb
51
+ - examples/concurrent_thread.c
52
+ - examples/sample_server.rb
53
+ - examples/asteroid.h
54
+ - examples/persistent_print.rb
55
+ - examples/use_stuff.rb
56
+ - examples/extconf.h
57
+ - examples/asteroid.c
58
+ - examples/extconf.rb
59
+ has_rdoc: true
60
+ homepage: http://code.google.com/p/packet/
61
+ post_install_message:
62
62
  rdoc_options: []
63
63
 
64
- extra_rdoc_files:
65
- - README
66
- - LICENSE
67
- - TODO
68
- executables: []
69
-
70
- extensions: []
71
-
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 1.8.5
71
+ version:
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: "0"
77
+ version:
72
78
  requirements: []
73
79
 
74
- dependencies: []
80
+ rubyforge_project:
81
+ rubygems_version: 0.9.5
82
+ signing_key:
83
+ specification_version: 2
84
+ summary: Packet, A Pure Ruby library for Event Driven Network Programming.
85
+ test_files: []
75
86
 
data/LICENSE DELETED
@@ -1,4 +0,0 @@
1
- Packet is copyrighted free software by Hemant Kumar <mail@gnufied.org>
2
- You can redistribute it and/or modify it under either the terms of the GPL
3
- version 2 (see the file GPL), or Ruby License.
4
-
@@ -1,215 +0,0 @@
1
- # This module rewrites pieces of the very good Mongrel web server in
2
- # order to change it from a threaded application to an event based
3
- # application running inside an Packet event loop. It should
4
- # be compatible with the existing Mongrel handlers for Rails,
5
- # Camping, Nitro, etc....
6
- PACKET_APP = File.expand_path(File.join(File.dirname(__FILE__) + "/.."))
7
- ["bin","config","parser","worker","framework","lib","pimp"].each { |x| $LOAD_PATH.unshift(PACKET_APP + "/#{x}")}
8
- require "packet"
9
- require 'packet'
10
-
11
- module Mongrel
12
- class MongrelProtocol < Packet::Connection
13
- def post_init
14
- @parser = HttpParser.new
15
- @params = HttpParams.new
16
- @nparsed = 0
17
- @request = nil
18
- @request_len = nil
19
- @linebuffer = ''
20
- end
21
-
22
- def receive_data data
23
- @linebuffer << data
24
- @nparsed = @parser.execute(@params, @linebuffer, @nparsed) unless @parser.finished?
25
- if @parser.finished?
26
- if @request_len.nil?
27
- @request_len = @params[::Mongrel::Const::CONTENT_LENGTH].to_i
28
- script_name, path_info, handlers = ::Mongrel::HttpServer::Instance.classifier.resolve(@params[::Mongrel::Const::REQUEST_PATH])
29
- if handlers
30
- @params[::Mongrel::Const::PATH_INFO] = path_info
31
- @params[::Mongrel::Const::SCRIPT_NAME] = script_name
32
- @params[::Mongrel::Const::REMOTE_ADDR] = @params[::Mongrel::Const::HTTP_X_FORWARDED_FOR] #|| ::Socket.unpack_sockaddr_in(get_peername)[1]
33
- @notifiers = handlers.select { |h| h.request_notify }
34
- end
35
- if @request_len > ::Mongrel::Const::MAX_BODY
36
- new_buffer = Tempfile.new(::Mongrel::Const::MONGREL_TMP_BASE)
37
- new_buffer.binmode
38
- new_buffer << @linebuffer[@nparsed..-1]
39
- @linebuffer = new_buffer
40
- else
41
- @linebuffer = StringIO.new(@linebuffer[@nparsed..-1])
42
- @linebuffer.pos = @linebuffer.length
43
- end
44
- end
45
- if @linebuffer.length >= @request_len
46
- @linebuffer.rewind
47
- ::Mongrel::HttpServer::Instance.process_http_request(@params,@linebuffer,self)
48
- @linebuffer.delete if Tempfile === @linebuffer
49
- end
50
- elsif @linebuffer.length > ::Mongrel::Const::MAX_HEADER
51
- close_connection
52
- raise ::Mongrel::HttpParserError.new("HEADER is longer than allowed, aborting client early.")
53
- end
54
- rescue ::Mongrel::HttpParserError
55
- if $mongrel_debug_client
56
- STDERR.puts "#{Time.now}: BAD CLIENT (#{params[Const::HTTP_X_FORWARDED_FOR] || client.peeraddr.last}): #$!"
57
- STDERR.puts "#{Time.now}: REQUEST DATA: #{data.inspect}\n---\nPARAMS: #{params.inspect}\n---\n"
58
- end
59
- close_connection
60
- rescue Exception => e
61
- close_connection
62
- raise e
63
- end
64
-
65
- def write data
66
- send_data data
67
- end
68
-
69
- def closed?
70
- false
71
- end
72
-
73
- end
74
-
75
- class HttpServer
76
- def initialize(host, port, num_processors=950, x=0, y=nil) # Deal with Mongrel 1.0.1 or earlier, as well as later.
77
- @socket = nil
78
- @classifier = URIClassifier.new
79
- @host = host
80
- @port = port
81
- @workers = ThreadGroup.new
82
- if y
83
- @throttle = x
84
- @timeout = y || 60
85
- else
86
- @timeout = x
87
- end
88
- @num_processors = num_processors #num_processors is pointless for evented....
89
- @death_time = 60
90
- self.class.const_set(:Instance,self)
91
- end
92
-
93
- def run
94
- trap('INT') { raise StopServer }
95
- trap('TERM') { raise StopServer }
96
- @acceptor = Thread.new do
97
- Packet::Reactor.run do |t_reactor|
98
- begin
99
- t_reactor.start_server(@host,@port,MongrelProtocol)
100
- rescue StopServer
101
- t_reactor.start_server
102
- end
103
- end
104
- end
105
- end
106
-
107
- def process_http_request(params,linebuffer,client)
108
- if not params[Const::REQUEST_PATH]
109
- uri = URI.parse(params[Const::REQUEST_URI])
110
- params[Const::REQUEST_PATH] = uri.request_uri
111
- end
112
-
113
- raise "No REQUEST PATH" if not params[Const::REQUEST_PATH]
114
-
115
- script_name, path_info, handlers = @classifier.resolve(params[Const::REQUEST_PATH])
116
-
117
- if handlers
118
- notifiers = handlers.select { |h| h.request_notify }
119
- request = HttpRequest.new(params, linebuffer, notifiers)
120
-
121
- # request is good so far, continue processing the response
122
- response = HttpResponse.new(client)
123
-
124
- # Process each handler in registered order until we run out or one finalizes the response.
125
- dispatch_to_handlers(handlers,request,response)
126
-
127
- # And finally, if nobody closed the response off, we finalize it.
128
- unless response.done
129
- response.finished
130
- else
131
- response.close_connection
132
- end
133
- else
134
- # Didn't find it, return a stock 404 response.
135
- client.send_data(Const::ERROR_404_RESPONSE)
136
- client.close_connection
137
- end
138
- end
139
-
140
- def dispatch_to_handlers(handlers,request,response)
141
- handlers.each do |handler|
142
- handler.process(request, response)
143
- break if response.done
144
- end
145
- end
146
- end
147
-
148
- class HttpRequest
149
- def initialize(params, linebuffer, dispatchers)
150
- @params = params
151
- @dispatchers = dispatchers
152
- @body = linebuffer
153
- end
154
- end
155
-
156
- class HttpResponse
157
- def send_file(path, small_file = false)
158
- File.open(path, "rb") do |f|
159
- while chunk = f.read(Const::CHUNK_SIZE) and chunk.length > 0
160
- begin
161
- write(chunk)
162
- rescue Object => exc
163
- break
164
- end
165
- end
166
- end
167
- @body_sent = true
168
- end
169
-
170
- def write(data)
171
- @socket.send_data data
172
- end
173
-
174
- def close_connection_after_writing
175
- @socket.close_connection
176
- end
177
-
178
- def socket_error(details)
179
- @socket.close_connection
180
- done = true
181
- raise details
182
- end
183
-
184
- def finished
185
- send_status
186
- send_header
187
- send_body
188
- @socket.close_connection
189
- end
190
- end
191
-
192
- class Configurator
193
- # This version fixes a bug in the regular Mongrel version by adding
194
- # initialization of groups.
195
- def change_privilege(user, group)
196
- if user and group
197
- log "Initializing groups for {#user}:{#group}."
198
- Process.initgroups(user,Etc.getgrnam(group).gid)
199
- end
200
-
201
- if group
202
- log "Changing group to #{group}."
203
- Process::GID.change_privilege(Etc.getgrnam(group).gid)
204
- end
205
-
206
- if user
207
- log "Changing user to #{user}."
208
- Process::UID.change_privilege(Etc.getpwnam(user).uid)
209
- end
210
- rescue Errno::EPERM
211
- log "FAILED to change user:group #{user}:#{group}: #$!"
212
- exit 1
213
- end
214
- end
215
- end
@@ -1,35 +0,0 @@
1
- EVAL_APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__) + "/.."))
2
- ["bin","worker","lib"].each { |x| $LOAD_PATH.unshift(EVAL_APP_ROOT + "/#{x}")}
3
- WORKER_ROOT = EVAL_APP_ROOT + "/worker"
4
-
5
- require "packet"
6
- class Foo
7
- def receive_data p_data
8
- ask_worker(:no_proxy_worker,:data => p_data, :type => :request)
9
- end
10
-
11
- def worker_receive p_data
12
- send_data "#{p_data[:data]}\n"
13
- end
14
-
15
- def show_result p_data
16
- send_data("#{p_data[:response]}\n")
17
- end
18
-
19
- def connection_completed
20
- end
21
-
22
- def post_init
23
- end
24
-
25
- def wow
26
- puts "Wow"
27
- end
28
- end
29
-
30
- Packet::Reactor.run do |t_reactor|
31
- t_reactor.start_server("localhost", 11006,Foo) do |instance|
32
- instance.wow
33
- end
34
- end
35
-
@@ -1,48 +0,0 @@
1
- # Extends the class object with class and instance accessors for class attributes,
2
- # just like the native attr* accessors for instance attributes.
3
- class Class # :nodoc:
4
- def cattr_reader(*syms)
5
- syms.flatten.each do |sym|
6
- next if sym.is_a?(Hash)
7
- class_eval(<<-EOS, __FILE__, __LINE__)
8
- unless defined? @@#{sym}
9
- @@#{sym} = nil
10
- end
11
-
12
- def self.#{sym}
13
- @@#{sym}
14
- end
15
-
16
- def #{sym}
17
- @@#{sym}
18
- end
19
- EOS
20
- end
21
- end
22
-
23
- def cattr_writer(*syms)
24
- options = syms.last.is_a?(Hash) ? syms.pop : {}
25
- syms.flatten.each do |sym|
26
- class_eval(<<-EOS, __FILE__, __LINE__)
27
- unless defined? @@#{sym}
28
- @@#{sym} = nil
29
- end
30
-
31
- def self.#{sym}=(obj)
32
- @@#{sym} = obj
33
- end
34
-
35
- #{"
36
- def #{sym}=(obj)
37
- @@#{sym} = obj
38
- end
39
- " unless options[:instance_writer] == false }
40
- EOS
41
- end
42
- end
43
-
44
- def cattr_accessor(*syms)
45
- cattr_reader(*syms)
46
- cattr_writer(*syms)
47
- end
48
- end