cool.io 1.2.4 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|