@Override public final boolean add(final EventType elem, final int timeOut) { long startTime = System.currentTimeMillis(); do { if (isFreeLock.compareAndSet(true, false)) { final RokkaQueue<EventType> tq = actualRokkaQueueRef.get(); if (tq.add(elem)) { boolean callSignalConsumer = false; if (signalEnabled.compareAndSet(true, false)) { callSignalConsumer = true; } isFreeLock.set(true); if (callSignalConsumer) { signalConsumer.signal(this); } return true; } else { isFreeLock.set(true); try { Thread.yield(); } catch (Exception e) { e.printStackTrace(); } } } } while (startTime + timeOut > System.currentTimeMillis()); return false; }
@Override public final void add(final EventType elem) { do { if (isFreeLock.compareAndSet(true, false)) { final RokkaQueue<EventType> tq = actualRokkaQueueRef.get(); if (tq.add(elem)) { boolean callSignalConsumer = false; if (signalEnabled.compareAndSet(true, false)) // && tq.getPosition() == 1 { callSignalConsumer = true; } isFreeLock.set(true); if (callSignalConsumer) { signalConsumer.signal(this); } return; } else { isFreeLock.set(true); try { Thread.yield(); } catch (Exception e) { e.printStackTrace(); } } } } while (true); }
public final void enabledSignalFromConsumer() { boolean callSignalConsumer = false; do { if (isFreeLock.compareAndSet(true, false)) { if (signalConsumer != null && !signalEnabled.get()) { final RokkaQueue<EventType> tq = actualRokkaQueueRef.get(); if (tq.getPosition() > 0) { callSignalConsumer = true; } else { signalEnabled.compareAndSet(false, true); } } isFreeLock.set(true); break; } Thread.yield(); } while (true); if (callSignalConsumer) { signalConsumer.signal(this, false); } }