supplement 1.7 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -1
- data/README +3 -2
- data/lib/Rakefile +2 -1
- data/lib/mkrf_conf +5 -1
- data/lib/process.c +71 -0
- data/lib/process.h +13 -0
- data/lib/supplement.c +6 -176
- data/lib/supplement.h +0 -2
- data/lib/supplement/dir.rb +49 -0
- data/lib/supplement/filesys.h +5 -1
- data/lib/supplement/itimer.c +2 -2
- data/lib/supplement/itimer.h +5 -1
- data/lib/supplement/locked.c +127 -0
- data/lib/supplement/locked.h +20 -0
- metadata +17 -15
- data/lib/sync.c +0 -34
- data/lib/sync.h +0 -13
data/LICENSE
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|___/\__,_| .__/| .__/|_|\___|_| |_| |_|\___|_| |_|\__|
|
6
6
|
|_| |_|
|
7
7
|
|
8
|
-
Copyright (
|
8
|
+
Copyright (C) 2009-2014, Bertram Scharpf <software@bertram-scharpf.de>.
|
9
9
|
All rights reserved.
|
10
10
|
|
11
11
|
Redistribution and use in source and binary forms, with or without
|
data/README
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= supplement 1
|
1
|
+
= supplement 2.2.1 -- Useful Ruby enhancements
|
2
2
|
|
3
3
|
Some simple Ruby extensions.
|
4
4
|
|
@@ -39,7 +39,8 @@ Now here it is where I can just point to.
|
|
39
39
|
* Array#notempty?
|
40
40
|
* Hash#notempty?
|
41
41
|
* Struct.[]
|
42
|
+
* Process.renice
|
42
43
|
* Interval timer
|
43
44
|
* File system stats
|
44
|
-
*
|
45
|
+
* LockedFile
|
45
46
|
|
data/lib/Rakefile
CHANGED
@@ -12,7 +12,8 @@ rule ".o" => ".c" do |t|
|
|
12
12
|
end
|
13
13
|
|
14
14
|
DLs = {
|
15
|
-
"supplement.so" => %w(supplement.o
|
15
|
+
"supplement.so" => %w(supplement.o process.o),
|
16
|
+
"supplement/locked.so" => %w(supplement/locked.o),
|
16
17
|
"supplement/filesys.so" => %w(supplement/filesys.o),
|
17
18
|
"supplement/itimer.so" => %w(supplement/itimer.o),
|
18
19
|
"supplement/terminal.so" => %w(supplement/terminal.o),
|
data/lib/mkrf_conf
CHANGED
@@ -21,7 +21,6 @@ Autorake.configure {
|
|
21
21
|
enable :string_start_with
|
22
22
|
enable :thread_exclusive
|
23
23
|
end
|
24
|
-
have_header "rubysig.h"
|
25
24
|
end
|
26
25
|
end
|
27
26
|
|
@@ -30,12 +29,17 @@ Autorake.configure {
|
|
30
29
|
have_header "st.h"
|
31
30
|
have_header "rubyio.h"
|
32
31
|
have_header "re.h"
|
32
|
+
have_header "rubysig.h"
|
33
33
|
else
|
34
34
|
have_header "ruby/ruby.h"
|
35
35
|
have_header "ruby/st.h"
|
36
36
|
have_header "ruby/io.h"
|
37
37
|
have_header "ruby/re.h"
|
38
|
+
|
39
|
+
have_function "rb_thread_wait_for"
|
38
40
|
end
|
39
41
|
|
42
|
+
have_function "cbrt"
|
43
|
+
|
40
44
|
}
|
41
45
|
|
data/lib/process.c
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
/*
|
2
|
+
* process.c -- Renice; sync all
|
3
|
+
*/
|
4
|
+
|
5
|
+
|
6
|
+
#include "process.h"
|
7
|
+
|
8
|
+
#if HAVE_HEADER_RUBY_H
|
9
|
+
#include <ruby.h>
|
10
|
+
#elif HAVE_HEADER_RUBY_RUBY_H
|
11
|
+
#include <ruby/ruby.h>
|
12
|
+
#endif
|
13
|
+
|
14
|
+
#include <sys/time.h>
|
15
|
+
#include <sys/resource.h>
|
16
|
+
|
17
|
+
#include <unistd.h>
|
18
|
+
|
19
|
+
|
20
|
+
static VALUE rb_process_renice( int argc, VALUE *argv, VALUE obj);
|
21
|
+
static VALUE rb_process_sync( VALUE obj);
|
22
|
+
|
23
|
+
|
24
|
+
/*
|
25
|
+
* call-seq:
|
26
|
+
* Process.renice( pid = nil, priority) -> nil
|
27
|
+
*
|
28
|
+
* Set a new nice value. If pid is +nil+, renice the current process.
|
29
|
+
*/
|
30
|
+
|
31
|
+
VALUE
|
32
|
+
rb_process_renice( int argc, VALUE *argv, VALUE obj)
|
33
|
+
{
|
34
|
+
VALUE p1, p2;
|
35
|
+
pid_t pid;
|
36
|
+
int prio;
|
37
|
+
|
38
|
+
if (rb_scan_args( argc, argv, "11", &p1, &p2) == 1)
|
39
|
+
pid = getpid(), prio = NUM2INT( p1);
|
40
|
+
else
|
41
|
+
pid = NUM2INT( p1), prio = NUM2INT( p2);
|
42
|
+
|
43
|
+
rb_secure(2);
|
44
|
+
if (setpriority( PRIO_PROCESS, pid, prio) < 0)
|
45
|
+
rb_sys_fail(0);
|
46
|
+
|
47
|
+
return Qnil;
|
48
|
+
}
|
49
|
+
|
50
|
+
|
51
|
+
/*
|
52
|
+
* call-seq:
|
53
|
+
* Process.sync -> nil
|
54
|
+
*
|
55
|
+
* Force completion of pending disk writes (flush cache). See sync(8).
|
56
|
+
*/
|
57
|
+
|
58
|
+
VALUE
|
59
|
+
rb_process_sync( VALUE obj)
|
60
|
+
{
|
61
|
+
sync();
|
62
|
+
return Qnil;
|
63
|
+
}
|
64
|
+
|
65
|
+
|
66
|
+
void Init_supplement_process( void)
|
67
|
+
{
|
68
|
+
rb_define_singleton_method( rb_mProcess, "renice", rb_process_renice, -1);
|
69
|
+
rb_define_singleton_method( rb_mProcess, "sync", rb_process_sync, 0);
|
70
|
+
}
|
71
|
+
|
data/lib/process.h
ADDED
data/lib/supplement.c
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
#include "supplement.h"
|
6
6
|
|
7
|
-
#include "
|
7
|
+
#include "process.h"
|
8
8
|
|
9
9
|
#if HAVE_HEADER_ST_H
|
10
10
|
#include <st.h>
|
@@ -29,12 +29,6 @@
|
|
29
29
|
#endif
|
30
30
|
|
31
31
|
|
32
|
-
#include <sys/stat.h>
|
33
|
-
#include <sys/file.h>
|
34
|
-
#include <math.h>
|
35
|
-
|
36
|
-
|
37
|
-
|
38
32
|
#ifdef HAVE_HEADER_RUBY_H
|
39
33
|
/* Oh what a bug! */
|
40
34
|
#define R_MATCH( obj) RMATCH( obj)
|
@@ -42,16 +36,6 @@
|
|
42
36
|
#endif
|
43
37
|
|
44
38
|
|
45
|
-
struct supplement_flock {
|
46
|
-
struct supplement_flock *prev;
|
47
|
-
VALUE file;
|
48
|
-
int op;
|
49
|
-
int last_op;
|
50
|
-
};
|
51
|
-
|
52
|
-
static struct supplement_flock *flocks_root = NULL;
|
53
|
-
|
54
|
-
|
55
39
|
static VALUE supplement_index_blk( VALUE);
|
56
40
|
static VALUE supplement_index_ref( VALUE, VALUE);
|
57
41
|
static VALUE supplement_rindex_blk( VALUE);
|
@@ -64,11 +48,7 @@ static VALUE supplement_rindex_val( VALUE, VALUE);
|
|
64
48
|
static VALUE supplement_reject( VALUE);
|
65
49
|
static VALUE supplement_invert_yield( VALUE);
|
66
50
|
#endif
|
67
|
-
static VALUE supplement_each_line( VALUE);
|
68
|
-
static void supplement_init_flock( struct supplement_flock *, VALUE, VALUE);
|
69
|
-
static VALUE supplement_do_unflock( VALUE);
|
70
51
|
static VALUE supplement_do_unumask( VALUE);
|
71
|
-
static VALUE supplement_chdir( VALUE);
|
72
52
|
#ifdef FEATURE_THREAD_EXCLUSIVE
|
73
53
|
static VALUE bsruby_set_thread_critical( VALUE);
|
74
54
|
#endif
|
@@ -81,8 +61,6 @@ static ID id_eqq;
|
|
81
61
|
#ifdef FEATURE_ARRAY_SELECT_BANG
|
82
62
|
static ID id_reject_bang;
|
83
63
|
#endif
|
84
|
-
static ID id_chdir;
|
85
|
-
static ID id_path;
|
86
64
|
static ID id_mkdir;
|
87
65
|
static ID id_index;
|
88
66
|
|
@@ -828,6 +806,9 @@ rb_num_sqrt( VALUE num)
|
|
828
806
|
VALUE
|
829
807
|
rb_num_cbrt( VALUE num)
|
830
808
|
{
|
809
|
+
#if HAVE_FUNC_CBRT
|
810
|
+
return rb_float_new( cbrt( RFLOAT_VALUE( rb_Float( num))));
|
811
|
+
#else
|
831
812
|
double n;
|
832
813
|
int neg;
|
833
814
|
int i;
|
@@ -848,6 +829,7 @@ rb_num_cbrt( VALUE num)
|
|
848
829
|
n = w;
|
849
830
|
}
|
850
831
|
return rb_float_new( neg ? -n : n);
|
832
|
+
#endif
|
851
833
|
}
|
852
834
|
|
853
835
|
|
@@ -1205,120 +1187,6 @@ rb_file_size( VALUE obj)
|
|
1205
1187
|
}
|
1206
1188
|
|
1207
1189
|
|
1208
|
-
/*
|
1209
|
-
* call-seq:
|
1210
|
-
* flockb( excl = nil, nb = nil) { || ... } -> nil
|
1211
|
-
*
|
1212
|
-
* Lock file using the <code>flock()</code> system call.
|
1213
|
-
* When the <code>nb</code> flag is <code>true</code>, the method
|
1214
|
-
* won't block but rather raise an exception. Catch
|
1215
|
-
* <code>SystemCallError</code>. The calls may be nested in any order.
|
1216
|
-
*
|
1217
|
-
* File.open "/var/mail/joe", "a" do |f|
|
1218
|
-
* f.flockb true do
|
1219
|
-
* f.write another_message
|
1220
|
-
* end
|
1221
|
-
* end
|
1222
|
-
*/
|
1223
|
-
|
1224
|
-
VALUE
|
1225
|
-
rb_file_flockb( int argc, VALUE *argv, VALUE file)
|
1226
|
-
{
|
1227
|
-
VALUE excl, nb;
|
1228
|
-
struct supplement_flock cur_flock;
|
1229
|
-
#ifdef HAVE_HEADER_RUBY_H
|
1230
|
-
OpenFile *fptr;
|
1231
|
-
#else
|
1232
|
-
rb_io_t *fptr;
|
1233
|
-
#endif
|
1234
|
-
int op;
|
1235
|
-
|
1236
|
-
rb_scan_args( argc, argv, "02", &excl, &nb);
|
1237
|
-
supplement_init_flock( &cur_flock, file, excl);
|
1238
|
-
|
1239
|
-
op = cur_flock.op | LOCK_NB;
|
1240
|
-
GetOpenFile( file, fptr);
|
1241
|
-
#ifdef HAVE_HEADER_RUBY_H
|
1242
|
-
while (flock( fileno( fptr->f), op) < 0) {
|
1243
|
-
#else
|
1244
|
-
while (flock( fptr->fd, op) < 0) {
|
1245
|
-
#endif
|
1246
|
-
switch (errno) {
|
1247
|
-
case EAGAIN:
|
1248
|
-
case EACCES:
|
1249
|
-
#if defined( EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
|
1250
|
-
case EWOULDBLOCK:
|
1251
|
-
#endif
|
1252
|
-
if (!RTEST( nb)) {
|
1253
|
-
rb_thread_polling(); /* busy wait */
|
1254
|
-
rb_io_check_closed( fptr);
|
1255
|
-
continue;
|
1256
|
-
}
|
1257
|
-
/* fall through */
|
1258
|
-
default:
|
1259
|
-
#ifdef HAVE_HEADER_RUBY_H
|
1260
|
-
rb_sys_fail( fptr->path);
|
1261
|
-
#else
|
1262
|
-
rb_sys_fail_str( fptr->pathv);
|
1263
|
-
#endif
|
1264
|
-
}
|
1265
|
-
}
|
1266
|
-
cur_flock.prev = flocks_root;
|
1267
|
-
flocks_root = &cur_flock;
|
1268
|
-
return rb_ensure( rb_yield, Qnil, supplement_do_unflock, Qnil);
|
1269
|
-
}
|
1270
|
-
|
1271
|
-
void
|
1272
|
-
supplement_init_flock( struct supplement_flock *s, VALUE file, VALUE excl)
|
1273
|
-
{
|
1274
|
-
struct supplement_flock *i;
|
1275
|
-
|
1276
|
-
s->file = file;
|
1277
|
-
|
1278
|
-
s->last_op = LOCK_UN;
|
1279
|
-
for (i = flocks_root; i != NULL; i = i->prev) {
|
1280
|
-
if (i->file == file) {
|
1281
|
-
s->last_op = i->op;
|
1282
|
-
break;
|
1283
|
-
}
|
1284
|
-
}
|
1285
|
-
|
1286
|
-
switch (s->last_op) {
|
1287
|
-
case LOCK_UN:
|
1288
|
-
case LOCK_SH:
|
1289
|
-
s->op = RTEST( excl) ? LOCK_EX : LOCK_SH;
|
1290
|
-
break;
|
1291
|
-
case LOCK_EX:
|
1292
|
-
s->op = LOCK_EX;
|
1293
|
-
break;
|
1294
|
-
default:
|
1295
|
-
s->op = LOCK_UN; /* should never be reached. */
|
1296
|
-
break;
|
1297
|
-
}
|
1298
|
-
}
|
1299
|
-
|
1300
|
-
VALUE
|
1301
|
-
supplement_do_unflock( VALUE v)
|
1302
|
-
{
|
1303
|
-
#ifdef HAVE_HEADER_RUBY_H
|
1304
|
-
OpenFile *fptr;
|
1305
|
-
#else
|
1306
|
-
rb_io_t *fptr;
|
1307
|
-
#endif
|
1308
|
-
int fd;
|
1309
|
-
|
1310
|
-
GetOpenFile( flocks_root->file, fptr);
|
1311
|
-
#ifdef HAVE_HEADER_RUBY_H
|
1312
|
-
flock( fileno( fptr->f), flocks_root->last_op);
|
1313
|
-
#else
|
1314
|
-
flock( fptr->fd, flocks_root->last_op);
|
1315
|
-
#endif
|
1316
|
-
flocks_root = flocks_root->prev;
|
1317
|
-
|
1318
|
-
return Qnil;
|
1319
|
-
}
|
1320
|
-
|
1321
|
-
|
1322
1190
|
/*
|
1323
1191
|
* call-seq:
|
1324
1192
|
* umask() -> int
|
@@ -1447,40 +1315,6 @@ rb_dir_entries_bang( VALUE self)
|
|
1447
1315
|
}
|
1448
1316
|
|
1449
1317
|
|
1450
|
-
/*
|
1451
|
-
* call-seq:
|
1452
|
-
* chdir() -> nil
|
1453
|
-
* chdir() { |path| ... } -> obj
|
1454
|
-
*
|
1455
|
-
* As you probably expect, change the working directory like in
|
1456
|
-
* <code>Dir.chdir</code>.
|
1457
|
-
*
|
1458
|
-
*/
|
1459
|
-
|
1460
|
-
VALUE
|
1461
|
-
rb_dir_chdir( VALUE dir)
|
1462
|
-
{
|
1463
|
-
VALUE path;
|
1464
|
-
|
1465
|
-
if (!id_chdir) {
|
1466
|
-
id_chdir = rb_intern( "chdir");
|
1467
|
-
id_path = rb_intern( "path");
|
1468
|
-
}
|
1469
|
-
path = rb_funcall( dir, id_path, 0);
|
1470
|
-
if (rb_block_given_p())
|
1471
|
-
return rb_iterate( &supplement_chdir, path, &rb_yield, Qnil);
|
1472
|
-
else {
|
1473
|
-
supplement_chdir( path);
|
1474
|
-
return Qnil;
|
1475
|
-
}
|
1476
|
-
}
|
1477
|
-
|
1478
|
-
VALUE
|
1479
|
-
supplement_chdir( VALUE path)
|
1480
|
-
{
|
1481
|
-
return rb_funcall( rb_cDir, id_chdir, 1, path);
|
1482
|
-
}
|
1483
|
-
|
1484
1318
|
|
1485
1319
|
/*
|
1486
1320
|
* Document-class: Match
|
@@ -1669,13 +1503,11 @@ void Init_supplement( void)
|
|
1669
1503
|
rb_define_method( rb_cHash, "notempty?", rb_hash_notempty_p, 0);
|
1670
1504
|
|
1671
1505
|
rb_define_method( rb_cFile, "size", rb_file_size, 0);
|
1672
|
-
rb_define_method( rb_cFile, "flockb", rb_file_flockb, -1);
|
1673
1506
|
rb_define_singleton_method( rb_cFile, "umask", rb_file_s_umask, -1);
|
1674
1507
|
|
1675
1508
|
rb_define_singleton_method( rb_cDir, "current", rb_dir_s_current, 0);
|
1676
1509
|
rb_define_singleton_method( rb_cDir, "mkdir!", rb_dir_s_mkdir_bang, -1);
|
1677
1510
|
rb_define_method( rb_cDir, "entries!", rb_dir_entries_bang, 0);
|
1678
|
-
rb_define_method( rb_cDir, "chdir", rb_dir_chdir, 0);
|
1679
1511
|
|
1680
1512
|
rb_define_method( rb_cMatch, "begin", rb_match_begin, -1);
|
1681
1513
|
rb_define_method( rb_cMatch, "end", rb_match_end, -1);
|
@@ -1693,11 +1525,9 @@ void Init_supplement( void)
|
|
1693
1525
|
#ifdef FEATURE_ARRAY_SELECT_BANG
|
1694
1526
|
id_reject_bang = 0;
|
1695
1527
|
#endif
|
1696
|
-
id_chdir = 0;
|
1697
|
-
id_path = 0;
|
1698
1528
|
id_mkdir = 0;
|
1699
1529
|
id_index = 0;
|
1700
1530
|
|
1701
|
-
|
1531
|
+
Init_supplement_process();
|
1702
1532
|
}
|
1703
1533
|
|
data/lib/supplement.h
CHANGED
@@ -63,12 +63,10 @@ extern VALUE rb_num_cbrt( VALUE);
|
|
63
63
|
extern VALUE rb_hash_notempty_p( VALUE);
|
64
64
|
|
65
65
|
extern VALUE rb_file_size( VALUE);
|
66
|
-
extern VALUE rb_file_flockb( int, VALUE *, VALUE);
|
67
66
|
extern VALUE rb_file_s_umask( int, VALUE *);
|
68
67
|
extern VALUE rb_dir_s_current( VALUE);
|
69
68
|
extern VALUE rb_dir_s_mkdir_bang( int, VALUE *);
|
70
69
|
extern VALUE rb_dir_entries_bang( VALUE);
|
71
|
-
extern VALUE rb_dir_chdir( VALUE);
|
72
70
|
|
73
71
|
extern VALUE rb_match_begin( int, VALUE *, VALUE);
|
74
72
|
extern VALUE rb_match_end( int, VALUE *, VALUE);
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#
|
2
|
+
# supplement/dir.rb -- More Dir methods
|
3
|
+
#
|
4
|
+
|
5
|
+
class Dir
|
6
|
+
|
7
|
+
class <<self
|
8
|
+
|
9
|
+
# :call-seq:
|
10
|
+
# Dir.nuke!( name) -> nil
|
11
|
+
#
|
12
|
+
# Delete a directory, all its contents and all subdirectories.
|
13
|
+
# WARNING! This can cause serious damage.
|
14
|
+
#
|
15
|
+
def nuke! n
|
16
|
+
(new n).entries!.each { |e|
|
17
|
+
p = File.join n, e
|
18
|
+
if File.directory? p then
|
19
|
+
nuke! p
|
20
|
+
else
|
21
|
+
File.unlink p
|
22
|
+
end
|
23
|
+
}
|
24
|
+
rmdir n
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
# :call-seq:
|
29
|
+
# Dir.rmpath( name) -> nil
|
30
|
+
#
|
31
|
+
# Delete as many empty directories as possible.
|
32
|
+
#
|
33
|
+
def rmpath n
|
34
|
+
case n
|
35
|
+
when "/", "." then
|
36
|
+
else
|
37
|
+
if (new n).entries!.empty? then
|
38
|
+
rmdir n
|
39
|
+
d = File.dirname n
|
40
|
+
rmpath d
|
41
|
+
end
|
42
|
+
end
|
43
|
+
nil
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
data/lib/supplement/filesys.h
CHANGED
data/lib/supplement/itimer.c
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
#include "itimer.h"
|
7
7
|
|
8
|
-
#include <
|
8
|
+
#include <sys/time.h>
|
9
9
|
|
10
10
|
static void suppelement_sec_timeval( VALUE, struct timeval *t);
|
11
11
|
static VALUE suppelement_timeval_sec( struct timeval *);
|
@@ -61,7 +61,7 @@ suppelement_sec_timeval( VALUE secs, struct timeval *t)
|
|
61
61
|
d = modf( RFLOAT_VALUE(secs), &f);
|
62
62
|
t->tv_sec = (time_t) f, t->tv_usec = (time_t) (d*1e6+0.5);
|
63
63
|
if (f != t->tv_sec)
|
64
|
-
rb_raise( rb_eRangeError, "time interval out of Time range",
|
64
|
+
rb_raise( rb_eRangeError, "time interval %f out of Time range",
|
65
65
|
RFLOAT_VALUE(secs));
|
66
66
|
}
|
67
67
|
break;
|
data/lib/supplement/itimer.h
CHANGED
@@ -5,7 +5,11 @@
|
|
5
5
|
#ifndef __SUPPLEMENT_ITIMER_H__
|
6
6
|
#define __SUPPLEMENT_ITIMER_H__
|
7
7
|
|
8
|
-
#
|
8
|
+
#if HAVE_HEADER_RUBY_H
|
9
|
+
#include <ruby.h>
|
10
|
+
#elif HAVE_HEADER_RUBY_RUBY_H
|
11
|
+
#include <ruby/ruby.h>
|
12
|
+
#endif
|
9
13
|
|
10
14
|
|
11
15
|
extern VALUE rb_process_setitimer( int, VALUE *, VALUE);
|
@@ -0,0 +1,127 @@
|
|
1
|
+
/*
|
2
|
+
* supplement/locked.c -- Locked File
|
3
|
+
*/
|
4
|
+
|
5
|
+
#include "locked.h"
|
6
|
+
|
7
|
+
#if HAVE_HEADER_RUBYIO_H
|
8
|
+
#include <rubyio.h>
|
9
|
+
#elif HAVE_HEADER_RUBY_IO_H
|
10
|
+
#include <ruby/io.h>
|
11
|
+
#endif
|
12
|
+
|
13
|
+
#include <sys/file.h>
|
14
|
+
|
15
|
+
|
16
|
+
/*
|
17
|
+
* Document-class: LockedFile
|
18
|
+
*
|
19
|
+
* Open a File and lock it.
|
20
|
+
*/
|
21
|
+
|
22
|
+
/*
|
23
|
+
* call-seq:
|
24
|
+
* LockedFile.open( *args) -> file
|
25
|
+
* LockedFile.open( *args) { |file| ... } -> ob.j
|
26
|
+
*
|
27
|
+
* Same as File.open but do an +flock+. If the lock fails, the method
|
28
|
+
* +lock_failed+ will be called. If that doesn't exist, another lock
|
29
|
+
* will be tried.
|
30
|
+
*/
|
31
|
+
|
32
|
+
VALUE
|
33
|
+
rb_locked_init( int argc, VALUE *argv, VALUE self)
|
34
|
+
{
|
35
|
+
#ifdef HAVE_HEADER_RUBY_H
|
36
|
+
OpenFile *fptr;
|
37
|
+
#else
|
38
|
+
rb_io_t *fptr;
|
39
|
+
#endif
|
40
|
+
#ifdef HAVE_FUNC_RB_THREAD_WAIT_FOR
|
41
|
+
struct timeval time;
|
42
|
+
#endif
|
43
|
+
int op;
|
44
|
+
|
45
|
+
rb_call_super( argc, argv);
|
46
|
+
GetOpenFile( self, fptr);
|
47
|
+
|
48
|
+
op = fptr->mode & FMODE_WRITABLE ? LOCK_EX : LOCK_SH;
|
49
|
+
op |= LOCK_NB;
|
50
|
+
#ifdef HAVE_HEADER_RUBY_H
|
51
|
+
while (flock( fileno( fptr->f), op) < 0) {
|
52
|
+
#else
|
53
|
+
while (flock( fptr->fd, op) < 0) {
|
54
|
+
#endif
|
55
|
+
static ID id_lock_failed = 0;
|
56
|
+
|
57
|
+
switch (errno) {
|
58
|
+
case EINTR:
|
59
|
+
break;
|
60
|
+
case EAGAIN:
|
61
|
+
case EACCES:
|
62
|
+
#if defined( EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
|
63
|
+
case EWOULDBLOCK:
|
64
|
+
#endif
|
65
|
+
if (id_lock_failed == 0)
|
66
|
+
id_lock_failed = rb_intern( "lock_failed");
|
67
|
+
if (rb_respond_to( self, id_lock_failed))
|
68
|
+
rb_funcall( self, id_lock_failed, 0);
|
69
|
+
else {
|
70
|
+
#ifdef HAVE_FUNC_RB_THREAD_WAIT_FOR
|
71
|
+
time.tv_sec = 0;
|
72
|
+
time.tv_usec = 100 * 1000;
|
73
|
+
rb_thread_wait_for(time);
|
74
|
+
#else
|
75
|
+
rb_thread_polling();
|
76
|
+
#endif
|
77
|
+
}
|
78
|
+
break;
|
79
|
+
default:
|
80
|
+
#ifdef HAVE_HEADER_RUBY_H
|
81
|
+
rb_sys_fail( fptr->path);
|
82
|
+
#else
|
83
|
+
rb_sys_fail_str( fptr->pathv);
|
84
|
+
#endif
|
85
|
+
break;
|
86
|
+
}
|
87
|
+
}
|
88
|
+
return self;
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
/*
|
93
|
+
* call-seq:
|
94
|
+
* close() -> nil
|
95
|
+
*
|
96
|
+
* Unlock using flock and close.
|
97
|
+
*/
|
98
|
+
|
99
|
+
VALUE
|
100
|
+
rb_locked_close( VALUE self)
|
101
|
+
{
|
102
|
+
#ifdef HAVE_HEADER_RUBY_H
|
103
|
+
OpenFile *fptr;
|
104
|
+
#else
|
105
|
+
rb_io_t *fptr;
|
106
|
+
#endif
|
107
|
+
|
108
|
+
GetOpenFile( self, fptr);
|
109
|
+
#ifdef HAVE_HEADER_RUBY_H
|
110
|
+
flock( fileno( fptr->f), LOCK_UN);
|
111
|
+
#else
|
112
|
+
flock( fptr->fd, LOCK_UN);
|
113
|
+
#endif
|
114
|
+
rb_call_super( 0, NULL);
|
115
|
+
return Qnil;
|
116
|
+
}
|
117
|
+
|
118
|
+
void Init_locked( void)
|
119
|
+
{
|
120
|
+
VALUE rb_cLockedFile;
|
121
|
+
|
122
|
+
rb_cLockedFile = rb_define_class( "LockedFile", rb_cFile);
|
123
|
+
|
124
|
+
rb_define_method( rb_cLockedFile, "initialize", &rb_locked_init, -1);
|
125
|
+
rb_define_method( rb_cLockedFile, "close", &rb_locked_close, 0);
|
126
|
+
}
|
127
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
/*
|
2
|
+
* supplement/filesys.h -- File system tools
|
3
|
+
*/
|
4
|
+
|
5
|
+
#ifndef __SUPPLEMENT_FILESYS_H__
|
6
|
+
#define __SUPPLEMENT_FILESYS_H__
|
7
|
+
|
8
|
+
#if HAVE_HEADER_RUBY_H
|
9
|
+
#include <ruby.h>
|
10
|
+
#elif HAVE_HEADER_RUBY_RUBY_H
|
11
|
+
#include <ruby/ruby.h>
|
12
|
+
#endif
|
13
|
+
|
14
|
+
VALUE rb_locked_init( int argc, VALUE *argv, VALUE self);
|
15
|
+
VALUE rb_locked_close( VALUE self);
|
16
|
+
|
17
|
+
extern void Init_locked( void);
|
18
|
+
|
19
|
+
#endif
|
20
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: supplement
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,14 +9,14 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-01-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: autorake
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '2.0'
|
22
22
|
type: :runtime
|
@@ -24,13 +24,12 @@ dependencies:
|
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '2.0'
|
30
|
-
description:
|
31
|
-
|
32
|
-
|
33
|
-
email: <software@bertram-scharpf.de>
|
30
|
+
description: |
|
31
|
+
Simple methods that didn't manage to become part of standard Ruby.
|
32
|
+
email: "<software@bertram-scharpf.de>"
|
34
33
|
executables: []
|
35
34
|
extensions:
|
36
35
|
- lib/mkrf_conf
|
@@ -42,8 +41,11 @@ files:
|
|
42
41
|
- lib/Rakefile
|
43
42
|
- lib/supplement.c
|
44
43
|
- lib/supplement.h
|
45
|
-
- lib/
|
46
|
-
- lib/
|
44
|
+
- lib/process.c
|
45
|
+
- lib/process.h
|
46
|
+
- lib/supplement/locked.c
|
47
|
+
- lib/supplement/locked.h
|
48
|
+
- lib/supplement/dir.rb
|
47
49
|
- lib/supplement/filesys.c
|
48
50
|
- lib/supplement/filesys.h
|
49
51
|
- lib/supplement/itimer.c
|
@@ -58,28 +60,28 @@ homepage: http://www.bertram-scharpf.de/software/supplement
|
|
58
60
|
licenses: []
|
59
61
|
post_install_message:
|
60
62
|
rdoc_options:
|
61
|
-
- --charset
|
63
|
+
- "--charset"
|
62
64
|
- utf-8
|
63
|
-
- --main
|
65
|
+
- "--main"
|
64
66
|
- README
|
65
67
|
require_paths:
|
66
68
|
- lib
|
67
69
|
required_ruby_version: !ruby/object:Gem::Requirement
|
68
70
|
none: false
|
69
71
|
requirements:
|
70
|
-
- -
|
72
|
+
- - ">="
|
71
73
|
- !ruby/object:Gem::Version
|
72
74
|
version: '0'
|
73
75
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
76
|
none: false
|
75
77
|
requirements:
|
76
|
-
- -
|
78
|
+
- - ">="
|
77
79
|
- !ruby/object:Gem::Version
|
78
80
|
version: '0'
|
79
81
|
requirements:
|
80
82
|
- Ruby and the autorake gem
|
81
83
|
rubyforge_project: NONE
|
82
|
-
rubygems_version: 1.8.
|
84
|
+
rubygems_version: 1.8.29
|
83
85
|
signing_key:
|
84
86
|
specification_version: 3
|
85
87
|
summary: Simple Ruby extensions
|
data/lib/sync.c
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* sync.c -- Sync all
|
3
|
-
*/
|
4
|
-
|
5
|
-
|
6
|
-
#include "sync.h"
|
7
|
-
|
8
|
-
#include <ruby.h>
|
9
|
-
#include <unistd.h>
|
10
|
-
|
11
|
-
|
12
|
-
static VALUE rb_process_sync( VALUE obj);
|
13
|
-
|
14
|
-
|
15
|
-
/*
|
16
|
-
* call-seq:
|
17
|
-
* Process.sync -> nil
|
18
|
-
*
|
19
|
-
* Force completion of pending disk writes (flush cache). See sync(8).
|
20
|
-
*/
|
21
|
-
|
22
|
-
VALUE
|
23
|
-
rb_process_sync( VALUE obj)
|
24
|
-
{
|
25
|
-
sync();
|
26
|
-
return Qnil;
|
27
|
-
}
|
28
|
-
|
29
|
-
|
30
|
-
void Init_supplement_sync( void)
|
31
|
-
{
|
32
|
-
rb_define_singleton_method( rb_mProcess, "sync", rb_process_sync, 0);
|
33
|
-
}
|
34
|
-
|