supplement 1.7 → 2.2.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/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
|
-
|