sleepy_penguin 1.0.0 → 1.1.1
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.
- data/.document +1 -0
- data/.gitignore +1 -0
- data/.manifest +2 -0
- data/.wrongdoc.yml +4 -0
- data/ChangeLog +227 -157
- data/GIT-VERSION-FILE +1 -1
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +28 -65
- data/LATEST +8 -0
- data/NEWS +9 -1
- data/README +1 -1
- data/Rakefile +2 -100
- data/ext/sleepy_penguin/epoll.c +34 -1
- data/ext/sleepy_penguin/eventfd.c +1 -1
- data/ext/sleepy_penguin/extconf.rb +0 -1
- data/ext/sleepy_penguin/timerfd.c +1 -1
- data/lib/sleepy_penguin.rb +2 -2
- data/sleepy_penguin.gemspec +9 -19
- data/test/test_epoll.rb +8 -4
- metadata +28 -9
data/.document
CHANGED
data/.gitignore
CHANGED
data/.manifest
CHANGED
data/.wrongdoc.yml
ADDED
data/ChangeLog
CHANGED
@@ -1,158 +1,228 @@
|
|
1
|
-
ChangeLog from
|
1
|
+
ChangeLog from http://git.bogomips.org/cgit/sleepy_penguin.git
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
3
|
+
commit ab4f1a27e5d2c1688a33870b6d070aaa510ccdbc
|
4
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
5
|
+
Date: Thu Jan 13 14:26:58 2011 -0800
|
6
|
+
|
7
|
+
sleepy_penguin 1.1.1 - soft feathers, soft delete
|
8
|
+
|
9
|
+
SleepyPenguin::Epoll#delete method added for "soft" failures
|
10
|
+
Documentation updates and cleanups, the website is now
|
11
|
+
JavaScript-free!
|
12
|
+
|
13
|
+
(Ignore the 1.1.0 "release", it was a lie)
|
14
|
+
|
15
|
+
commit f1729b7dfcf9b77e68d27304bfd7324724d43989
|
16
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
17
|
+
Date: Thu Jan 13 14:35:42 2011 -0800
|
18
|
+
|
19
|
+
packaging fixups, oops
|
20
|
+
|
21
|
+
Ugh, release got fat-fingered :<
|
22
|
+
|
23
|
+
commit 7702d83a9a090ae73ace947be807f3f740b9d770
|
24
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
25
|
+
Date: Thu Jan 13 14:26:58 2011 -0800
|
26
|
+
|
27
|
+
sleepy_penguin 1.1.0 - soft feathers, soft delete
|
28
|
+
|
29
|
+
SleepyPenguin::Epoll#delete method added for "soft" failures
|
30
|
+
Documentation updates and cleanups, the website is now
|
31
|
+
JavaScript-free!
|
32
|
+
|
33
|
+
commit a29b597e57cfcdf6a25cb4e8c12094e059833878
|
34
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
35
|
+
Date: Thu Jan 13 14:25:27 2011 -0800
|
36
|
+
|
37
|
+
epoll: add "delete" for soft failures
|
38
|
+
|
39
|
+
No need to burden applications.
|
40
|
+
|
41
|
+
commit 9c44f01af3538fa51eeecd4944cca0ae1bc885b1
|
42
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
43
|
+
Date: Thu Jan 13 14:09:26 2011 -0800
|
44
|
+
|
45
|
+
minor doc updates, use wrongdoc
|
46
|
+
|
47
|
+
Switch documentation over to wrongdoc, no more JavaScript!
|
48
|
+
Our documentation still sucks.
|
49
|
+
|
50
|
+
commit 4e7fdc58a9ce5b3be5f4213ff4d2fbefac7b5cc5
|
51
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
52
|
+
Date: Thu Jan 13 13:59:56 2011 -0800
|
53
|
+
|
54
|
+
test_epoll: redundant, redefined method, oops!
|
55
|
+
|
56
|
+
commit f8a85cee27e4344783d560810a1a51dd43d5a92d
|
57
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
58
|
+
Date: Thu Jan 13 13:52:30 2011 -0800
|
59
|
+
|
60
|
+
extconf.rb: remove unnecessary dir_config
|
61
|
+
|
62
|
+
We do not depend on external libraries other than the
|
63
|
+
system C library
|
64
|
+
|
65
|
+
commit 942e89550795316b01430c3d278c9d8ef20cc617
|
66
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
67
|
+
Date: Mon Sep 27 17:21:46 2010 -0700
|
68
|
+
|
69
|
+
README: update summary
|
70
|
+
|
71
|
+
It seems to make more sense this way... Editors wanted :)
|
72
|
+
|
73
|
+
commit 97e9a7e764f912fddea75409dd388eaf3abe6a73
|
74
|
+
Author: Eric Wong <e@yhbt.net>
|
75
|
+
Date: Sun Sep 26 06:29:09 2010 +0000
|
76
|
+
|
77
|
+
update documentation and build
|
78
|
+
|
79
|
+
Should be ready for release
|
80
|
+
|
81
|
+
commit 29bbb053277e9c054f1433c66a2e83ada44a5e8d
|
82
|
+
Author: Eric Wong <e@yhbt.net>
|
83
|
+
Date: Sun Sep 26 06:01:23 2010 +0000
|
84
|
+
|
85
|
+
test_epoll: workaround less aggressive GC in rbx
|
86
|
+
|
87
|
+
Some of the GC tests aren't realistic, but if they work in MRI
|
88
|
+
then we can expect them to work reasonably well everywhere.
|
89
|
+
|
90
|
+
commit 43124e76e219d0be968fdeb09f6389d6895b0caf
|
91
|
+
Author: Eric Wong <e@yhbt.net>
|
92
|
+
Date: Sun Sep 26 06:00:10 2010 +0000
|
93
|
+
|
94
|
+
provide rb_io_close() for Rubinius
|
95
|
+
|
96
|
+
Rubinius 1.1.1 does not include this function
|
97
|
+
|
98
|
+
ref: http://github.com/evanphx/rubinius/issues/497
|
99
|
+
|
100
|
+
commit f3fd4447b650e75f48ac0fb9bada9b411c4b89cd
|
101
|
+
Author: Eric Wong <e@yhbt.net>
|
102
|
+
Date: Sun Sep 26 05:50:24 2010 +0000
|
103
|
+
|
104
|
+
epoll: fix typo for rb_memerror()
|
105
|
+
|
106
|
+
Tested on Rubinius.
|
107
|
+
|
108
|
+
commit 63b5fa10ae2f196f392bc6a9360ed2343215ce78
|
109
|
+
Author: Eric Wong <e@yhbt.net>
|
110
|
+
Date: Sun Sep 26 04:00:30 2010 +0000
|
111
|
+
|
112
|
+
misc documentation updates
|
113
|
+
|
114
|
+
We shall release without SignalFD support
|
115
|
+
|
116
|
+
commit 1ad58cb0fd9045b8fa26b85d68ddf2eb06827dd3
|
117
|
+
Author: Eric Wong <e@yhbt.net>
|
118
|
+
Date: Thu Sep 23 05:25:54 2010 +0000
|
119
|
+
|
120
|
+
wire up EventFD class
|
121
|
+
|
122
|
+
This wraps the eventfd(2) interface of Linux. Like TimerFD, it
|
123
|
+
is not available on older distributions.
|
124
|
+
|
125
|
+
commit 2d5886698c3f7241ab23771c2876b985708ded40
|
126
|
+
Author: Eric Wong <e@yhbt.net>
|
127
|
+
Date: Mon Sep 20 16:49:57 2010 +0000
|
128
|
+
|
129
|
+
add TimerFD class
|
130
|
+
|
131
|
+
This wraps the timerfd_* interface in the Linux kernel.
|
132
|
+
It is not available on older distributions.
|
133
|
+
|
134
|
+
commit 4a9ce0319f6e0250c4a8e01284fd5684936bde21
|
135
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
136
|
+
Date: Sun Sep 26 03:49:14 2010 +0000
|
137
|
+
|
138
|
+
epoll: add cross-thread test/example
|
139
|
+
|
140
|
+
This can potentially be very powerful under 1.9
|
141
|
+
with native threads
|
142
|
+
|
143
|
+
commit 96dad9948d3a7b181d50a9fcb35320677edc352b
|
144
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
145
|
+
Date: Sun Sep 26 03:48:50 2010 +0000
|
146
|
+
|
147
|
+
epoll: fix MRI 1.8 build
|
148
|
+
|
149
|
+
It was just st.h in the old days.
|
150
|
+
|
151
|
+
commit a226d237666728ea9242f6079b2c76528d53cdb2
|
152
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
153
|
+
Date: Sun Sep 26 02:46:51 2010 +0000
|
154
|
+
|
155
|
+
Epoll#dup and Epoll#clone inherit close-on-exec
|
156
|
+
|
157
|
+
There can be ways (in the future) where supporting
|
158
|
+
Epoll#dup/Epoll#clone can proveuseful, so continue to
|
159
|
+
support them until proven otherwise.
|
160
|
+
|
161
|
+
commit 3ca3a23d3e68f62af6d57cf22825b2751c226fff
|
162
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
163
|
+
Date: Sun Sep 26 02:12:15 2010 +0000
|
164
|
+
|
165
|
+
simplify epoll_create1 wrapper
|
166
|
+
|
167
|
+
There are no FD flags besides FD_CLOEXEC, so
|
168
|
+
there's no point in making an extra fcntl()
|
169
|
+
call.
|
170
|
+
|
171
|
+
commit 43153f218e14cad3a2c6f4056fcf02dc49dc4b36
|
172
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
173
|
+
Date: Sun Sep 26 01:41:47 2010 +0000
|
174
|
+
|
175
|
+
epoll: add fork protection
|
176
|
+
|
177
|
+
It's dangerous to preserve epoll descriptors across fork,
|
178
|
+
especially in Ruby where the GC can invalidate objects at any
|
179
|
+
time. Installing pthread_atfork hooks prevents VALUE references
|
180
|
+
stored in the kernel from leaking across process boundaries,
|
181
|
+
making it far more difficult for a sanely written application to
|
182
|
+
leak invalid VALUEs to the user.
|
183
|
+
|
184
|
+
commit 81d66a794338e241e00b9ffd66fc94b80064475d
|
185
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
186
|
+
Date: Sat Sep 25 20:32:32 2010 +0000
|
187
|
+
|
188
|
+
Epoll#del only takes one argument
|
189
|
+
|
190
|
+
We don't have to emulate the C API exactly, and it
|
191
|
+
makes life saner/easier for our users.
|
192
|
+
|
193
|
+
commit bc4aaf4afdfb42ad5cc5e0729f816fbefb3d338e
|
194
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
195
|
+
Date: Sat Sep 25 20:08:18 2010 +0000
|
196
|
+
|
197
|
+
epoll: factor out event data packing/unpacking
|
198
|
+
|
199
|
+
Storing Ruby object values in the kernel means
|
200
|
+
they won't be visible to the GC, but for the
|
201
|
+
most part it's safe.
|
202
|
+
|
203
|
+
commit 6296604742ed27ede171dad28f7d2bec2092d122
|
204
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
205
|
+
Date: Sat Sep 25 19:27:09 2010 +0000
|
206
|
+
|
207
|
+
tests for EPOLLET and EINPROGRESS
|
208
|
+
|
209
|
+
Just to make sure edge-triggering works on newly
|
210
|
+
created TCP connections.
|
211
|
+
|
212
|
+
commit e9e91bd9b9c571e9f3374a4b5aa44573f60c3d32
|
213
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
214
|
+
Date: Sat Aug 21 09:00:57 2010 +0000
|
215
|
+
|
216
|
+
extconf: enable detection of {timer,signal,event}fd.h
|
217
|
+
|
218
|
+
commit 7f841e560fae9406192994df352bfb902b2ebbe8
|
219
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
220
|
+
Date: Sat Aug 21 09:00:42 2010 +0000
|
221
|
+
|
222
|
+
README: clarify that we're a Ruby library
|
223
|
+
|
224
|
+
commit 133a7dad4b2179093e5bbb7db6db6c31a51817b7
|
225
|
+
Author: Eric Wong <normalperson@yhbt.net>
|
226
|
+
Date: Sat Aug 21 08:44:08 2010 +0000
|
227
|
+
|
228
|
+
initial - epoll support working
|
data/GIT-VERSION-FILE
CHANGED
@@ -1 +1 @@
|
|
1
|
-
GIT_VERSION = 1.
|
1
|
+
GIT_VERSION = 1.1.1
|
data/GIT-VERSION-GEN
CHANGED
data/GNUmakefile
CHANGED
@@ -3,7 +3,6 @@ all::
|
|
3
3
|
RUBY = ruby
|
4
4
|
RAKE = rake
|
5
5
|
RSYNC = rsync
|
6
|
-
GIT_URL = git://git.bogomips.org/sleepy_penguin.git
|
7
6
|
|
8
7
|
GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
|
9
8
|
@./GIT-VERSION-GEN
|
@@ -28,60 +27,27 @@ install:
|
|
28
27
|
setup_rb_files := .config InstalledFiles
|
29
28
|
prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C $(ext) clean
|
30
29
|
|
30
|
+
extdir := ext/sleepy_penguin
|
31
31
|
clean:
|
32
|
-
-$(MAKE) -C
|
33
|
-
$(RM) $(setup_rb_files)
|
34
|
-
|
35
|
-
pkg_extra := GIT-VERSION-FILE NEWS ChangeLog
|
36
|
-
manifest: $(pkg_extra)
|
37
|
-
$(RM) .manifest
|
38
|
-
$(MAKE) .manifest
|
39
|
-
|
40
|
-
.manifest:
|
41
|
-
(git ls-files && \
|
42
|
-
for i in $@ $(pkg_extra); \
|
43
|
-
do echo $$i; done) | LC_ALL=C sort > $@+
|
44
|
-
cmp $@+ $@ || mv $@+ $@
|
45
|
-
$(RM) $@+
|
32
|
+
-$(MAKE) -C $(extdir) clean
|
33
|
+
$(RM) $(setup_rb_files) $(extdir)/Makefile
|
46
34
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
latest: NEWS
|
52
|
-
@awk 'BEGIN{RS="=== ";ORS=""}NR==2{sub(/\n$$/,"");print RS""$$0 }' $<
|
35
|
+
pkg_extra := GIT-VERSION-FILE NEWS ChangeLog LATEST
|
36
|
+
ChangeLog: GIT-VERSION-FILE .wrongdoc.yml
|
37
|
+
wrongdoc prepare
|
53
38
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
ChangeLog: log_range = v$(SINCE)..$(LOG_VERSION)
|
60
|
-
endif
|
61
|
-
ChangeLog: GIT-VERSION-FILE
|
62
|
-
@echo "ChangeLog from $(GIT_URL) ($(log_range))" > $@+
|
63
|
-
@echo >> $@+
|
64
|
-
git log $(log_range) | sed -e 's/^/ /' >> $@+
|
65
|
-
mv $@+ $@
|
66
|
-
|
67
|
-
news_atom := http://bogomips.org/sleepy_penguin/NEWS.atom.xml
|
68
|
-
cgit_atom := http://git.bogomips.org/cgit/sleepy_penguin.git/atom/?h=master
|
69
|
-
atom = <link rel="alternate" title="Atom feed" href="$(1)" \
|
70
|
-
type="application/atom+xml"/>
|
39
|
+
.manifest: ChangeLog
|
40
|
+
(git ls-files && for i in $@ $(pkg_extra); do echo $$i; done) | \
|
41
|
+
LC_ALL=C sort > $@+
|
42
|
+
cmp $@+ $@ || mv $@+ $@
|
43
|
+
$(RM) $@+
|
71
44
|
|
72
|
-
|
73
|
-
|
74
|
-
|
45
|
+
doc: .document .wrongdoc.yml
|
46
|
+
find lib ext -type f -name '*.rbc' -exec rm -f '{}' ';'
|
47
|
+
$(RM) -r doc
|
48
|
+
wrongdoc all
|
75
49
|
install -m644 COPYING doc/COPYING
|
76
50
|
install -m644 $(shell grep '^[A-Z]' .document) doc/
|
77
|
-
$(RUBY) -i -p -e \
|
78
|
-
'$$_.gsub!("</title>",%q{\&$(call atom,$(cgit_atom))})' \
|
79
|
-
doc/ChangeLog.html
|
80
|
-
$(RUBY) -i -p -e \
|
81
|
-
'$$_.gsub!("</title>",%q{\&$(call atom,$(news_atom))})' \
|
82
|
-
doc/NEWS.html doc/README.html
|
83
|
-
$(RAKE) -s news_atom > doc/NEWS.atom.xml
|
84
|
-
cd doc && ln README.html tmp && mv tmp index.html
|
85
51
|
|
86
52
|
ifneq ($(VERSION),)
|
87
53
|
rfproject := rainbows
|
@@ -94,10 +60,10 @@ release_changes := release_changes-$(VERSION)
|
|
94
60
|
release-notes: $(release_notes)
|
95
61
|
release-changes: $(release_changes)
|
96
62
|
$(release_changes):
|
97
|
-
|
63
|
+
wrongdoc release_changes > $@+
|
98
64
|
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
99
65
|
$(release_notes):
|
100
|
-
|
66
|
+
wrongdoc release_notes > $@+
|
101
67
|
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
102
68
|
|
103
69
|
# ensures we're actually on the tagged $(VERSION), only used for release
|
@@ -117,19 +83,19 @@ gem: $(pkggem)
|
|
117
83
|
install-gem: $(pkggem)
|
118
84
|
gem install $(CURDIR)/$<
|
119
85
|
|
120
|
-
$(pkggem): manifest fix-perms
|
86
|
+
$(pkggem): .manifest fix-perms
|
121
87
|
gem build $(rfpackage).gemspec
|
122
88
|
mkdir -p pkg
|
123
89
|
mv $(@F) $@
|
124
90
|
|
125
91
|
$(pkgtgz): distdir = $(basename $@)
|
126
92
|
$(pkgtgz): HEAD = v$(VERSION)
|
127
|
-
$(pkgtgz): manifest fix-perms
|
93
|
+
$(pkgtgz): .manifest fix-perms
|
128
94
|
@test -n "$(distdir)"
|
129
95
|
$(RM) -r $(distdir)
|
130
96
|
mkdir -p $(distdir)
|
131
|
-
tar
|
132
|
-
cd pkg && tar
|
97
|
+
tar cf - `cat .manifest` | (cd $(distdir) && tar xf -)
|
98
|
+
cd pkg && tar cf - $(basename $(@F)) | gzip -9 > $(@F)+
|
133
99
|
mv $@+ $@
|
134
100
|
|
135
101
|
package: $(pkgtgz) $(pkggem)
|
@@ -139,7 +105,7 @@ release: verify package $(release_notes) $(release_changes)
|
|
139
105
|
# make tgz release on RubyForge
|
140
106
|
rubyforge add_release -f -n $(release_notes) -a $(release_changes) \
|
141
107
|
$(rfproject) $(rfpackage) $(VERSION) $(pkgtgz)
|
142
|
-
# push gem to
|
108
|
+
# push gem to RubyGems.org
|
143
109
|
gem push $(pkggem)
|
144
110
|
# in case of gem downloads from RubyForge releases page
|
145
111
|
-rubyforge add_file \
|
@@ -151,12 +117,12 @@ gem install-gem: GIT-VERSION-FILE
|
|
151
117
|
$(MAKE) $@ VERSION=$(GIT_VERSION)
|
152
118
|
endif
|
153
119
|
|
154
|
-
extdir := ext/sleepy_penguin
|
155
120
|
ext := $(extdir)/sleepy_penguin_ext.$(DLEXT)
|
156
121
|
$(extdir)/Makefile: $(extdir)/extconf.rb
|
157
122
|
cd $(@D) && $(RUBY) extconf.rb
|
158
123
|
|
159
|
-
|
124
|
+
c_files := $(wildcard $(extdir)/*.[ch] $(extdir)/*/*.h)
|
125
|
+
$(ext): $(c_files) $(extdir)/Makefile
|
160
126
|
$(MAKE) -C $(@D)
|
161
127
|
|
162
128
|
all:: test
|
@@ -171,11 +137,9 @@ $(test_units): build
|
|
171
137
|
# this requires GNU coreutils variants
|
172
138
|
publish_doc:
|
173
139
|
-git set-file-times
|
174
|
-
$(
|
175
|
-
|
176
|
-
|
177
|
-
find doc/images doc/js -type f | \
|
178
|
-
TZ=UTC xargs touch -d '1970-01-01 00:00:00' doc/rdoc.css
|
140
|
+
$(MAKE) doc
|
141
|
+
find doc/images -type f | \
|
142
|
+
TZ=UTC xargs touch -d '1970-01-01 00:00:06' doc/rdoc.css
|
179
143
|
$(MAKE) doc_gz
|
180
144
|
chmod 644 $$(find doc -type f)
|
181
145
|
$(RSYNC) -av doc/ bogomips.org:/srv/bogomips/sleepy_penguin/
|
@@ -185,8 +149,7 @@ publish_doc:
|
|
185
149
|
# "gzip_static on" can serve the gzipped versions directly.
|
186
150
|
doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.\(gif\|jpg\|png\|gz\)$$')
|
187
151
|
doc_gz:
|
188
|
-
touch doc/NEWS.atom.xml -d "$$(awk 'NR==1{print $$4,$$5,$$6}' NEWS)"
|
189
152
|
for i in $(docs); do \
|
190
153
|
gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
|
191
154
|
|
192
|
-
.PHONY: .FORCE-GIT-VERSION-FILE doc
|
155
|
+
.PHONY: .FORCE-GIT-VERSION-FILE doc test $(test_units)
|
data/LATEST
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
=== sleepy_penguin 1.1.1 - soft feathers, soft delete / 2011-01-13 22:41 UTC
|
2
|
+
|
3
|
+
SleepyPenguin::Epoll#delete method added for "soft" failures
|
4
|
+
Documentation updates and cleanups, the website is now
|
5
|
+
JavaScript-free!
|
6
|
+
|
7
|
+
(Ignore the 1.1.0 "release", it was a lie)
|
8
|
+
|
data/NEWS
CHANGED
@@ -1,4 +1,12 @@
|
|
1
|
-
=== 1.
|
1
|
+
=== sleepy_penguin 1.1.1 - soft feathers, soft delete / 2011-01-13 22:41 UTC
|
2
|
+
|
3
|
+
SleepyPenguin::Epoll#delete method added for "soft" failures
|
4
|
+
Documentation updates and cleanups, the website is now
|
5
|
+
JavaScript-free!
|
6
|
+
|
7
|
+
(Ignore the 1.1.0 "release", it was a lie)
|
8
|
+
|
9
|
+
=== sleepy_penguin 1.0.0 / 2010-09-26 06:31 UTC
|
2
10
|
|
3
11
|
Initial release
|
4
12
|
|
data/README
CHANGED
data/Rakefile
CHANGED
@@ -1,106 +1,8 @@
|
|
1
1
|
# -*- encoding: binary -*-
|
2
|
-
# most tasks are in the GNUmakefile which offers better parallelism
|
3
|
-
def tags
|
4
|
-
timefmt = '%Y-%m-%dT%H:%M:%SZ'
|
5
|
-
@tags ||= `git tag -l`.split(/\n/).map do |tag|
|
6
|
-
if %r{\Av[\d\.]+\z} =~ tag
|
7
|
-
header, subject, body = `git cat-file tag #{tag}`.split(/\n\n/, 3)
|
8
|
-
header = header.split(/\n/)
|
9
|
-
tagger = header.grep(/\Atagger /).first
|
10
|
-
body ||= "initial"
|
11
|
-
{
|
12
|
-
:time => Time.at(tagger.split(/ /)[-2].to_i).utc.strftime(timefmt),
|
13
|
-
:tagger_name => %r{^tagger ([^<]+)}.match(tagger)[1].strip,
|
14
|
-
:tagger_email => %r{<([^>]+)>}.match(tagger)[1].strip,
|
15
|
-
:id => `git rev-parse refs/tags/#{tag}`.chomp!,
|
16
|
-
:tag => tag,
|
17
|
-
:subject => subject,
|
18
|
-
:body => body,
|
19
|
-
}
|
20
|
-
end
|
21
|
-
end.compact.sort { |a,b| b[:time] <=> a[:time] }
|
22
|
-
end
|
23
|
-
|
24
2
|
cgit_url = "http://git.bogomips.org/cgit/sleepy_penguin.git"
|
25
|
-
git_url =
|
26
|
-
web_url = "http://bogomips.org/sleepy_penguin"
|
27
|
-
|
28
|
-
desc 'prints news as an Atom feed'
|
29
|
-
task :news_atom do
|
30
|
-
require 'nokogiri'
|
31
|
-
new_tags = tags[0,10]
|
32
|
-
puts(Nokogiri::XML::Builder.new do
|
33
|
-
feed :xmlns => "http://www.w3.org/2005/Atom" do
|
34
|
-
id! "#{web_url}NEWS.atom.xml"
|
35
|
-
title "sleepy_penguin news"
|
36
|
-
subtitle "epoll"
|
37
|
-
link! :rel => "alternate", :type => "text/html",
|
38
|
-
:href => "#{web_url}NEWS.html"
|
39
|
-
updated(new_tags.empty? ? "1970-01-01T00:00:00Z" : new_tags.first[:time])
|
40
|
-
new_tags.each do |tag|
|
41
|
-
entry do
|
42
|
-
title tag[:subject]
|
43
|
-
updated tag[:time]
|
44
|
-
published tag[:time]
|
45
|
-
author {
|
46
|
-
name tag[:tagger_name]
|
47
|
-
email tag[:tagger_email]
|
48
|
-
}
|
49
|
-
url = "#{cgit_url}/tag/?id=#{tag[:tag]}"
|
50
|
-
link! :rel => "alternate", :type => "text/html", :href =>url
|
51
|
-
id! url
|
52
|
-
message_only = tag[:body].split(/\n.+\(\d+\):\n {6}/s).first.strip
|
53
|
-
content({:type =>:text}, message_only)
|
54
|
-
content(:type =>:xhtml) { pre tag[:body] }
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end.to_xml)
|
59
|
-
end
|
60
|
-
|
61
|
-
desc 'prints RDoc-formatted news'
|
62
|
-
task :news_rdoc do
|
63
|
-
tags.each do |tag|
|
64
|
-
time = tag[:time].tr!('T', ' ').gsub!(/:\d\dZ/, ' UTC')
|
65
|
-
puts "=== #{tag[:tag].sub(/^v/, '')} / #{time}"
|
66
|
-
puts ""
|
67
|
-
|
68
|
-
body = tag[:body]
|
69
|
-
puts tag[:body].gsub(/^/sm, " ").gsub(/[ \t]+$/sm, "")
|
70
|
-
puts ""
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
desc "print release changelog for Rubyforge"
|
75
|
-
task :release_changes do
|
76
|
-
version = ENV['VERSION'] or abort "VERSION= needed"
|
77
|
-
version = "v#{version}"
|
78
|
-
vtags = tags.map { |tag| tag[:tag] =~ /\Av/ and tag[:tag] }.sort
|
79
|
-
prev = vtags[vtags.index(version) - 1]
|
80
|
-
if prev
|
81
|
-
system('git', 'diff', '--stat', prev, version) or abort $?
|
82
|
-
puts ""
|
83
|
-
system('git', 'log', "#{prev}..#{version}") or abort $?
|
84
|
-
else
|
85
|
-
system('git', 'log', version) or abort $?
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
desc "print release notes for Rubyforge"
|
90
|
-
task :release_notes do
|
91
|
-
spec = Gem::Specification.load('sleepy_penguin.gemspec')
|
92
|
-
puts spec.description.strip
|
93
|
-
puts ""
|
94
|
-
puts "* #{spec.homepage}"
|
95
|
-
puts "* #{spec.email}"
|
96
|
-
puts "* #{git_url}"
|
97
|
-
|
98
|
-
_, _, body = `git cat-file tag v#{spec.version}`.split(/\n\n/, 3)
|
99
|
-
print "\nChanges:\n\n"
|
100
|
-
puts body
|
101
|
-
end
|
3
|
+
git_url = 'git://git.bogomips.org/sleepy_penguin.git'
|
102
4
|
|
103
|
-
desc "
|
5
|
+
desc "post news article to rubyforge"
|
104
6
|
task :publish_news do
|
105
7
|
require 'rubyforge'
|
106
8
|
spec = Gem::Specification.load('sleepy_penguin.gemspec')
|
data/ext/sleepy_penguin/epoll.c
CHANGED
@@ -206,6 +206,8 @@ static VALUE ctl(VALUE self, VALUE io, VALUE flags, int op)
|
|
206
206
|
}
|
207
207
|
|
208
208
|
/*
|
209
|
+
* used to avoid exceptions when your app is too lazy to check
|
210
|
+
* what state a descriptor is in
|
209
211
|
*/
|
210
212
|
static VALUE set(VALUE self, VALUE io, VALUE flags)
|
211
213
|
{
|
@@ -232,6 +234,29 @@ static VALUE set(VALUE self, VALUE io, VALUE flags)
|
|
232
234
|
return INT2NUM(rv);
|
233
235
|
}
|
234
236
|
|
237
|
+
/*
|
238
|
+
* Deletes an +io+ from an epoll set, but returns nil
|
239
|
+
* on ENOENT instead of raising an error. This is useful
|
240
|
+
* for apps that do not care to track the status of an
|
241
|
+
* epoll object itself.
|
242
|
+
*/
|
243
|
+
static VALUE delete(VALUE self, VALUE io)
|
244
|
+
{
|
245
|
+
struct rb_epoll *ep = ep_get(self);
|
246
|
+
int fd = my_fileno(io);
|
247
|
+
int rv;
|
248
|
+
|
249
|
+
ep_check(ep);
|
250
|
+
rv = epoll_ctl(ep->fd, EPOLL_CTL_DEL, fd, NULL);
|
251
|
+
if (rv == -1) {
|
252
|
+
if (errno != ENOENT)
|
253
|
+
rb_sys_fail("epoll_ctl - del");
|
254
|
+
errno = 0;
|
255
|
+
return Qnil;
|
256
|
+
}
|
257
|
+
return INT2NUM(rv);
|
258
|
+
}
|
259
|
+
|
235
260
|
static VALUE epwait_result(struct rb_epoll *ep, int n)
|
236
261
|
{
|
237
262
|
int i;
|
@@ -375,6 +400,13 @@ static VALUE real_epwait(struct rb_epoll *ep)
|
|
375
400
|
}
|
376
401
|
#endif /* 1.8 Green thread compatibility code */
|
377
402
|
|
403
|
+
/*
|
404
|
+
* Calls epoll_wait(2) and yields
|
405
|
+
*
|
406
|
+
* :call-seq:
|
407
|
+
*
|
408
|
+
* epoll.wait(64, 1000) { |flags, obj| ... }
|
409
|
+
*/
|
378
410
|
static VALUE epwait(int argc, VALUE *argv, VALUE self)
|
379
411
|
{
|
380
412
|
VALUE timeout, maxevents;
|
@@ -529,7 +561,7 @@ void sleepy_penguin_init_epoll(void)
|
|
529
561
|
{
|
530
562
|
VALUE mSleepyPenguin, cEpoll;
|
531
563
|
|
532
|
-
mSleepyPenguin =
|
564
|
+
mSleepyPenguin = rb_define_module("SleepyPenguin");
|
533
565
|
cEpoll = rb_define_class_under(mSleepyPenguin, "Epoll", rb_cObject);
|
534
566
|
cEpoll_IO = rb_define_class_under(cEpoll, "IO", rb_cIO);
|
535
567
|
rb_define_method(cEpoll, "initialize", init, -1);
|
@@ -541,6 +573,7 @@ void sleepy_penguin_init_epoll(void)
|
|
541
573
|
rb_define_method(cEpoll, "add", add, 2);
|
542
574
|
rb_define_method(cEpoll, "mod", mod, 2);
|
543
575
|
rb_define_method(cEpoll, "del", del, 1);
|
576
|
+
rb_define_method(cEpoll, "delete", delete, 1);
|
544
577
|
rb_define_method(cEpoll, "set", set, 2);
|
545
578
|
rb_define_method(cEpoll, "wait", epwait, -1);
|
546
579
|
rb_define_const(cEpoll, "CLOEXEC", INT2NUM(EPOLL_CLOEXEC));
|
@@ -156,7 +156,7 @@ void sleepy_penguin_init_eventfd(void)
|
|
156
156
|
{
|
157
157
|
VALUE mSleepyPenguin, cEventFD;
|
158
158
|
|
159
|
-
mSleepyPenguin =
|
159
|
+
mSleepyPenguin = rb_define_module("SleepyPenguin");
|
160
160
|
cEventFD = rb_define_class_under(mSleepyPenguin, "EventFD", rb_cIO);
|
161
161
|
rb_define_singleton_method(cEventFD, "new", create, -1);
|
162
162
|
#ifdef EFD_NONBLOCK
|
@@ -107,7 +107,7 @@ void sleepy_penguin_init_timerfd(void)
|
|
107
107
|
{
|
108
108
|
VALUE mSleepyPenguin, cTimerFD;
|
109
109
|
|
110
|
-
mSleepyPenguin =
|
110
|
+
mSleepyPenguin = rb_define_module("SleepyPenguin");
|
111
111
|
cTimerFD = rb_define_class_under(mSleepyPenguin, "TimerFD", rb_cIO);
|
112
112
|
rb_define_singleton_method(cTimerFD, "create", create, -1);
|
113
113
|
rb_define_singleton_method(cTimerFD, "new", create, -1);
|
data/lib/sleepy_penguin.rb
CHANGED
data/sleepy_penguin.gemspec
CHANGED
@@ -1,36 +1,26 @@
|
|
1
1
|
ENV["VERSION"] or abort "VERSION= must be specified"
|
2
2
|
manifest = File.readlines('.manifest').map! { |x| x.chomp! }
|
3
|
-
|
4
|
-
|
3
|
+
require 'wrongdoc'
|
4
|
+
extend Wrongdoc::Gemspec
|
5
|
+
name, summary, title = readme_metadata
|
5
6
|
|
6
7
|
Gem::Specification.new do |s|
|
7
8
|
s.name = %q{sleepy_penguin}
|
8
|
-
s.version = ENV["VERSION"]
|
9
|
-
|
9
|
+
s.version = ENV["VERSION"].dup
|
10
10
|
s.homepage = 'http://bogomips.org/sleepy_penguin/'
|
11
|
-
s.authors = ["
|
11
|
+
s.authors = ["#{name} hackers"]
|
12
12
|
s.date = Time.now.utc.strftime('%Y-%m-%d')
|
13
|
-
s.description =
|
13
|
+
s.description = readme_description
|
14
14
|
s.email = %q{sleepy.penguin@librelist.com}
|
15
|
-
|
16
|
-
s.extra_rdoc_files = File.readlines('.document').map! do |x|
|
17
|
-
x.chomp!
|
18
|
-
if File.directory?(x)
|
19
|
-
manifest.grep(%r{\A#{x}/})
|
20
|
-
elsif File.file?(x)
|
21
|
-
x
|
22
|
-
else
|
23
|
-
nil
|
24
|
-
end
|
25
|
-
end.flatten.compact
|
26
|
-
|
15
|
+
s.extra_rdoc_files = extra_rdoc_files(manifest)
|
27
16
|
s.files = manifest
|
28
|
-
s.rdoc_options =
|
17
|
+
s.rdoc_options = rdoc_options
|
29
18
|
s.require_paths = %w(lib ext)
|
30
19
|
s.rubyforge_project = %q{rainbows}
|
31
20
|
s.summary = summary
|
32
21
|
s.test_files = Dir['test/test_*.rb']
|
33
22
|
s.extensions = %w(ext/sleepy_penguin/extconf.rb)
|
23
|
+
s.add_development_dependency('wrongdoc', '~> 1.3')
|
34
24
|
|
35
25
|
# s.license = %w(LGPL) # disabled for compatibility with older RubyGems
|
36
26
|
end
|
data/test/test_epoll.rb
CHANGED
@@ -14,10 +14,6 @@ class TestEpoll < Test::Unit::TestCase
|
|
14
14
|
@ep = Epoll.new
|
15
15
|
end
|
16
16
|
|
17
|
-
def teardown
|
18
|
-
[ @rd, @wr, @ep ].each { |io| io.close unless io.closed? }
|
19
|
-
end
|
20
|
-
|
21
17
|
def test_cross_thread
|
22
18
|
tmp = []
|
23
19
|
Thread.new { sleep 0.100; @ep.add(@wr, Epoll::OUT) }
|
@@ -317,4 +313,12 @@ class TestEpoll < Test::Unit::TestCase
|
|
317
313
|
io = Epoll.new.to_io
|
318
314
|
assert((io.fcntl(Fcntl::F_GETFD) & Fcntl::FD_CLOEXEC) == Fcntl::FD_CLOEXEC)
|
319
315
|
end
|
316
|
+
|
317
|
+
def test_delete
|
318
|
+
assert_nil @ep.delete(@rd)
|
319
|
+
assert_nil @ep.delete(@wr)
|
320
|
+
assert_nothing_raised { @ep.add @rd, Epoll::IN }
|
321
|
+
assert_equal 0, @ep.delete(@rd)
|
322
|
+
assert_nil @ep.delete(@rd)
|
323
|
+
end
|
320
324
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sleepy_penguin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 1.
|
8
|
+
- 1
|
9
|
+
- 1
|
10
|
+
version: 1.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- sleepy_penguin hackers
|
@@ -15,10 +15,24 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-01-13 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: wrongdoc
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 9
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 3
|
33
|
+
version: "1.3"
|
34
|
+
type: :development
|
35
|
+
version_requirements: *id001
|
22
36
|
description: |-
|
23
37
|
sleepy_penguin provides access to newer, Linux-only system calls to wait
|
24
38
|
on events from traditionally non-I/O sources. Bindings to the eventfd,
|
@@ -36,17 +50,20 @@ extra_rdoc_files:
|
|
36
50
|
- ChangeLog
|
37
51
|
- lib/sleepy_penguin.rb
|
38
52
|
- ext/sleepy_penguin/init.c
|
53
|
+
- ext/sleepy_penguin/epoll.c
|
39
54
|
- ext/sleepy_penguin/eventfd.c
|
40
55
|
- ext/sleepy_penguin/timerfd.c
|
41
56
|
files:
|
42
57
|
- .document
|
43
58
|
- .gitignore
|
44
59
|
- .manifest
|
60
|
+
- .wrongdoc.yml
|
45
61
|
- COPYING
|
46
62
|
- ChangeLog
|
47
63
|
- GIT-VERSION-FILE
|
48
64
|
- GIT-VERSION-GEN
|
49
65
|
- GNUmakefile
|
66
|
+
- LATEST
|
50
67
|
- LICENSE
|
51
68
|
- NEWS
|
52
69
|
- README
|
@@ -73,7 +90,9 @@ licenses: []
|
|
73
90
|
post_install_message:
|
74
91
|
rdoc_options:
|
75
92
|
- -t
|
76
|
-
-
|
93
|
+
- sleepy_penguin - Linux I/O events for Ruby
|
94
|
+
- -W
|
95
|
+
- http://git.bogomips.org/cgit/sleepy_penguin.git/tree/%s
|
77
96
|
require_paths:
|
78
97
|
- lib
|
79
98
|
- ext
|
@@ -101,7 +120,7 @@ rubyforge_project: rainbows
|
|
101
120
|
rubygems_version: 1.3.7
|
102
121
|
signing_key:
|
103
122
|
specification_version: 3
|
104
|
-
summary:
|
123
|
+
summary: Linux I/O events for Ruby
|
105
124
|
test_files:
|
106
125
|
- test/test_epoll.rb
|
107
126
|
- test/test_eventfd.rb
|