Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ public boolean contains(ForeignDescriptor provider) {
*/
@Override
public void release() {
if (referenceCounter.decrementAndGet() < 1) {
if (referenceCounter.decrementAndGet() == 0) {
try {
ArrayList<ForeignDescriptor> reverse = new ArrayList<>(store.keySet());
Collections.reverse(reverse);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package org.glassfish.jersey.tests.e2e.common.process.internal;

import java.lang.reflect.Type;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;

Expand Down Expand Up @@ -171,12 +172,67 @@ public void accept(Object o) {
Assertions.assertEquals(987654321, instanceRelease.get());
}

@Test
public void testMultipleReleases() throws InterruptedException {
final RequestScope requestScope = new Hk2RequestScope();
final AtomicBoolean passed = new AtomicBoolean(true);
final int CNT = 200;
Thread[] thread = new Thread[CNT];
Hk2RequestScope.Instance instance = requestScope.runInScope(() -> {
final Hk2RequestScope.Instance internalInstance = (Hk2RequestScope.Instance) requestScope.current();
for (int index = 1; index != CNT; index++) {
TestProvider testProvider = new TestProvider(String.valueOf(index)) {
@Override
public int hashCode() {
return super.hashCode() + Integer.parseInt(id);
}
};
final ForeignDescriptor fd = ForeignDescriptor.wrap(testProvider, new Consumer<Object>() {
@Override
public void accept(Object o) {
// noop
}
});
internalInstance.put(fd, String.valueOf(index));

for (int i = 0; i != CNT; i++) {
thread[i] = new Thread(new Runnable() {
@Override
public void run() {
final long waitTime = (int) (Math.random() * 5 + 1) * 10L;
try {
Thread.sleep(waitTime);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
try {
internalInstance.release();
} catch (Throwable throwable) {
passed.set(false);
}
}
});
}
for (int i = 0; i != CNT; i++) {
thread[i].start();
}
}
return internalInstance;
});

for (int i = 0; i != CNT; i++) {
thread[i].join();
}

Assertions.assertTrue(passed.get());
}

/**
* Test request scope inhabitant.
*/
public static class TestProvider extends AbstractActiveDescriptor<String> {

private final String id;
public final String id;

public TestProvider(final String id) {
super();
Expand Down
Loading