cool.io 1.0.0 → 1.9.0

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.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/test.yaml +54 -0
  3. data/.gitignore +30 -0
  4. data/.rspec +3 -0
  5. data/{CHANGES → CHANGES.md} +175 -79
  6. data/{README.markdown → README.md} +43 -49
  7. data/Rakefile +44 -69
  8. data/appveyor.yml +18 -0
  9. data/cool.io.gemspec +18 -131
  10. data/examples/callbacked_echo_server.rb +24 -0
  11. data/ext/cool.io/buffer.c +781 -0
  12. data/ext/cool.io/cool.io.h +13 -0
  13. data/ext/cool.io/cool.io_ext.c +1 -0
  14. data/ext/cool.io/ev_wrap.h +4 -2
  15. data/ext/cool.io/extconf.rb +27 -16
  16. data/ext/cool.io/iowatcher.c +17 -8
  17. data/ext/cool.io/loop.c +36 -84
  18. data/ext/cool.io/stat_watcher.c +103 -25
  19. data/ext/cool.io/timer_watcher.c +3 -3
  20. data/ext/cool.io/utils.c +5 -0
  21. data/ext/cool.io/watcher.h +1 -1
  22. data/ext/libev/Changes +152 -3
  23. data/ext/libev/LICENSE +2 -1
  24. data/ext/libev/README +8 -8
  25. data/ext/libev/ev.c +1719 -348
  26. data/ext/libev/ev.h +146 -118
  27. data/ext/libev/ev_epoll.c +71 -20
  28. data/ext/libev/ev_kqueue.c +36 -16
  29. data/ext/libev/ev_poll.c +14 -11
  30. data/ext/libev/ev_port.c +43 -18
  31. data/ext/libev/ev_select.c +82 -25
  32. data/ext/libev/ev_vars.h +28 -21
  33. data/ext/libev/ev_win32.c +19 -10
  34. data/ext/libev/ev_wrap.h +166 -152
  35. data/ext/libev/test_libev_win32.c +1 -1
  36. data/gems.rb +9 -0
  37. data/lib/cool.io/async_watcher.rb +1 -1
  38. data/lib/cool.io/custom_require.rb +9 -0
  39. data/lib/cool.io/dns_resolver.rb +30 -22
  40. data/lib/cool.io/dsl.rb +32 -28
  41. data/lib/cool.io/io.rb +55 -35
  42. data/lib/cool.io/iowatcher.rb +1 -1
  43. data/lib/cool.io/listener.rb +35 -17
  44. data/lib/cool.io/loop.rb +17 -25
  45. data/lib/cool.io/meta.rb +6 -5
  46. data/lib/cool.io/server.rb +5 -4
  47. data/lib/cool.io/socket.rb +41 -30
  48. data/lib/cool.io/timer_watcher.rb +1 -1
  49. data/lib/cool.io/version.rb +7 -0
  50. data/lib/cool.io.rb +11 -10
  51. data/lib/coolio.rb +1 -1
  52. data/libev_ruby_gil.diff +175 -0
  53. data/libev_win_select.diff +130 -0
  54. data/spec/async_watcher_spec.rb +5 -5
  55. data/spec/dns_spec.rb +27 -8
  56. data/spec/iobuffer_spec.rb +147 -0
  57. data/spec/spec_helper.rb +15 -1
  58. data/spec/stat_watcher_spec.rb +81 -0
  59. data/spec/tcp_server_spec.rb +225 -0
  60. data/spec/tcp_socket_spec.rb +185 -0
  61. data/spec/timer_watcher_spec.rb +23 -19
  62. data/spec/udp_socket_spec.rb +58 -0
  63. data/spec/unix_listener_spec.rb +8 -8
  64. data/spec/unix_server_spec.rb +10 -8
  65. metadata +109 -112
  66. data/VERSION +0 -1
  67. data/examples/httpclient.rb +0 -38
  68. data/ext/http11_client/.gitignore +0 -5
  69. data/ext/http11_client/LICENSE +0 -31
  70. data/ext/http11_client/ext_help.h +0 -14
  71. data/ext/http11_client/extconf.rb +0 -6
  72. data/ext/http11_client/http11_client.c +0 -300
  73. data/ext/http11_client/http11_parser.c +0 -403
  74. data/ext/http11_client/http11_parser.h +0 -48
  75. data/ext/http11_client/http11_parser.rl +0 -173
  76. data/lib/cool.io/eventmachine.rb +0 -234
  77. data/lib/cool.io/http_client.rb +0 -419
  78. data/lib/rev.rb +0 -4
  79. data/spec/possible_tests/schedules_other_threads.rb +0 -48
  80. data/spec/possible_tests/test_on_resolve_failed.rb +0 -9
  81. data/spec/possible_tests/test_resolves.rb +0 -27
  82. data/spec/possible_tests/test_write_during_resolve.rb +0 -27
  83. data/spec/possible_tests/works_straight.rb +0 -71
data/Rakefile CHANGED
@@ -1,43 +1,16 @@
1
- require 'rubygems'
2
- require 'rake'
1
+ require 'bundler/gem_tasks'
3
2
  require 'rake/clean'
4
3
 
5
- begin
6
- require 'jeweler'
7
- Jeweler::Tasks.new do |gem|
8
- gem.name = "cool.io"
9
- gem.summary = "The cool event framework for Ruby"
10
- gem.description = "A Ruby wrapper around the libev high performance event library"
11
- gem.email = "tony@medioh.com"
12
- gem.homepage = "http://github.com/tarcieri/cool.io"
13
- gem.authors = ["Tony Arcieri"]
14
- gem.add_dependency "iobuffer", ">= 0.1.3"
15
- gem.add_development_dependency "rspec", ">= 2.1.0"
16
- gem.extensions = FileList["ext/**/extconf.rb"].to_a
17
-
18
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
- end
20
- Jeweler::GemcutterTasks.new
21
- rescue LoadError
22
- puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
- end
24
-
25
4
  require 'rspec/core/rake_task'
26
- RSpec::Core::RakeTask.new(:spec) do |spec|
27
- spec.pattern = 'spec/**/*_spec.rb'
28
- spec.rspec_opts = %w[-fs -c -b]
29
- end
5
+ RSpec::Core::RakeTask.new
30
6
 
31
- RSpec::Core::RakeTask.new(:rcov) do |spec|
32
- spec.pattern = 'spec/**/*_spec.rb'
33
- spec.rcov = true
34
- spec.rspec_opts = %w[-fs -c -b]
7
+ RSpec::Core::RakeTask.new(:rcov) do |task|
8
+ task.rcov = true
35
9
  end
36
10
 
37
11
  task :default => %w(compile spec)
38
- task :spec => :check_dependencies
39
12
 
40
- require 'rake/rdoctask'
13
+ require 'rdoc/task'
41
14
  Rake::RDocTask.new do |rdoc|
42
15
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
43
16
 
@@ -47,52 +20,54 @@ Rake::RDocTask.new do |rdoc|
47
20
  rdoc.rdoc_files.include('lib/**/*.rb')
48
21
  end
49
22
 
50
- def make(makedir)
51
- Dir.chdir(makedir) { sh 'make' }
52
- end
23
+ require 'rake/extensiontask'
53
24
 
54
- def extconf(dir)
55
- Dir.chdir(dir) { ruby "extconf.rb" }
56
- end
25
+ spec = eval(File.read("cool.io.gemspec"))
57
26
 
58
- def setup_extension(dir, extension)
59
- ext = "ext/#{dir}"
60
- ext_so = "#{ext}/#{extension}.#{Config::CONFIG['DLEXT']}"
61
- ext_files = FileList[
62
- "#{ext}/*.c",
63
- "#{ext}/*.h",
64
- "#{ext}/extconf.rb",
65
- "#{ext}/Makefile",
66
- ]
27
+ def configure_cross_compilation(ext)
28
+ unless RUBY_PLATFORM =~ /mswin|mingw/
29
+ ext.cross_compile = true
30
+ ext.cross_platform = ['x86-mingw32', 'x64-mingw32']
31
+ end
32
+ end
67
33
 
68
- desc "Builds just the #{extension} extension"
69
- task extension.to_sym => ["#{ext}/Makefile", ext_so ]
34
+ Rake::ExtensionTask.new('cool.io_ext', spec) do |ext|
35
+ ext.ext_dir = 'ext/cool.io'
36
+ configure_cross_compilation(ext)
37
+ end
70
38
 
71
- file "#{ext}/Makefile" => ["#{ext}/extconf.rb"] do
72
- extconf "#{ext}"
39
+ # Note that this rake-compiler-dock rake task dose not support bundle install(1) --path option.
40
+ # Please use bundle install instead when you execute this rake task.
41
+ namespace :build do
42
+ desc 'Build gems for Windows per rake-compiler-dock'
43
+ task :windows do
44
+ require 'rake_compiler_dock'
45
+ RakeCompilerDock.sh <<-CROSS
46
+ bundle && bundle exec rake cross native gem RUBY_CC_VERSION='3.0.0:2.7.0:2.6.0:2.5.0:2.4.0'
47
+ CROSS
73
48
  end
49
+ end
74
50
 
75
- file ext_so => ext_files do
76
- make "#{ext}"
77
- cp ext_so, "lib"
51
+ # adapted from http://flavoriffic.blogspot.com/2009/06/easily-valgrind-gdb-your-ruby-c.html
52
+ def specs_command
53
+ require "find"
54
+ files = []
55
+ Find.find("spec") do |f|
56
+ files << f if File.basename(f) =~ /.*spec.*\.rb$/
78
57
  end
58
+ cmdline = "#{RUBY} -I.:lib:ext:spec \
59
+ -e '%w[#{files.join(' ')}].each { |f| require f }'"
79
60
  end
80
61
 
81
- setup_extension("cool.io", "cool.io_ext")
82
- setup_extension("http11_client", "http11_client")
83
-
84
- task :compile => %w(cool.io_ext http11_client)
85
-
86
- # Rebuild parser Ragel
87
- task :http11_parser do
88
- Dir.chdir "ext/http11_client" do
89
- target = "http11_parser.c"
90
- File.unlink target if File.exist? target
91
- sh "ragel http11_parser.rl | rlgen-cd -G2 -o #{target}"
92
- raise "Failed to build C source" unless File.exist? target
62
+ namespace :spec do
63
+ desc "run specs with valgrind"
64
+ task :valgrind => :compile do
65
+ system "valgrind --num-callers=15 \
66
+ --partial-loads-ok=yes --undef-value-errors=no \
67
+ --tool=memcheck --leak-check=yes --track-fds=yes \
68
+ --show-reachable=yes #{specs_command}"
93
69
  end
94
70
  end
95
71
 
96
- CLEAN.include ["build/*", "**/*.o", "**/*.so", "**/*.a", "**/*.log", "pkg"]
97
- CLEAN.include ["ext/**/Makefile", "lib/cool.io_ext.*", "lib/http11_client.*"]
98
- CLEAN.include ["ext/**/*.#{Config::CONFIG["DLEXT"]}"]
72
+ CLEAN.include "**/*.rbc", "**/*.o", "**/*.so", "**/*.bundle"
73
+ CLEAN.exclude "vendor/**/*.rbc", "vendor/**/*.o", "vendor/**/*.so", "vendor/**/*.bundle"
data/appveyor.yml ADDED
@@ -0,0 +1,18 @@
1
+ ---
2
+ install:
3
+ - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
4
+ - ruby --version
5
+ - gem --version
6
+ - bundle install
7
+ build: off
8
+ test_script:
9
+ - bundle exec rake -rdevkit
10
+
11
+ environment:
12
+ matrix:
13
+ - ruby_version: "200"
14
+ - ruby_version: "200-x64"
15
+ - ruby_version: "21"
16
+ - ruby_version: "21-x64"
17
+ - ruby_version: "22"
18
+ - ruby_version: "22-x64"
data/cool.io.gemspec CHANGED
@@ -1,138 +1,25 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "cool.io/version"
5
4
 
6
5
  Gem::Specification.new do |s|
7
- s.name = %q{cool.io}
8
- s.version = "1.0.0"
6
+ s.name = "cool.io"
7
+ s.version = Coolio::VERSION
8
+ s.authors = ["Tony Arcieri", "Masahiro Nakagawa"]
9
+ s.email = ["tony.arcieri@gmail.com", "repeatedly@gmail.com"]
10
+ s.homepage = "https://github.com/socketry/cool.io"
11
+ s.summary = "A cool framework for doing high performance I/O in Ruby"
12
+ s.description = "Cool.io provides a high performance event framework for Ruby which uses the libev C library"
13
+ s.extensions = ["ext/cool.io/extconf.rb"]
14
+ s.licenses = ["MIT"]
9
15
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Tony Arcieri"]
12
- s.date = %q{2010-12-13}
13
- s.description = %q{A Ruby wrapper around the libev high performance event library}
14
- s.email = %q{tony@medioh.com}
15
- s.extensions = ["ext/cool.io/extconf.rb", "ext/http11_client/extconf.rb"]
16
- s.extra_rdoc_files = [
17
- "LICENSE",
18
- "README.markdown"
19
- ]
20
- s.files = [
21
- "CHANGES",
22
- "LICENSE",
23
- "README.markdown",
24
- "Rakefile",
25
- "VERSION",
26
- "cool.io.gemspec",
27
- "examples/dslified_echo_client.rb",
28
- "examples/dslified_echo_server.rb",
29
- "examples/echo_client.rb",
30
- "examples/echo_server.rb",
31
- "examples/google.rb",
32
- "examples/httpclient.rb",
33
- "ext/cool.io/.gitignore",
34
- "ext/cool.io/cool.io.h",
35
- "ext/cool.io/cool.io_ext.c",
36
- "ext/cool.io/ev_wrap.h",
37
- "ext/cool.io/extconf.rb",
38
- "ext/cool.io/iowatcher.c",
39
- "ext/cool.io/libev.c",
40
- "ext/cool.io/loop.c",
41
- "ext/cool.io/stat_watcher.c",
42
- "ext/cool.io/timer_watcher.c",
43
- "ext/cool.io/utils.c",
44
- "ext/cool.io/watcher.c",
45
- "ext/cool.io/watcher.h",
46
- "ext/http11_client/.gitignore",
47
- "ext/http11_client/LICENSE",
48
- "ext/http11_client/ext_help.h",
49
- "ext/http11_client/extconf.rb",
50
- "ext/http11_client/http11_client.c",
51
- "ext/http11_client/http11_parser.c",
52
- "ext/http11_client/http11_parser.h",
53
- "ext/http11_client/http11_parser.rl",
54
- "ext/libev/Changes",
55
- "ext/libev/LICENSE",
56
- "ext/libev/README",
57
- "ext/libev/README.embed",
58
- "ext/libev/ev.c",
59
- "ext/libev/ev.h",
60
- "ext/libev/ev_epoll.c",
61
- "ext/libev/ev_kqueue.c",
62
- "ext/libev/ev_poll.c",
63
- "ext/libev/ev_port.c",
64
- "ext/libev/ev_select.c",
65
- "ext/libev/ev_vars.h",
66
- "ext/libev/ev_win32.c",
67
- "ext/libev/ev_wrap.h",
68
- "ext/libev/test_libev_win32.c",
69
- "lib/.gitignore",
70
- "lib/cool.io.rb",
71
- "lib/cool.io/async_watcher.rb",
72
- "lib/cool.io/dns_resolver.rb",
73
- "lib/cool.io/dsl.rb",
74
- "lib/cool.io/eventmachine.rb",
75
- "lib/cool.io/http_client.rb",
76
- "lib/cool.io/io.rb",
77
- "lib/cool.io/iowatcher.rb",
78
- "lib/cool.io/listener.rb",
79
- "lib/cool.io/loop.rb",
80
- "lib/cool.io/meta.rb",
81
- "lib/cool.io/server.rb",
82
- "lib/cool.io/socket.rb",
83
- "lib/cool.io/timer_watcher.rb",
84
- "lib/coolio.rb",
85
- "lib/rev.rb",
86
- "spec/async_watcher_spec.rb",
87
- "spec/dns_spec.rb",
88
- "spec/possible_tests/schedules_other_threads.rb",
89
- "spec/possible_tests/test_on_resolve_failed.rb",
90
- "spec/possible_tests/test_resolves.rb",
91
- "spec/possible_tests/test_write_during_resolve.rb",
92
- "spec/possible_tests/works_straight.rb",
93
- "spec/spec_helper.rb",
94
- "spec/timer_watcher_spec.rb",
95
- "spec/unix_listener_spec.rb",
96
- "spec/unix_server_spec.rb"
97
- ]
98
- s.homepage = %q{http://github.com/tarcieri/cool.io}
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
99
19
  s.require_paths = ["lib"]
100
- s.rubygems_version = %q{1.3.7}
101
- s.summary = %q{The cool event framework for Ruby}
102
- s.test_files = [
103
- "examples/dslified_echo_client.rb",
104
- "examples/dslified_echo_server.rb",
105
- "examples/echo_client.rb",
106
- "examples/echo_server.rb",
107
- "examples/google.rb",
108
- "examples/httpclient.rb",
109
- "spec/async_watcher_spec.rb",
110
- "spec/dns_spec.rb",
111
- "spec/possible_tests/schedules_other_threads.rb",
112
- "spec/possible_tests/test_on_resolve_failed.rb",
113
- "spec/possible_tests/test_resolves.rb",
114
- "spec/possible_tests/test_write_during_resolve.rb",
115
- "spec/possible_tests/works_straight.rb",
116
- "spec/spec_helper.rb",
117
- "spec/timer_watcher_spec.rb",
118
- "spec/unix_listener_spec.rb",
119
- "spec/unix_server_spec.rb"
120
- ]
121
20
 
122
- if s.respond_to? :specification_version then
123
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
124
- s.specification_version = 3
125
-
126
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
127
- s.add_runtime_dependency(%q<iobuffer>, [">= 0.1.3"])
128
- s.add_development_dependency(%q<rspec>, [">= 2.1.0"])
129
- else
130
- s.add_dependency(%q<iobuffer>, [">= 0.1.3"])
131
- s.add_dependency(%q<rspec>, [">= 2.1.0"])
132
- end
133
- else
134
- s.add_dependency(%q<iobuffer>, [">= 0.1.3"])
135
- s.add_dependency(%q<rspec>, [">= 2.1.0"])
136
- end
21
+ s.add_development_dependency "rake-compiler", "~> 1.0"
22
+ s.add_development_dependency "rake-compiler-dock", "~> 1.0"
23
+ s.add_development_dependency "rspec", ">= 2.13.0"
24
+ s.add_development_dependency "rdoc", ">= 3.6.0"
137
25
  end
138
-
@@ -0,0 +1,24 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'rubygems'
4
+ require 'cool.io'
5
+
6
+ ADDR = '127.0.0.1'
7
+ PORT = 4321
8
+
9
+ event_loop = Cool.io::Loop.default
10
+ server = Cool.io::TCPServer.new(ADDR, PORT) do |connection|
11
+ puts "#{connection.remote_addr}:#{connection.remote_port} connected"
12
+
13
+ connection.on_close do
14
+ puts "#{connection.remote_addr}:#{connection.remote_port} disconnected"
15
+ end
16
+
17
+ connection.on_read do |data|
18
+ connection.write data
19
+ end
20
+ end
21
+ server.attach(event_loop)
22
+
23
+ puts "Echo server listening on #{ADDR}:#{PORT}"
24
+ event_loop.run