nio4r 1.0.1 → 1.1.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/CHANGES.md +5 -0
- data/README.md +4 -4
- data/ext/libev/Changes +29 -4
- data/ext/libev/LICENSE +1 -1
- data/ext/libev/README +1 -1
- data/ext/libev/ev.c +126 -32
- 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_poll.c +1 -1
- data/ext/libev/ev_vars.h +3 -2
- data/ext/nio4r/monitor.c +5 -2
- data/lib/nio/version.rb +1 -1
- data/spec/nio/monitor_spec.rb +8 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96d59635d5568ac28d3463cd275c144d164b2237
|
4
|
+
data.tar.gz: 05fec0902ed45c022b84a4ab5b7346b8d7f3e433
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b90ca4d7cbcefe3bf6edc25670788f7c28bfd9839cb521f2a7517f0d6afa735e4abdcb9b417d1fdfb6cc530a01e6a8c63517652b4ba947a367669f13b5e3524
|
7
|
+
data.tar.gz: a0d543b2c2afc1c404a82c1c7cffc5ce8a9ae37d3c0df0d002d7d975ae5fbe26e29a47e16b59694c77bab76be2fe1928a3999fafb814fe2c83667fd207f5aa42
|
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -187,8 +187,8 @@ however this is not the case today.
|
|
187
187
|
License
|
188
188
|
-------
|
189
189
|
|
190
|
-
Copyright (c)
|
191
|
-
LICENSE.txt for further details.
|
190
|
+
Copyright (c) 2011-2015 Tony Arcieri. Distributed under the MIT License.
|
191
|
+
See LICENSE.txt for further details.
|
192
192
|
|
193
|
-
Includes libev 4.
|
194
|
-
under the BSD license. See ext/libev/LICENSE for details.
|
193
|
+
Includes libev 4.19. Copyright (c) 2009-2014 Marc Alexander Lehmann.
|
194
|
+
Distributed under the BSD license. See ext/libev/LICENSE for details.
|
data/ext/libev/Changes
CHANGED
@@ -11,7 +11,32 @@ TODO: store pid for each signal
|
|
11
11
|
TODO: document file descriptor usage per loop
|
12
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
13
|
TODO: embed watchers need updating when fd changes
|
14
|
-
TODO: document
|
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).
|
15
40
|
|
16
41
|
4.15 Fri Mar 1 12:04:50 CET 2013
|
17
42
|
- destroying a non-default loop would stop the global waitpid
|
@@ -41,7 +66,7 @@ TODO: document portbaility requirements for atomic pointer access
|
|
41
66
|
- include sys/syscall.h instead of plain syscall.h.
|
42
67
|
- check for io watcher loops in ev_verify, check for the most
|
43
68
|
common reported usage bug in ev_io_start.
|
44
|
-
-
|
69
|
+
- choose socket vs. WSASocket at compiletime using EV_USE_WSASOCKET.
|
45
70
|
- always use WSASend/WSARecv directly on windows, hoping that this
|
46
71
|
works in all cases (unlike read/write/send/recv...).
|
47
72
|
- try to detect signals around a fork faster (test program by
|
@@ -50,7 +75,7 @@ TODO: document portbaility requirements for atomic pointer access
|
|
50
75
|
- rename ev::embed::set to ev::embed::set_embed to avoid clashing
|
51
76
|
the watcher base set (loop) method.
|
52
77
|
- rewrite the async/signal pipe logic to always keep a valid fd, which
|
53
|
-
simplifies (and
|
78
|
+
simplifies (and hopefully correctifies :) the race checking
|
54
79
|
on fork, at the cost of one extra fd.
|
55
80
|
- add fat, msdos, jffs2, ramfs, ntfs and btrfs to the list of
|
56
81
|
inotify-supporting filesystems.
|
@@ -252,7 +277,7 @@ TODO: document portbaility requirements for atomic pointer access
|
|
252
277
|
- implement ev_suspend and ev_resume.
|
253
278
|
- new EV_CUSTOM revents flag for use by applications.
|
254
279
|
- add documentation section about priorities.
|
255
|
-
- add a glossary to the
|
280
|
+
- add a glossary to the documentation.
|
256
281
|
- extend the ev_fork description slightly.
|
257
282
|
- optimize a jump out of call_pending.
|
258
283
|
|
data/ext/libev/LICENSE
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
All files in libev are
|
2
|
-
Copyright (c)2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann.
|
2
|
+
Copyright (c)2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann.
|
3
3
|
|
4
4
|
Redistribution and use in source and binary forms, with or without
|
5
5
|
modification, are permitted provided that the following conditions are
|
data/ext/libev/README
CHANGED
@@ -14,7 +14,7 @@ ABOUT
|
|
14
14
|
featureful. And also smaller. Yay.
|
15
15
|
|
16
16
|
Some of the specialties of libev not commonly found elsewhere are:
|
17
|
-
|
17
|
+
|
18
18
|
- extensive and detailed, readable documentation (not doxygen garbage).
|
19
19
|
- fully supports fork, can detect fork in various ways and automatically
|
20
20
|
re-arms kernel mechanisms that do not support fork.
|
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
|
@@ -111,7 +111,7 @@
|
|
111
111
|
# undef EV_USE_POLL
|
112
112
|
# define EV_USE_POLL 0
|
113
113
|
# endif
|
114
|
-
|
114
|
+
|
115
115
|
# if HAVE_EPOLL_CTL && HAVE_SYS_EPOLL_H
|
116
116
|
# ifndef EV_USE_EPOLL
|
117
117
|
# define EV_USE_EPOLL EV_FEATURE_BACKENDS
|
@@ -120,7 +120,7 @@
|
|
120
120
|
# undef EV_USE_EPOLL
|
121
121
|
# define EV_USE_EPOLL 0
|
122
122
|
# endif
|
123
|
-
|
123
|
+
|
124
124
|
# if HAVE_KQUEUE && HAVE_SYS_EVENT_H
|
125
125
|
# ifndef EV_USE_KQUEUE
|
126
126
|
# define EV_USE_KQUEUE EV_FEATURE_BACKENDS
|
@@ -129,7 +129,7 @@
|
|
129
129
|
# undef EV_USE_KQUEUE
|
130
130
|
# define EV_USE_KQUEUE 0
|
131
131
|
# endif
|
132
|
-
|
132
|
+
|
133
133
|
# if HAVE_PORT_H && HAVE_PORT_CREATE
|
134
134
|
# ifndef EV_USE_PORT
|
135
135
|
# define EV_USE_PORT EV_FEATURE_BACKENDS
|
@@ -165,7 +165,7 @@
|
|
165
165
|
# undef EV_USE_EVENTFD
|
166
166
|
# define EV_USE_EVENTFD 0
|
167
167
|
# endif
|
168
|
-
|
168
|
+
|
169
169
|
#endif
|
170
170
|
|
171
171
|
#include <stdlib.h>
|
@@ -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
|
@@ -887,7 +946,7 @@ ecb_function_ uint8_t ecb_bitrev8 (uint8_t x) ecb_const;
|
|
887
946
|
ecb_function_ uint8_t ecb_bitrev8 (uint8_t x)
|
888
947
|
{
|
889
948
|
return ( (x * 0x0802U & 0x22110U)
|
890
|
-
| (x * 0x8020U & 0x88440U)) * 0x10101U >> 16;
|
949
|
+
| (x * 0x8020U & 0x88440U)) * 0x10101U >> 16;
|
891
950
|
}
|
892
951
|
|
893
952
|
ecb_function_ uint16_t ecb_bitrev16 (uint16_t x) ecb_const;
|
@@ -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
|
@@ -2017,7 +2111,7 @@ downheap (ANHE *heap, int N, int k)
|
|
2017
2111
|
|
2018
2112
|
heap [k] = heap [c];
|
2019
2113
|
ev_active (ANHE_w (heap [k])) = k;
|
2020
|
-
|
2114
|
+
|
2021
2115
|
k = c;
|
2022
2116
|
}
|
2023
2117
|
|
@@ -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 */
|
@@ -2437,7 +2531,7 @@ ev_supported_backends (void) EV_THROW
|
|
2437
2531
|
if (EV_USE_EPOLL ) flags |= EVBACKEND_EPOLL;
|
2438
2532
|
if (EV_USE_POLL ) flags |= EVBACKEND_POLL;
|
2439
2533
|
if (EV_USE_SELECT) flags |= EVBACKEND_SELECT;
|
2440
|
-
|
2534
|
+
|
2441
2535
|
return flags;
|
2442
2536
|
}
|
2443
2537
|
|
@@ -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
|
}
|
@@ -3261,7 +3355,7 @@ VALUE ev_backend_poll(void *ptr)
|
|
3261
3355
|
int
|
3262
3356
|
ev_run (EV_P_ int flags)
|
3263
3357
|
{
|
3264
|
-
/* ########## NIO4R PATCHERY HO! ########## */
|
3358
|
+
/* ########## NIO4R PATCHERY HO! ########## */
|
3265
3359
|
#if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
|
3266
3360
|
struct ev_poll_args poll_args;
|
3267
3361
|
#endif
|
data/ext/libev/ev.h
CHANGED
@@ -205,7 +205,7 @@ struct ev_loop;
|
|
205
205
|
/*****************************************************************************/
|
206
206
|
|
207
207
|
#define EV_VERSION_MAJOR 4
|
208
|
-
#define EV_VERSION_MINOR
|
208
|
+
#define EV_VERSION_MINOR 19
|
209
209
|
|
210
210
|
/* eventmask, revents, events... */
|
211
211
|
enum {
|
@@ -658,8 +658,10 @@ EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_T
|
|
658
658
|
/* advanced stuff for threading etc. support, see docs */
|
659
659
|
EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_THROW;
|
660
660
|
EV_API_DECL void *ev_userdata (EV_P) EV_THROW;
|
661
|
-
|
662
|
-
EV_API_DECL void
|
661
|
+
typedef void (*ev_loop_callback)(EV_P);
|
662
|
+
EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_THROW;
|
663
|
+
/* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out*/
|
664
|
+
EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_THROW, void (*acquire)(EV_P) EV_THROW) EV_THROW;
|
663
665
|
|
664
666
|
EV_API_DECL unsigned int ev_pending_count (EV_P) EV_THROW; /* number of pending events, if any */
|
665
667
|
EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */
|
@@ -730,7 +732,7 @@ EV_API_DECL void ev_resume (EV_P) EV_THROW;
|
|
730
732
|
#endif
|
731
733
|
|
732
734
|
/* stopping (enabling, adding) a watcher does nothing if it is already running */
|
733
|
-
/* stopping (disabling, deleting) a watcher does nothing unless
|
735
|
+
/* stopping (disabling, deleting) a watcher does nothing unless it's already running */
|
734
736
|
#if EV_PROTOTYPES
|
735
737
|
|
736
738
|
/* feeds an event into a watcher as if the event actually occurred */
|
data/ext/libev/ev_epoll.c
CHANGED
@@ -228,7 +228,10 @@ epoll_poll (EV_P_ ev_tstamp timeout)
|
|
228
228
|
if (anfds [fd].emask & EV_EMASK_EPERM && events)
|
229
229
|
fd_event (EV_A_ fd, events);
|
230
230
|
else
|
231
|
-
|
231
|
+
{
|
232
|
+
epoll_eperms [i] = epoll_eperms [--epoll_epermcnt];
|
233
|
+
anfds [fd].emask = 0;
|
234
|
+
}
|
232
235
|
}
|
233
236
|
}
|
234
237
|
|
data/ext/libev/ev_kqueue.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* libev kqueue backend
|
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-
|
data/ext/libev/ev_poll.c
CHANGED
data/ext/libev/ev_vars.h
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
* loop member variable declarations
|
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-
|
@@ -194,9 +194,10 @@ VARx(unsigned int, loop_count) /* total number of loop iterations/blocks */
|
|
194
194
|
VARx(unsigned int, loop_depth) /* #ev_run enters - #ev_run leaves */
|
195
195
|
|
196
196
|
VARx(void *, userdata)
|
197
|
+
/* C++ doesn't support the ev_loop_callback typedef here. stinks. */
|
197
198
|
VAR (release_cb, void (*release_cb)(EV_P) EV_THROW)
|
198
199
|
VAR (acquire_cb, void (*acquire_cb)(EV_P) EV_THROW)
|
199
|
-
VAR (invoke_cb ,
|
200
|
+
VAR (invoke_cb , ev_loop_callback invoke_cb)
|
200
201
|
#endif
|
201
202
|
|
202
203
|
#undef VARx
|
data/ext/nio4r/monitor.c
CHANGED
@@ -127,10 +127,13 @@ static VALUE NIO_Monitor_close(int argc, VALUE *argv, VALUE self)
|
|
127
127
|
selector = rb_ivar_get(self, rb_intern("selector"));
|
128
128
|
|
129
129
|
if(selector != Qnil) {
|
130
|
-
|
130
|
+
/* if ev_loop is 0, it means that the loop has been stopped already (see NIO_Selector_shutdown)*/
|
131
|
+
if(monitor->selector->ev_loop != 0) {
|
132
|
+
ev_io_stop(monitor->selector->ev_loop, &monitor->ev_io);
|
133
|
+
}
|
131
134
|
monitor->selector = 0;
|
132
135
|
rb_ivar_set(self, rb_intern("selector"), Qnil);
|
133
|
-
|
136
|
+
|
134
137
|
/* Default value is true */
|
135
138
|
if(deregister == Qtrue || deregister == Qnil) {
|
136
139
|
rb_funcall(selector, rb_intern("deregister"), 1, rb_ivar_get(self, rb_intern("io")));
|
data/lib/nio/version.rb
CHANGED
data/spec/nio/monitor_spec.rb
CHANGED
@@ -58,4 +58,12 @@ describe NIO::Monitor do
|
|
58
58
|
expect(subject).to be_closed
|
59
59
|
expect(selector.registered?(reader)).to be_falsey
|
60
60
|
end
|
61
|
+
|
62
|
+
it "closes even if the selector has been shutdown" do
|
63
|
+
expect(subject).not_to be_closed
|
64
|
+
selector.close # forces shutdown
|
65
|
+
expect(subject).not_to be_closed
|
66
|
+
subject.close
|
67
|
+
expect(subject).to be_closed
|
68
|
+
end
|
61
69
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nio4r
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Arcieri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -128,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
128
|
version: '0'
|
129
129
|
requirements: []
|
130
130
|
rubyforge_project:
|
131
|
-
rubygems_version: 2.
|
131
|
+
rubygems_version: 2.4.5
|
132
132
|
signing_key:
|
133
133
|
specification_version: 4
|
134
134
|
summary: NIO provides a high performance selector API for monitoring IO objects
|
@@ -142,3 +142,4 @@ test_files:
|
|
142
142
|
- spec/nio/selector_spec.rb
|
143
143
|
- spec/spec_helper.rb
|
144
144
|
- spec/support/selectable_examples.rb
|
145
|
+
has_rdoc:
|