cool.io 1.2.4 → 1.3.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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/CHANGES.md +9 -0
- data/Rakefile +0 -15
- data/cool.io.gemspec +1 -1
- data/examples/callbacked_echo_server.rb +24 -0
- data/ext/libev/Changes +117 -3
- data/ext/libev/LICENSE +2 -1
- data/ext/libev/README +8 -8
- data/ext/libev/ev.c +118 -24
- data/ext/libev/ev.h +6 -4
- data/ext/libev/ev_epoll.c +4 -1
- data/ext/libev/ev_kqueue.c +1 -1
- data/ext/libev/ev_vars.h +3 -2
- data/ext/libev/ev_win32.c +1 -1
- data/ext/libev/win_select.patch +115 -0
- data/lib/cool.io.rb +0 -2
- data/lib/cool.io/io.rb +0 -5
- data/lib/cool.io/meta.rb +1 -1
- data/lib/cool.io/version.rb +1 -1
- metadata +5 -15
- data/examples/httpclient.rb +0 -38
- data/ext/http11_client/.gitignore +0 -5
- data/ext/http11_client/LICENSE +0 -31
- data/ext/http11_client/ext_help.h +0 -14
- data/ext/http11_client/extconf.rb +0 -6
- data/ext/http11_client/http11_client.c +0 -300
- data/ext/http11_client/http11_parser.c +0 -403
- data/ext/http11_client/http11_parser.h +0 -48
- data/ext/http11_client/http11_parser.rl +0 -173
- data/lib/cool.io/eventmachine.rb +0 -234
- data/lib/cool.io/http_client.rb +0 -430
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94010c895806ae23b7ac77b906979c31937463f3
|
4
|
+
data.tar.gz: a73e0f356ee9764a3dd8a3a56c29a187a8ab0693
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e48dd879dd3a8c76408cbf8569e7fefbf329360cc5b7e95a8f1aeaab2ac647cc9e89d4840fa6b8c86c9eb3cad372f57169303911592914751de1cc94e258569e
|
7
|
+
data.tar.gz: 1408f73b5abfcf72c6ca5c153aa9f1b72ac7bc1ed549235435c839883c0c8aa00ea375495a7e450f0803a8f75dc8b3212bfa9973509cc3003b27ddbe46d59451
|
data/.travis.yml
CHANGED
data/CHANGES.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
1.3.0
|
2
|
+
-----
|
3
|
+
|
4
|
+
* Block evaluation doesn't change self for keeping consistency with Ruby block
|
5
|
+
* Remove EventMachine emulation module
|
6
|
+
* Remove HttpClient
|
7
|
+
* DSL syntax is no longer available by default. Need to require 'cool.io/dsl' in user code
|
8
|
+
* Update libev to 4.19
|
9
|
+
|
1
10
|
1.2.4
|
2
11
|
-----
|
3
12
|
|
data/Rakefile
CHANGED
@@ -36,26 +36,11 @@ Rake::ExtensionTask.new('iobuffer_ext', spec) do |ext|
|
|
36
36
|
configure_cross_compilation(ext)
|
37
37
|
end
|
38
38
|
|
39
|
-
Rake::ExtensionTask.new('http11_client', spec) do |ext|
|
40
|
-
ext.ext_dir = 'ext/http11_client'
|
41
|
-
configure_cross_compilation(ext)
|
42
|
-
end
|
43
|
-
|
44
39
|
Rake::ExtensionTask.new('cool.io_ext', spec) do |ext|
|
45
40
|
ext.ext_dir = 'ext/cool.io'
|
46
41
|
configure_cross_compilation(ext)
|
47
42
|
end
|
48
43
|
|
49
|
-
# Rebuild parser Ragel
|
50
|
-
task :http11_parser do
|
51
|
-
Dir.chdir "ext/http11_client" do
|
52
|
-
target = "http11_parser.c"
|
53
|
-
File.unlink target if File.exist? target
|
54
|
-
sh "ragel http11_parser.rl | rlgen-cd -G2 -o #{target}"
|
55
|
-
raise "Failed to build C source" unless File.exist? target
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
44
|
# adapted from http://flavoriffic.blogspot.com/2009/06/easily-valgrind-gdb-your-ruby-c.html
|
60
45
|
def specs_command
|
61
46
|
require "find"
|
data/cool.io.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.homepage = "http://coolio.github.com"
|
16
16
|
s.summary = "A cool framework for doing high performance I/O in Ruby"
|
17
17
|
s.description = "Cool.io provides a high performance event framework for Ruby which uses the libev C library"
|
18
|
-
s.extensions = ["ext/cool.io/extconf.rb", "ext/
|
18
|
+
s.extensions = ["ext/cool.io/extconf.rb", "ext/iobuffer/extconf.rb"]
|
19
19
|
|
20
20
|
s.files = `git ls-files`.split("\n")
|
21
21
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
@@ -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
|
data/ext/libev/Changes
CHANGED
@@ -1,5 +1,119 @@
|
|
1
1
|
Revision history for libev, a high-performance and full-featured event loop.
|
2
2
|
|
3
|
+
TODO: ev_loop_wakeup
|
4
|
+
TODO: EV_STANDALONE == NO_HASSEL (do not use clock_gettime in ev_standalone)
|
5
|
+
TODO: faq, process a thing in each iteration
|
6
|
+
TODO: dbeugging tips, ev_verify, ev_init twice
|
7
|
+
TODO: ev_break for immediate exit (EVBREAK_NOW?)
|
8
|
+
TODO: ev_feed_child_event
|
9
|
+
TODO: document the special problem of signals around fork.
|
10
|
+
TODO: store pid for each signal
|
11
|
+
TODO: document file descriptor usage per loop
|
12
|
+
TODO: store loop pid_t and compare isndie signal handler,store 1 for same, 2 for differign pid, clean up in loop_fork
|
13
|
+
TODO: embed watchers need updating when fd changes
|
14
|
+
TODO: document portability requirements for atomic pointer access
|
15
|
+
TODO: possible cb aliasing?
|
16
|
+
TODO: document requirements for function pointers and calling conventions.
|
17
|
+
|
18
|
+
4.19 Thu Sep 25 08:18:25 CEST 2014
|
19
|
+
- ev.h wasn't valid C++ anymore, which tripped compilers other than
|
20
|
+
clang, msvc or gcc (analyzed by Raphael 'kena' Poss). Unfortunately,
|
21
|
+
C++ doesn't support typedefs for function pointers fully, so the affected
|
22
|
+
declarations have to spell out the types each time.
|
23
|
+
- when not using autoconf, tighten the check for clock_gettime and related
|
24
|
+
functionality.
|
25
|
+
|
26
|
+
4.18 Fri Sep 5 17:55:26 CEST 2014
|
27
|
+
- events on files were not always generated properly with the
|
28
|
+
epoll backend (testcase by Assaf Inbal).
|
29
|
+
- mark event pipe fd as cloexec after a fork (analyzed by Sami Farin).
|
30
|
+
- (ecb) support m68k, m88k and sh (patch by Miod Vallat).
|
31
|
+
- use a reasonable fallback for EV_NSIG instead of erroring out
|
32
|
+
when we can't detect the signal set size.
|
33
|
+
- in the absence of autoconf, do not use the clock syscall
|
34
|
+
on glibc >= 2.17 (avoids the syscall AND -lrt on systems
|
35
|
+
doing clock_gettime in userspace).
|
36
|
+
- ensure extern "C" function pointers are used for externally-visible
|
37
|
+
loop callbacks (not watcher callbacks yet).
|
38
|
+
- (ecb) work around memory barriers and volatile apparently both being
|
39
|
+
broken in visual studio 2008 and later (analysed and patch by Nicolas Noble).
|
40
|
+
|
41
|
+
4.15 Fri Mar 1 12:04:50 CET 2013
|
42
|
+
- destroying a non-default loop would stop the global waitpid
|
43
|
+
watcher (Denis Bilenko).
|
44
|
+
- queueing pending watchers of higher priority from a watcher now invokes
|
45
|
+
them in a timely fashion (reported by Denis Bilenko).
|
46
|
+
- add throw() to all libev functions that cannot throw exceptions, for
|
47
|
+
further code size decrease when compiling for C++.
|
48
|
+
- add throw () to callbacks that must not throw exceptions (allocator,
|
49
|
+
syserr, loop acquire/release, periodic reschedule cbs).
|
50
|
+
- fix event_base_loop return code, add event_get_callback, event_base_new,
|
51
|
+
event_base_get_method calls to improve libevent 1.x emulation and add
|
52
|
+
some libevent 2.x functionality (based on a patch by Jeff Davey).
|
53
|
+
- add more memory fences to fix a bug reported by Jeff Davey. Better
|
54
|
+
be overfenced than underprotected.
|
55
|
+
- ev_run now returns a boolean status (true meaning watchers are
|
56
|
+
still active).
|
57
|
+
- ev_once: undef EV_ERROR in ev_kqueue.c, to avoid clashing with
|
58
|
+
libev's EV_ERROR (reported by 191919).
|
59
|
+
- (ecb) add memory fence support for xlC (Darin McBride).
|
60
|
+
- (ecb) add memory fence support for gcc-mips (Anton Kirilov).
|
61
|
+
- (ecb) add memory fence support for gcc-alpha (Christian Weisgerber).
|
62
|
+
- work around some kernels losing file descriptors by leaking
|
63
|
+
the kqueue descriptor in the child.
|
64
|
+
- work around linux inotify not reporting IN_ATTRIB changes for directories
|
65
|
+
in many cases.
|
66
|
+
- include sys/syscall.h instead of plain syscall.h.
|
67
|
+
- check for io watcher loops in ev_verify, check for the most
|
68
|
+
common reported usage bug in ev_io_start.
|
69
|
+
- choose socket vs. WSASocket at compiletime using EV_USE_WSASOCKET.
|
70
|
+
- always use WSASend/WSARecv directly on windows, hoping that this
|
71
|
+
works in all cases (unlike read/write/send/recv...).
|
72
|
+
- try to detect signals around a fork faster (test program by
|
73
|
+
Denis Bilenko).
|
74
|
+
- work around recent glibc versions that leak memory in realloc.
|
75
|
+
- rename ev::embed::set to ev::embed::set_embed to avoid clashing
|
76
|
+
the watcher base set (loop) method.
|
77
|
+
- rewrite the async/signal pipe logic to always keep a valid fd, which
|
78
|
+
simplifies (and hopefully correctifies :) the race checking
|
79
|
+
on fork, at the cost of one extra fd.
|
80
|
+
- add fat, msdos, jffs2, ramfs, ntfs and btrfs to the list of
|
81
|
+
inotify-supporting filesystems.
|
82
|
+
- move orig_CFLAGS assignment to after AC_INIT, as newer autoconf
|
83
|
+
versions ignore it before
|
84
|
+
(https://bugzilla.redhat.com/show_bug.cgi?id=908096).
|
85
|
+
- add some untested android support.
|
86
|
+
- enum expressions must be of type int (reported by Juan Pablo L).
|
87
|
+
|
88
|
+
4.11 Sat Feb 4 19:52:39 CET 2012
|
89
|
+
- INCOMPATIBLE CHANGE: ev_timer_again now clears the pending status, as
|
90
|
+
was documented already, but not implemented in the repeating case.
|
91
|
+
- new compiletime symbols: EV_NO_SMP and EV_NO_THREADS.
|
92
|
+
- fix a race where the workaround against the epoll fork bugs
|
93
|
+
caused signals to not be handled anymore.
|
94
|
+
- correct backend_fudge for most backends, and implement a windows
|
95
|
+
specific workaround to avoid looping because we call both
|
96
|
+
select and Sleep, both with different time resolutions.
|
97
|
+
- document range and guarantees of ev_sleep.
|
98
|
+
- document reasonable ranges for periodics interval and offset.
|
99
|
+
- rename backend_fudge to backend_mintime to avoid future confusion :)
|
100
|
+
- change the default periodic reschedule function to hopefully be more
|
101
|
+
exact and correct even in corner cases or in the far future.
|
102
|
+
- do not rely on -lm anymore: use it when available but use our
|
103
|
+
own floor () if it is missing. This should make it easier to embed,
|
104
|
+
as no external libraries are required.
|
105
|
+
- strategically import macros from libecb and mark rarely-used functions
|
106
|
+
as cache-cold (saving almost 2k code size on typical amd64 setups).
|
107
|
+
- add Symbols.ev and Symbols.event files, that were missing.
|
108
|
+
- fix backend_mintime value for epoll (was 1/1024, is 1/1000 now).
|
109
|
+
- fix #3 "be smart about timeouts" to not "deadlock" when
|
110
|
+
timeout == now, also improve the section overall.
|
111
|
+
- avoid "AVOIDING FINISHING BEFORE RETURNING" idiom.
|
112
|
+
- support new EV_API_STATIC mode to make all libev symbols
|
113
|
+
static.
|
114
|
+
- supply default CFLAGS of -g -O3 with gcc when original CFLAGS
|
115
|
+
were empty.
|
116
|
+
|
3
117
|
4.04 Wed Feb 16 09:01:51 CET 2011
|
4
118
|
- fix two problems in the native win32 backend, where reuse of fd's
|
5
119
|
with different underlying handles caused handles not to be removed
|
@@ -94,7 +208,7 @@ Revision history for libev, a high-performance and full-featured event loop.
|
|
94
208
|
that this is a race condition regardless of EV_SIGNALFD.
|
95
209
|
- backport inotify code to C89.
|
96
210
|
- inotify file descriptors could leak into child processes.
|
97
|
-
- ev_stat watchers could keep an
|
211
|
+
- ev_stat watchers could keep an erroneous extra ref on the loop,
|
98
212
|
preventing exit when unregistering all watchers (testcases
|
99
213
|
provided by ry@tinyclouds.org).
|
100
214
|
- implement EV_WIN32_HANDLE_TO_FD and EV_WIN32_CLOSE_FD configuration
|
@@ -162,8 +276,8 @@ Revision history for libev, a high-performance and full-featured event loop.
|
|
162
276
|
Malek Hadj-Ali).
|
163
277
|
- implement ev_suspend and ev_resume.
|
164
278
|
- new EV_CUSTOM revents flag for use by applications.
|
165
|
-
- add documentation section about
|
166
|
-
- add a glossary to the
|
279
|
+
- add documentation section about priorities.
|
280
|
+
- add a glossary to the documentation.
|
167
281
|
- extend the ev_fork description slightly.
|
168
282
|
- optimize a jump out of call_pending.
|
169
283
|
|
data/ext/libev/LICENSE
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
All files in libev are
|
1
|
+
All files in libev are
|
2
|
+
Copyright (c)2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann.
|
2
3
|
|
3
4
|
Redistribution and use in source and binary forms, with or without
|
4
5
|
modification, are permitted provided that the following conditions are
|
data/ext/libev/README
CHANGED
@@ -24,23 +24,23 @@ ABOUT
|
|
24
24
|
- relative timers/timeouts (handle time jumps).
|
25
25
|
- fast intra-thread communication between multiple
|
26
26
|
event loops (with optional fast linux eventfd backend).
|
27
|
-
- extremely easy to embed
|
28
|
-
|
27
|
+
- extremely easy to embed (fully documented, no dependencies,
|
28
|
+
autoconf supported but optional).
|
29
|
+
- very small codebase, no bloated library, simple code.
|
29
30
|
- fully extensible by being able to plug into the event loop,
|
30
31
|
integrate other event loops, integrate other event loop users.
|
31
32
|
- very little memory use (small watchers, small event loop data).
|
32
33
|
- optional C++ interface allowing method and function callbacks
|
33
34
|
at no extra memory or runtime overhead.
|
34
35
|
- optional Perl interface with similar characteristics (capable
|
35
|
-
of running Glib/Gtk2 on libev
|
36
|
-
libadns).
|
36
|
+
of running Glib/Gtk2 on libev).
|
37
37
|
- support for other languages (multiple C++ interfaces, D, Ruby,
|
38
38
|
Python) available from third-parties.
|
39
39
|
|
40
|
-
Examples of programs that embed libev: the EV perl module,
|
41
|
-
rxvt-unicode, gvpe (GNU Virtual Private Ethernet), the
|
42
|
-
server (http://www.deliantra.net/), Rubinius (a
|
43
|
-
VM), the Ebb web server, the Rev event toolkit.
|
40
|
+
Examples of programs that embed libev: the EV perl module, node.js,
|
41
|
+
auditd, rxvt-unicode, gvpe (GNU Virtual Private Ethernet), the
|
42
|
+
Deliantra MMORPG server (http://www.deliantra.net/), Rubinius (a
|
43
|
+
next-generation Ruby VM), the Ebb web server, the Rev event toolkit.
|
44
44
|
|
45
45
|
|
46
46
|
CONTRIBUTORS
|
data/ext/libev/ev.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* libev event processing core, watcher management
|
3
3
|
*
|
4
|
-
* Copyright (c) 2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann <libev@schmorp.de>
|
4
|
+
* Copyright (c) 2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann <libev@schmorp.de>
|
5
5
|
* All rights reserved.
|
6
6
|
*
|
7
7
|
* Redistribution and use in source and binary forms, with or without modifica-
|
@@ -49,11 +49,11 @@
|
|
49
49
|
# include "config.h"
|
50
50
|
# endif
|
51
51
|
|
52
|
-
#if HAVE_FLOOR
|
53
|
-
#
|
54
|
-
#
|
52
|
+
# if HAVE_FLOOR
|
53
|
+
# ifndef EV_USE_FLOOR
|
54
|
+
# define EV_USE_FLOOR 1
|
55
|
+
# endif
|
55
56
|
# endif
|
56
|
-
#endif
|
57
57
|
|
58
58
|
# if HAVE_CLOCK_SYSCALL
|
59
59
|
# ifndef EV_USE_CLOCK_SYSCALL
|
@@ -247,10 +247,7 @@
|
|
247
247
|
#elif defined _sys_nsig
|
248
248
|
# define EV_NSIG (_sys_nsig) /* Solaris 2.5 */
|
249
249
|
#else
|
250
|
-
#
|
251
|
-
/* to make it compile regardless, just remove the above line, */
|
252
|
-
/* but consider reporting it, too! :) */
|
253
|
-
# define EV_NSIG 65
|
250
|
+
# define EV_NSIG (8 * sizeof (sigset_t) + 1)
|
254
251
|
#endif
|
255
252
|
|
256
253
|
#ifndef EV_USE_FLOOR
|
@@ -258,13 +255,22 @@
|
|
258
255
|
#endif
|
259
256
|
|
260
257
|
#ifndef EV_USE_CLOCK_SYSCALL
|
261
|
-
# if __linux && __GLIBC__
|
258
|
+
# if __linux && __GLIBC__ == 2 && __GLIBC_MINOR__ < 17
|
262
259
|
# define EV_USE_CLOCK_SYSCALL EV_FEATURE_OS
|
263
260
|
# else
|
264
261
|
# define EV_USE_CLOCK_SYSCALL 0
|
265
262
|
# endif
|
266
263
|
#endif
|
267
264
|
|
265
|
+
#if !(_POSIX_TIMERS > 0)
|
266
|
+
# ifndef EV_USE_MONOTONIC
|
267
|
+
# define EV_USE_MONOTONIC 0
|
268
|
+
# endif
|
269
|
+
# ifndef EV_USE_REALTIME
|
270
|
+
# define EV_USE_REALTIME 0
|
271
|
+
# endif
|
272
|
+
#endif
|
273
|
+
|
268
274
|
#ifndef EV_USE_MONOTONIC
|
269
275
|
# if defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0
|
270
276
|
# define EV_USE_MONOTONIC EV_FEATURE_OS
|
@@ -491,7 +497,7 @@ struct signalfd_siginfo
|
|
491
497
|
/*
|
492
498
|
* libecb - http://software.schmorp.de/pkg/libecb
|
493
499
|
*
|
494
|
-
* Copyright (©) 2009-
|
500
|
+
* Copyright (©) 2009-2014 Marc Alexander Lehmann <libecb@schmorp.de>
|
495
501
|
* Copyright (©) 2011 Emanuele Giaquinta
|
496
502
|
* All rights reserved.
|
497
503
|
*
|
@@ -515,6 +521,17 @@ struct signalfd_siginfo
|
|
515
521
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
|
516
522
|
* ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
517
523
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
524
|
+
*
|
525
|
+
* Alternatively, the contents of this file may be used under the terms of
|
526
|
+
* the GNU General Public License ("GPL") version 2 or any later version,
|
527
|
+
* in which case the provisions of the GPL are applicable instead of
|
528
|
+
* the above. If you wish to allow the use of your version of this file
|
529
|
+
* only under the terms of the GPL and not to allow others to use your
|
530
|
+
* version of this file under the BSD license, indicate your decision
|
531
|
+
* by deleting the provisions above and replace them with the notice
|
532
|
+
* and other provisions required by the GPL. If you do not delete the
|
533
|
+
* provisions above, a recipient may use your version of this file under
|
534
|
+
* either the BSD or the GPL.
|
518
535
|
*/
|
519
536
|
|
520
537
|
#ifndef ECB_H
|
@@ -556,8 +573,8 @@ struct signalfd_siginfo
|
|
556
573
|
#endif
|
557
574
|
|
558
575
|
/* work around x32 idiocy by defining proper macros */
|
559
|
-
#if __x86_64 || _M_AMD64
|
560
|
-
#if
|
576
|
+
#if __amd64 || __x86_64 || _M_AMD64 || _M_X64
|
577
|
+
#if _ILP32
|
561
578
|
#define ECB_AMD64_X32 1
|
562
579
|
#else
|
563
580
|
#define ECB_AMD64 1
|
@@ -579,12 +596,20 @@ struct signalfd_siginfo
|
|
579
596
|
#endif
|
580
597
|
#endif
|
581
598
|
|
582
|
-
#define ECB_C (__STDC__+0) /* this assumes that __STDC__ is either empty or a number */
|
583
|
-
#define ECB_C99 (__STDC_VERSION__ >= 199901L)
|
584
|
-
#define ECB_C11 (__STDC_VERSION__ >= 201112L)
|
585
599
|
#define ECB_CPP (__cplusplus+0)
|
586
600
|
#define ECB_CPP11 (__cplusplus >= 201103L)
|
587
601
|
|
602
|
+
#if ECB_CPP
|
603
|
+
#define ECB_C 0
|
604
|
+
#define ECB_STDC_VERSION 0
|
605
|
+
#else
|
606
|
+
#define ECB_C 1
|
607
|
+
#define ECB_STDC_VERSION __STDC_VERSION__
|
608
|
+
#endif
|
609
|
+
|
610
|
+
#define ECB_C99 (ECB_STDC_VERSION >= 199901L)
|
611
|
+
#define ECB_C11 (ECB_STDC_VERSION >= 201112L)
|
612
|
+
|
588
613
|
#if ECB_CPP
|
589
614
|
#define ECB_EXTERN_C extern "C"
|
590
615
|
#define ECB_EXTERN_C_BEG ECB_EXTERN_C {
|
@@ -626,14 +651,18 @@ struct signalfd_siginfo
|
|
626
651
|
#elif defined __ARM_ARCH_7__ || defined __ARM_ARCH_7A__ \
|
627
652
|
|| defined __ARM_ARCH_7M__ || defined __ARM_ARCH_7R__
|
628
653
|
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb" : : : "memory")
|
629
|
-
#elif
|
654
|
+
#elif __aarch64__
|
655
|
+
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb ish" : : : "memory")
|
656
|
+
#elif (__sparc || __sparc__) && !__sparcv8
|
630
657
|
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad | #StoreStore | #StoreLoad" : : : "memory")
|
631
658
|
#define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad" : : : "memory")
|
632
659
|
#define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("membar #LoadStore | #StoreStore")
|
633
660
|
#elif defined __s390__ || defined __s390x__
|
634
661
|
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("bcr 15,0" : : : "memory")
|
635
662
|
#elif defined __mips__
|
636
|
-
|
663
|
+
/* GNU/Linux emulates sync on mips1 architectures, so we force its use */
|
664
|
+
/* anybody else who still uses mips1 is supposed to send in their version, with detection code. */
|
665
|
+
#define ECB_MEMORY_FENCE __asm__ __volatile__ (".set mips2; sync; .set mips0" : : : "memory")
|
637
666
|
#elif defined __alpha__
|
638
667
|
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("mb" : : : "memory")
|
639
668
|
#elif defined __hppa__
|
@@ -641,6 +670,12 @@ struct signalfd_siginfo
|
|
641
670
|
#define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("")
|
642
671
|
#elif defined __ia64__
|
643
672
|
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("mf" : : : "memory")
|
673
|
+
#elif defined __m68k__
|
674
|
+
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("" : : : "memory")
|
675
|
+
#elif defined __m88k__
|
676
|
+
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("tb1 0,%%r0,128" : : : "memory")
|
677
|
+
#elif defined __sh__
|
678
|
+
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("" : : : "memory")
|
644
679
|
#endif
|
645
680
|
#endif
|
646
681
|
#endif
|
@@ -649,6 +684,8 @@ struct signalfd_siginfo
|
|
649
684
|
#if ECB_GCC_VERSION(4,7)
|
650
685
|
/* see comment below (stdatomic.h) about the C11 memory model. */
|
651
686
|
#define ECB_MEMORY_FENCE __atomic_thread_fence (__ATOMIC_SEQ_CST)
|
687
|
+
#define ECB_MEMORY_FENCE_ACQUIRE __atomic_thread_fence (__ATOMIC_ACQUIRE)
|
688
|
+
#define ECB_MEMORY_FENCE_RELEASE __atomic_thread_fence (__ATOMIC_RELEASE)
|
652
689
|
|
653
690
|
/* The __has_feature syntax from clang is so misdesigned that we cannot use it
|
654
691
|
* without risking compile time errors with other compilers. We *could*
|
@@ -657,10 +694,18 @@ struct signalfd_siginfo
|
|
657
694
|
* #elif defined __clang && __has_feature (cxx_atomic)
|
658
695
|
* // see comment below (stdatomic.h) about the C11 memory model.
|
659
696
|
* #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST)
|
697
|
+
* #define ECB_MEMORY_FENCE_ACQUIRE __c11_atomic_thread_fence (__ATOMIC_ACQUIRE)
|
698
|
+
* #define ECB_MEMORY_FENCE_RELEASE __c11_atomic_thread_fence (__ATOMIC_RELEASE)
|
660
699
|
*/
|
661
700
|
|
662
701
|
#elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__
|
663
702
|
#define ECB_MEMORY_FENCE __sync_synchronize ()
|
703
|
+
#elif _MSC_VER >= 1500 /* VC++ 2008 */
|
704
|
+
/* apparently, microsoft broke all the memory barrier stuff in Visual Studio 2008... */
|
705
|
+
#pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier)
|
706
|
+
#define ECB_MEMORY_FENCE _ReadWriteBarrier (); MemoryBarrier()
|
707
|
+
#define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier (); MemoryBarrier() /* according to msdn, _ReadBarrier is not a load fence */
|
708
|
+
#define ECB_MEMORY_FENCE_RELEASE _WriteBarrier (); MemoryBarrier()
|
664
709
|
#elif _MSC_VER >= 1400 /* VC++ 2005 */
|
665
710
|
#pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier)
|
666
711
|
#define ECB_MEMORY_FENCE _ReadWriteBarrier ()
|
@@ -690,6 +735,8 @@ struct signalfd_siginfo
|
|
690
735
|
/* for most usages, or gcc and clang have a bug */
|
691
736
|
/* I *currently* lean towards the latter, and inefficiently implement */
|
692
737
|
/* all three of ecb's fences as a seq_cst fence */
|
738
|
+
/* Update, gcc-4.8 generates mfence for all c++ fences, but nothing */
|
739
|
+
/* for all __atomic_thread_fence's except seq_cst */
|
693
740
|
#define ECB_MEMORY_FENCE atomic_thread_fence (memory_order_seq_cst)
|
694
741
|
#endif
|
695
742
|
#endif
|
@@ -756,6 +803,11 @@ typedef int ecb_bool;
|
|
756
803
|
#define ecb_prefetch(addr,rw,locality) __builtin_prefetch (addr, rw, locality)
|
757
804
|
#else
|
758
805
|
#define ecb_attribute(attrlist)
|
806
|
+
|
807
|
+
/* possible C11 impl for integral types
|
808
|
+
typedef struct ecb_is_constant_struct ecb_is_constant_struct;
|
809
|
+
#define ecb_is_constant(expr) _Generic ((1 ? (struct ecb_is_constant_struct *)0 : (void *)((expr) - (expr)), ecb_is_constant_struct *: 0, default: 1)) */
|
810
|
+
|
759
811
|
#define ecb_is_constant(expr) 0
|
760
812
|
#define ecb_expect(expr,value) (expr)
|
761
813
|
#define ecb_prefetch(addr,rw,locality)
|
@@ -768,11 +820,18 @@ typedef int ecb_bool;
|
|
768
820
|
#define ecb_decltype(x) __typeof(x)
|
769
821
|
#endif
|
770
822
|
|
823
|
+
#if _MSC_VER >= 1300
|
824
|
+
#define ecb_deprecated __declspec(deprecated)
|
825
|
+
#else
|
826
|
+
#define ecb_deprecated ecb_attribute ((__deprecated__))
|
827
|
+
#endif
|
828
|
+
|
771
829
|
#define ecb_noinline ecb_attribute ((__noinline__))
|
772
830
|
#define ecb_unused ecb_attribute ((__unused__))
|
773
831
|
#define ecb_const ecb_attribute ((__const__))
|
774
832
|
#define ecb_pure ecb_attribute ((__pure__))
|
775
833
|
|
834
|
+
/* http://msdn.microsoft.com/en-us/library/k6ktzx3s.aspx __declspec(noreturn) */
|
776
835
|
#if ECB_C11
|
777
836
|
#define ecb_noreturn _Noreturn
|
778
837
|
#else
|
@@ -1051,22 +1110,57 @@ ecb_inline ecb_bool ecb_little_endian (void) { return ecb_byteorder_helper () ==
|
|
1051
1110
|
|| __i386 || __i386__ \
|
1052
1111
|
|| __amd64 || __amd64__ || __x86_64 || __x86_64__ \
|
1053
1112
|
|| __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ \
|
1054
|
-
|| defined __arm__ && defined __ARM_EABI__ \
|
1055
1113
|
|| defined __s390__ || defined __s390x__ \
|
1056
1114
|
|| defined __mips__ \
|
1057
1115
|
|| defined __alpha__ \
|
1058
1116
|
|| defined __hppa__ \
|
1059
1117
|
|| defined __ia64__ \
|
1060
|
-
|| defined
|
1118
|
+
|| defined __m68k__ \
|
1119
|
+
|| defined __m88k__ \
|
1120
|
+
|| defined __sh__ \
|
1121
|
+
|| defined _M_IX86 || defined _M_AMD64 || defined _M_IA64 \
|
1122
|
+
|| (defined __arm__ && (defined __ARM_EABI__ || defined __EABI__ || defined __VFP_FP__ || defined _WIN32_WCE || defined __ANDROID__)) \
|
1123
|
+
|| defined __aarch64__
|
1061
1124
|
#define ECB_STDFP 1
|
1062
1125
|
#include <string.h> /* for memcpy */
|
1063
1126
|
#else
|
1064
1127
|
#define ECB_STDFP 0
|
1065
|
-
#include <math.h> /* for frexp*, ldexp* */
|
1066
1128
|
#endif
|
1067
1129
|
|
1068
1130
|
#ifndef ECB_NO_LIBM
|
1069
1131
|
|
1132
|
+
#include <math.h> /* for frexp*, ldexp*, INFINITY, NAN */
|
1133
|
+
|
1134
|
+
/* only the oldest of old doesn't have this one. solaris. */
|
1135
|
+
#ifdef INFINITY
|
1136
|
+
#define ECB_INFINITY INFINITY
|
1137
|
+
#else
|
1138
|
+
#define ECB_INFINITY HUGE_VAL
|
1139
|
+
#endif
|
1140
|
+
|
1141
|
+
#ifdef NAN
|
1142
|
+
#define ECB_NAN NAN
|
1143
|
+
#else
|
1144
|
+
#define ECB_NAN ECB_INFINITY
|
1145
|
+
#endif
|
1146
|
+
|
1147
|
+
/* converts an ieee half/binary16 to a float */
|
1148
|
+
ecb_function_ float ecb_binary16_to_float (uint16_t x) ecb_const;
|
1149
|
+
ecb_function_ float
|
1150
|
+
ecb_binary16_to_float (uint16_t x)
|
1151
|
+
{
|
1152
|
+
int e = (x >> 10) & 0x1f;
|
1153
|
+
int m = x & 0x3ff;
|
1154
|
+
float r;
|
1155
|
+
|
1156
|
+
if (!e ) r = ldexpf (m , -24);
|
1157
|
+
else if (e != 31) r = ldexpf (m + 0x400, e - 25);
|
1158
|
+
else if (m ) r = ECB_NAN;
|
1159
|
+
else r = ECB_INFINITY;
|
1160
|
+
|
1161
|
+
return x & 0x8000 ? -r : r;
|
1162
|
+
}
|
1163
|
+
|
1070
1164
|
/* convert a float to ieee single/binary32 */
|
1071
1165
|
ecb_function_ uint32_t ecb_float_to_binary32 (float x) ecb_const;
|
1072
1166
|
ecb_function_ uint32_t
|
@@ -2110,8 +2204,6 @@ evpipe_init (EV_P)
|
|
2110
2204
|
fd_intern (fds [0]);
|
2111
2205
|
}
|
2112
2206
|
|
2113
|
-
fd_intern (fds [1]);
|
2114
|
-
|
2115
2207
|
evpipe [0] = fds [0];
|
2116
2208
|
|
2117
2209
|
if (evpipe [1] < 0)
|
@@ -2127,6 +2219,8 @@ evpipe_init (EV_P)
|
|
2127
2219
|
close (fds [1]);
|
2128
2220
|
}
|
2129
2221
|
|
2222
|
+
fd_intern (evpipe [1]);
|
2223
|
+
|
2130
2224
|
ev_io_set (&pipe_w, evpipe [0] < 0 ? evpipe [1] : evpipe [0], EV_READ);
|
2131
2225
|
ev_io_start (EV_A_ &pipe_w);
|
2132
2226
|
ev_unref (EV_A); /* watcher should not keep loop alive */
|
@@ -2519,7 +2613,7 @@ ev_userdata (EV_P) EV_THROW
|
|
2519
2613
|
}
|
2520
2614
|
|
2521
2615
|
void
|
2522
|
-
ev_set_invoke_pending_cb (EV_P_
|
2616
|
+
ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_THROW
|
2523
2617
|
{
|
2524
2618
|
invoke_cb = invoke_pending_cb;
|
2525
2619
|
}
|