Skip to content
Snippets Groups Projects

f-fix-deadlock -> dev

Merged Timm Fitschen requested to merge f-issue-122 into dev
1 file
+ 6
4
Compare changes
  • Side-by-side
  • Inline
@@ -26,7 +26,6 @@
package org.caosdb.server.database;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
import org.caosdb.server.database.access.Access;
import org.caosdb.server.database.access.AccessControlAccess;
@@ -57,7 +56,7 @@ import org.caosdb.server.utils.Releasable;
class ReadAccessSemaphore extends Semaphore implements Releasable {
private static final long serialVersionUID = 4384921156838881337L;
private AtomicInteger acquired = new AtomicInteger(0); // how many threads have read access
private int acquired = 0; // how many threads have read access
Semaphore writersBlock =
new Semaphore(1, true); // This semaphore is blocked as long as there are any
// unreleased read permits.
@@ -74,9 +73,10 @@ class ReadAccessSemaphore extends Semaphore implements Releasable {
@Override
public void acquire() throws InterruptedException {
super.acquire(); // Protect the next few lines
if (this.acquired.getAndIncrement() == 0) {
if (this.acquired == 0) {
this.writersBlock.acquire();
}
this.acquired++;
super.release();
}
@@ -87,7 +87,9 @@ class ReadAccessSemaphore extends Semaphore implements Releasable {
*/
@Override
public void release() {
if (this.acquired.decrementAndGet() == 0) { // Last permit: release
this.acquired--;
if (this.acquired <= 0) { // Last permit: release
this.acquired = 0;
if (this.writersBlock.availablePermits() <= 0) {
this.writersBlock.release();
}
Loading