forkhandle 0.0.1 → 0.0.2
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.
- checksums.yaml +15 -0
- data/README.md +38 -0
- data/Rakefile +5 -3
- data/forkhandle.gemspec +4 -3
- data/lib/forkhandle.rb +5 -34
- metadata +10 -9
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
OTFhNWJkZjkxYTI2ODhlNzZmMjZjYjM3NGVmMDNhNmE2NmU0ODBhNQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZWMxZTVhYTZmZDI1Y2Y1NWEzZjhjZjZkNTAwNDJiNzg4NTdiNDU2Yg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
Y2QwNzdiZTE0N2VlZGUwNTllODNjNjlkNWZiMTFjNWQzMDUwYjkxNzA4ZDMx
|
10
|
+
NjA4MTg5ZDE1NzAxNjdmZWYwY2I4YTYxZTNmYjk0NzA5ZTUzMjlhMzk4NzEw
|
11
|
+
ZjhhMDFkYTY3NjFkNDc4N2JmNTkwMGY2Mjc1NGE0MmQ4NWQ3YmM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
Mjk5Y2U5Zjg3YWZlMzkzZDQyNzdlYmY5MTMyYTgwYzllODQxMTljMjJjMGU0
|
14
|
+
NjBiZTEzN2YyZjg3YzY4MzM1ZjNkZDQ2ZmE1ZmJlOWVlZjI2N2FiYzkwY2Qw
|
15
|
+
OWNkOGE1OTZhZjMxMDQ5MDkyYTMwMjJiZGZiNjRjOTY4MTJlNTU=
|
data/README.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
NAME
|
2
|
+
----
|
3
|
+
forkhandle
|
4
|
+
|
5
|
+
SYNOPSIS
|
6
|
+
--------
|
7
|
+
|
8
|
+
connection = ForkHandle.get(:db_connection){ Db.connect(config) }
|
9
|
+
|
10
|
+
|
11
|
+
DESCRIPTION
|
12
|
+
-----------
|
13
|
+
|
14
|
+
managing connection across forks and threads is tricky. most libraries use
|
15
|
+
and icky idiom that requires each and every client to configure it's own
|
16
|
+
forking logic, something like
|
17
|
+
|
18
|
+
MyLameLib.after_fork do
|
19
|
+
|
20
|
+
# close handles you should close
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
many libs also do not provide you with per-thread connection, making MT a
|
25
|
+
manual process.
|
26
|
+
|
27
|
+
a teeny bit of code can solve both. the concept is simple:
|
28
|
+
|
29
|
+
maintain a table of connections scoped by process id and thread id. any
|
30
|
+
miss will trigger auto-scrubbing the table, but only connections from
|
31
|
+
another process (we've been forked) will be closed. this gives
|
32
|
+
|
33
|
+
* per thread connections
|
34
|
+
|
35
|
+
* per process connections
|
36
|
+
|
37
|
+
* auto-matic cleanup after a fork
|
38
|
+
|
data/Rakefile
CHANGED
@@ -32,7 +32,7 @@ def run_tests!(which = nil)
|
|
32
32
|
|
33
33
|
test_rbs.each_with_index do |test_rb, index|
|
34
34
|
testno = index + 1
|
35
|
-
command = "#{ This.ruby } -I ./lib -I ./test/lib #{ test_rb }"
|
35
|
+
command = "#{ This.ruby } -w -I ./lib -I ./test/lib #{ test_rb }"
|
36
36
|
|
37
37
|
puts
|
38
38
|
say(div, :color => :cyan, :bold => true)
|
@@ -93,6 +93,7 @@ task :gemspec do
|
|
93
93
|
test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
|
94
94
|
summary = object.respond_to?(:summary) ? object.summary : "summary: #{ lib } kicks the ass"
|
95
95
|
description = object.respond_to?(:description) ? object.description : "description: #{ lib } kicks the ass"
|
96
|
+
license = object.respond_to?(:license) ? object.license : "same as ruby's"
|
96
97
|
|
97
98
|
if This.extensions.nil?
|
98
99
|
This.extensions = []
|
@@ -118,6 +119,7 @@ task :gemspec do
|
|
118
119
|
spec.platform = Gem::Platform::RUBY
|
119
120
|
spec.summary = #{ lib.inspect }
|
120
121
|
spec.description = #{ description.inspect }
|
122
|
+
spec.license = #{ license.inspect }
|
121
123
|
|
122
124
|
spec.files =\n#{ files.sort.pretty_inspect }
|
123
125
|
spec.executables = #{ executables.inspect }
|
@@ -178,8 +180,8 @@ task :readme do
|
|
178
180
|
end
|
179
181
|
|
180
182
|
template =
|
181
|
-
if test(?e, '
|
182
|
-
Template{ IO.read('
|
183
|
+
if test(?e, 'README.erb')
|
184
|
+
Template{ IO.read('README.erb') }
|
183
185
|
else
|
184
186
|
Template {
|
185
187
|
<<-__
|
data/forkhandle.gemspec
CHANGED
@@ -3,13 +3,14 @@
|
|
3
3
|
|
4
4
|
Gem::Specification::new do |spec|
|
5
5
|
spec.name = "forkhandle"
|
6
|
-
spec.version = "0.0.
|
6
|
+
spec.version = "0.0.2"
|
7
7
|
spec.platform = Gem::Platform::RUBY
|
8
8
|
spec.summary = "forkhandle"
|
9
|
-
spec.description = "
|
9
|
+
spec.description = "a teeny library / design pattern for managing connections in a process and thread safe fashion"
|
10
|
+
spec.license = "same as ruby's"
|
10
11
|
|
11
12
|
spec.files =
|
12
|
-
["Rakefile", "forkhandle.gemspec", "lib", "lib/forkhandle.rb"]
|
13
|
+
["README.md", "Rakefile", "forkhandle.gemspec", "lib", "lib/forkhandle.rb"]
|
13
14
|
|
14
15
|
spec.executables = []
|
15
16
|
|
data/lib/forkhandle.rb
CHANGED
@@ -1,29 +1,10 @@
|
|
1
|
-
# managing connection across forks and threads is tricky. most libraries use
|
2
|
-
# and icky idiom that requires each and every client to configure it's own
|
3
|
-
# forking logic, something like
|
4
|
-
#
|
5
|
-
# MyLameLib.after_for do
|
6
|
-
# # close handles you should close
|
7
|
-
# end
|
8
|
-
#
|
9
|
-
# many libs also do not provide you with per-thread connection, making MT a
|
10
|
-
# manual process.
|
11
|
-
#
|
12
|
-
# a teeny bit of code can solve both. the concept is simple:
|
13
|
-
#
|
14
|
-
# maintain a table of connections scoped by process id and thread id. any
|
15
|
-
# miss will trigger auto-scrubbing the table, but only connections from
|
16
|
-
# another process (we've been forked) will be closed. this gives
|
17
|
-
#
|
18
|
-
# * per thread connections
|
19
|
-
#
|
20
|
-
# * per process connections
|
21
|
-
#
|
22
|
-
# * auto-matic cleanup after a fork
|
23
|
-
#
|
24
1
|
module ForkHandle
|
25
2
|
def version
|
26
|
-
'0.0.
|
3
|
+
'0.0.2'
|
4
|
+
end
|
5
|
+
|
6
|
+
def description
|
7
|
+
"a teeny library / design pattern for managing connections in a process and thread safe fashion"
|
27
8
|
end
|
28
9
|
|
29
10
|
@handles = Hash.new
|
@@ -84,13 +65,3 @@ module ForkHandle
|
|
84
65
|
end
|
85
66
|
|
86
67
|
Forkhandle = ForkHandle
|
87
|
-
|
88
|
-
|
89
|
-
__END__
|
90
|
-
|
91
|
-
ForkHandle.get(:default){ build_default_connection }
|
92
|
-
|
93
|
-
ForkHandle.set(:default, build_default_connection)
|
94
|
-
|
95
|
-
|
96
|
-
|
metadata
CHANGED
@@ -1,47 +1,48 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forkhandle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ara T. Howard
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-02-13 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
|
-
description:
|
13
|
+
description: a teeny library / design pattern for managing connections in a process
|
14
|
+
and thread safe fashion
|
15
15
|
email: ara.t.howard@gmail.com
|
16
16
|
executables: []
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
+
- README.md
|
20
21
|
- Rakefile
|
21
22
|
- forkhandle.gemspec
|
22
23
|
- lib/forkhandle.rb
|
23
24
|
homepage: https://github.com/ahoward/forkhandle
|
24
|
-
licenses:
|
25
|
+
licenses:
|
26
|
+
- same as ruby's
|
27
|
+
metadata: {}
|
25
28
|
post_install_message:
|
26
29
|
rdoc_options: []
|
27
30
|
require_paths:
|
28
31
|
- lib
|
29
32
|
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
-
none: false
|
31
33
|
requirements:
|
32
34
|
- - ! '>='
|
33
35
|
- !ruby/object:Gem::Version
|
34
36
|
version: '0'
|
35
37
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
-
none: false
|
37
38
|
requirements:
|
38
39
|
- - ! '>='
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
version: '0'
|
41
42
|
requirements: []
|
42
43
|
rubyforge_project: codeforpeople
|
43
|
-
rubygems_version:
|
44
|
+
rubygems_version: 2.0.3
|
44
45
|
signing_key:
|
45
|
-
specification_version:
|
46
|
+
specification_version: 4
|
46
47
|
summary: forkhandle
|
47
48
|
test_files: []
|