Skip to content

Commit 3e615a7

Browse files
committed
Add more tests to NonBlockingSemaphore and make boolean semaphore release atomic
1 parent 3e8052d commit 3e615a7

File tree

3 files changed

+63
-4
lines changed

3 files changed

+63
-4
lines changed

dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import com.datadog.iast.IastRequestContext;
66
import com.datadog.iast.IastSystem;
7-
import datadog.trace.util.NonBlockingSemaphore;
87
import datadog.trace.api.Config;
98
import datadog.trace.api.gateway.RequestContext;
109
import datadog.trace.api.gateway.RequestContextSlot;
@@ -13,6 +12,7 @@
1312
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
1413
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
1514
import datadog.trace.util.AgentTaskScheduler;
15+
import datadog.trace.util.NonBlockingSemaphore;
1616
import java.util.concurrent.TimeUnit;
1717
import java.util.concurrent.atomic.AtomicLong;
1818
import javax.annotation.Nullable;

internal-api/src/main/java/datadog/trace/util/NonBlockingSemaphore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public boolean acquire(final int count) {
6666
@Override
6767
public int release(final int count) {
6868
reset();
69-
return available();
69+
return 1;
7070
}
7171

7272
@Override

internal-api/src/test/groovy/datadog/trace/util/NonBlockingSemaphoreTest.groovy

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package datadog.trace.util
22

3-
import datadog.trace.test.util.DDSpecification
43
import groovy.transform.CompileDynamic
4+
import spock.lang.Specification
55

66
import java.util.concurrent.Callable
77
import java.util.concurrent.CountDownLatch
88
import java.util.concurrent.Executors
99
import java.util.concurrent.TimeUnit
1010

1111
@CompileDynamic
12-
class NonBlockingSemaphoreTest extends DDSpecification {
12+
class NonBlockingSemaphoreTest extends Specification {
1313

1414
void 'test that the semaphore controls access to a shared resource (#permitCount)'(final int permitCount) {
1515
given:
@@ -71,6 +71,40 @@ class NonBlockingSemaphoreTest extends DDSpecification {
7171
2 | _
7272
}
7373
74+
void 'can never acquire more permits than the total'(final int permitCount) {
75+
given:
76+
final semaphore = NonBlockingSemaphore.withPermitCount(permitCount)
77+
78+
when:
79+
final acquired = semaphore.acquire(permitCount+1)
80+
81+
then:
82+
!acquired
83+
84+
where:
85+
permitCount | _
86+
1 | _
87+
2 | _
88+
}
89+
90+
void 'can perform extra releases'(final int permitCount) {
91+
given:
92+
final semaphore = NonBlockingSemaphore.withPermitCount(permitCount)
93+
94+
when:
95+
for (int i = 0; i < permitCount * 2; i++) {
96+
assert semaphore.release() == permitCount
97+
}
98+
99+
then:
100+
semaphore.available() == permitCount
101+
102+
where:
103+
permitCount | _
104+
1 | _
105+
2 | _
106+
}
107+
74108
void 'reset helps recover when there is starvation (#permitCount)'(final int permitCount) {
75109
given:
76110
final semaphore = NonBlockingSemaphore.withPermitCount(permitCount)
@@ -107,6 +141,31 @@ class NonBlockingSemaphoreTest extends DDSpecification {
107141
acquired == threads
108142
semaphore.available() == Integer.MAX_VALUE
109143
144+
when:
145+
int availableAfterRelease = semaphore.release()
146+
147+
then:
148+
availableAfterRelease == Integer.MAX_VALUE
149+
semaphore.available() == Integer.MAX_VALUE
150+
151+
when:
152+
semaphore.reset()
153+
154+
then:
155+
semaphore.available() == Integer.MAX_VALUE
156+
}
157+
158+
void 'cannot create a semaphore without at least 1 permit'() {
159+
when:
160+
NonBlockingSemaphore.withPermitCount(0)
110161
162+
then:
163+
thrown(AssertionError)
164+
165+
when:
166+
NonBlockingSemaphore.withPermitCount(-1)
167+
168+
then:
169+
thrown(AssertionError)
111170
}
112171
}

0 commit comments

Comments
 (0)