rbbt-util 5.13.14 → 5.13.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rbbt/util/semaphore.rb +12 -6
- data/share/rbbt_commands/tsv/info +1 -0
- data/test/rbbt/util/test_semaphore.rb +20 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1433dd5623914600b8afbbea35540e0d63878d80
|
4
|
+
data.tar.gz: 97f4771293edb91ef2148112cb9205e53beb80ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 579ae60be7d927a9074f246d163c6afa13495d6f1d499577c7d3e11ee6c516ada13d1b5c877f5d937a59f4d2f7f720a6820d53f2e7eacd4788af26ff28c14644
|
7
|
+
data.tar.gz: 2a6b66e90b23530d6563322539f27c1634f5483bcd245177154a466b68596c5c5e7821deec972a609d21b524f9c6d2c4ac71fc212cbbad0c4de349de2a3ea851
|
data/lib/rbbt/util/semaphore.rb
CHANGED
@@ -22,7 +22,7 @@ module RbbtSemaphore
|
|
22
22
|
|
23
23
|
builder.c_singleton <<-EOF
|
24
24
|
void create_semaphore(char* name, int value){
|
25
|
-
sem_open(name, O_CREAT, S_IRWXU, value);
|
25
|
+
sem_open(name, O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO, value);
|
26
26
|
}
|
27
27
|
EOF
|
28
28
|
builder.c_singleton <<-EOF
|
@@ -34,7 +34,7 @@ void delete_semaphore(char* name){
|
|
34
34
|
builder.c_singleton <<-EOF
|
35
35
|
void wait_semaphore(char* name){
|
36
36
|
sem_t* sem;
|
37
|
-
sem = sem_open(name,
|
37
|
+
sem = sem_open(name, 0);
|
38
38
|
sem_wait(sem);
|
39
39
|
sem_close(sem);
|
40
40
|
}
|
@@ -43,29 +43,35 @@ void wait_semaphore(char* name){
|
|
43
43
|
builder.c_singleton <<-EOF
|
44
44
|
void post_semaphore(char* name){
|
45
45
|
sem_t* sem;
|
46
|
-
sem = sem_open(name,
|
46
|
+
sem = sem_open(name, 0);
|
47
47
|
sem_post(sem);
|
48
48
|
sem_close(sem);
|
49
49
|
}
|
50
50
|
EOF
|
51
51
|
end
|
52
52
|
|
53
|
+
SEM_MUTEX = Mutex.new
|
53
54
|
def self.synchronize(sem)
|
54
|
-
|
55
|
+
SEM_MUTEX.synchronize do
|
56
|
+
RbbtSemaphore.wait_semaphore(sem)
|
57
|
+
end
|
55
58
|
begin
|
56
59
|
yield
|
57
60
|
ensure
|
58
|
-
|
61
|
+
SEM_MUTEX.synchronize do
|
62
|
+
RbbtSemaphore.post_semaphore(sem)
|
63
|
+
end
|
59
64
|
end
|
60
65
|
end
|
61
66
|
|
62
67
|
def self.with_semaphore(size, file = nil)
|
63
|
-
file = Misc.digest(rand.to_s) if file.nil?
|
68
|
+
file = "/" << Misc.digest(rand(1000000000000).to_s) if file.nil?
|
64
69
|
file.gsub!('/', '_')
|
65
70
|
begin
|
66
71
|
RbbtSemaphore.create_semaphore(file, size)
|
67
72
|
yield file
|
68
73
|
ensure
|
74
|
+
Log.error "Removing semaphore #{ file }"
|
69
75
|
RbbtSemaphore.delete_semaphore(file)
|
70
76
|
end
|
71
77
|
end
|
@@ -2,7 +2,26 @@ require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helpe
|
|
2
2
|
require 'rbbt/util/semaphore'
|
3
3
|
|
4
4
|
class TestRbbtSemaphore < Test::Unit::TestCase
|
5
|
-
def
|
5
|
+
def test_process
|
6
|
+
RbbtSemaphore.with_semaphore(10) do |s|
|
7
|
+
pids = []
|
8
|
+
100.times do
|
9
|
+
pids << Process.fork do
|
10
|
+
100.times do
|
11
|
+
RbbtSemaphore.wait_semaphore(s)
|
12
|
+
sleep 0.001
|
13
|
+
puts '.'
|
14
|
+
RbbtSemaphore.post_semaphore(s)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
pids.each do |pid|
|
19
|
+
Process.waitpid pid
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def _test_thread
|
6
25
|
times = 50
|
7
26
|
TmpFile.with_file do |dir|
|
8
27
|
Path.setup(dir)
|