Skip to content

Commit 9608846

Browse files
committed
Refactor semaphore ahead of adding block support
1 parent 4d5226d commit 9608846

File tree

2 files changed

+37
-20
lines changed

2 files changed

+37
-20
lines changed

ext/concurrent-ruby/com/concurrent_ruby/ext/JavaSemaphoreLibrary.java

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,13 @@ public IRubyObject initialize(ThreadContext context, IRubyObject value) {
4545
}
4646

4747
@JRubyMethod
48-
public IRubyObject acquire(ThreadContext context, IRubyObject value) throws InterruptedException {
49-
this.semaphore.acquire(rubyFixnumToPositiveInt(value, "permits"));
50-
return context.nil;
48+
public IRubyObject acquire(ThreadContext context) throws InterruptedException {
49+
return this.acquire(context, 1);
50+
}
51+
52+
@JRubyMethod
53+
public IRubyObject acquire(ThreadContext context, IRubyObject permits) throws InterruptedException {
54+
return this.acquire(context, rubyFixnumToPositiveInt(permits, "permits"));
5155
}
5256

5357
@JRubyMethod(name = "available_permits")
@@ -60,30 +64,32 @@ public IRubyObject drainPermits(ThreadContext context) {
6064
return getRuntime().newFixnum(this.semaphore.drainPermits());
6165
}
6266

63-
@JRubyMethod
64-
public IRubyObject acquire(ThreadContext context) throws InterruptedException {
65-
this.semaphore.acquire(1);
66-
return context.nil;
67-
}
68-
6967
@JRubyMethod(name = "try_acquire")
7068
public IRubyObject tryAcquire(ThreadContext context) throws InterruptedException {
71-
return getRuntime().newBoolean(semaphore.tryAcquire(1));
69+
int permitsInt = 1;
70+
boolean acquired = semaphore.tryAcquire(permitsInt);
71+
72+
return triedAcquire(context, acquired);
7273
}
7374

7475
@JRubyMethod(name = "try_acquire")
7576
public IRubyObject tryAcquire(ThreadContext context, IRubyObject permits) throws InterruptedException {
76-
return getRuntime().newBoolean(semaphore.tryAcquire(rubyFixnumToPositiveInt(permits, "permits")));
77+
int permitsInt = rubyFixnumToPositiveInt(permits, "permits");
78+
boolean acquired = semaphore.tryAcquire(permitsInt);
79+
80+
return triedAcquire(context, acquired);
7781
}
7882

7983
@JRubyMethod(name = "try_acquire")
8084
public IRubyObject tryAcquire(ThreadContext context, IRubyObject permits, IRubyObject timeout) throws InterruptedException {
81-
return getRuntime().newBoolean(
82-
semaphore.tryAcquire(
83-
rubyFixnumToPositiveInt(permits, "permits"),
84-
rubyNumericToLong(timeout, "timeout"),
85-
java.util.concurrent.TimeUnit.SECONDS)
86-
);
85+
int permitsInt = rubyFixnumToPositiveInt(permits, "permits");
86+
boolean acquired = semaphore.tryAcquire(
87+
permitsInt,
88+
rubyNumericToLong(timeout, "timeout"),
89+
java.util.concurrent.TimeUnit.SECONDS,
90+
);
91+
92+
return triedAcquire(context, acquired);
8793
}
8894

8995
@JRubyMethod
@@ -93,8 +99,8 @@ public IRubyObject release(ThreadContext context) {
9399
}
94100

95101
@JRubyMethod
96-
public IRubyObject release(ThreadContext context, IRubyObject value) {
97-
this.semaphore.release(rubyFixnumToPositiveInt(value, "permits"));
102+
public IRubyObject release(ThreadContext context, IRubyObject permits) {
103+
this.semaphore.release(rubyFixnumToPositiveInt(permits, "permits"));
98104
return getRuntime().newBoolean(true);
99105
}
100106

@@ -104,6 +110,16 @@ public IRubyObject reducePermits(ThreadContext context, IRubyObject reduction) t
104110
return context.nil;
105111
}
106112

113+
private IRubyObject acquire(ThreadContext context, int permits) throws InterruptedException {
114+
this.semaphore.acquire(permits);
115+
116+
return context.nil;
117+
}
118+
119+
private IRubyObject triedAcquire(ThreadContext context, int permits, boolean acquired) {
120+
return getRuntime().newBoolean(acquired);
121+
}
122+
107123
private int rubyFixnumInt(IRubyObject value, String paramName) {
108124
if (value instanceof RubyFixnum) {
109125
RubyFixnum fixNum = (RubyFixnum) value;

lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ def acquire(permits = 1)
2323

2424
synchronize do
2525
try_acquire_timed(permits, nil)
26-
nil
2726
end
27+
28+
nil
2829
end
2930

3031
# @!macro semaphore_method_available_permits

0 commit comments

Comments
 (0)