rbbt-util 5.13.14 → 5.13.15
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/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)
|