/** Tests whether this thread has already entered the mutex in write access. * If it returns true, calling <code>writeAccess</code> will be executed * immediatelly without any other blocking. <code>postReadAccess</code> * will be delayed until a write access runnable is over. * * @return true if the thread is in write access section * @since 4.48 */ public boolean isWriteAccess() { if (this == EVENT) { return javax.swing.SwingUtilities.isEventDispatchThread(); } if (wrapper != null) { Mutex m = (Mutex)LOCK; return m.isWriteAccess(); } Thread t = Thread.currentThread(); ThreadInfo info; synchronized (LOCK) { info = getThreadInfo(t); if (info != null) { if (info.counts[X] > 0) { return true; } } } return false; }
private void wakeUpReaders() { assert (grantedMode == NONE) || (grantedMode == S); if (waiters.isEmpty()) { return; } for (int i = 0; i < waiters.size(); i++) { QueueCell qc = waiters.get(i); synchronized (qc) { if (qc.isGotOut()) { // bogus waiter waiters.remove(i--); continue; } if (qc.mode == S) { // readers only waiters.remove(i--); qc.wakeMeUp(); setGrantedMode(S); if (getThreadInfo(qc.t) == null) { // force to have a record since recorded threads // do not use isCompatible call ThreadInfo ti = new ThreadInfo(qc.t, qc.mode); ti.forced = true; readersNo++; registeredThreads.put(qc.t, ti); } } } // sync (qc) } }
setGrantedMode(qc.mode); if (getThreadInfo(qc.t) == null) {
ThreadInfo tinfo = getThreadInfo(qc.t);
private boolean reenterImpl(Thread t, int mode) { // from leaveX -> grantedMode is NONE or S if (mode == S) { if ((grantedMode != NONE) && (grantedMode != S)) { throw new IllegalStateException(this.toString()); } enter(mode, t, true); return false; } // assert (mode == X) ThreadInfo tinfo = getThreadInfo(t); boolean chainFromLeaveX = ((grantedMode == CHAIN) && (tinfo != null) && (tinfo.counts[X] > 0)); // process grantedMode == X or CHAIN from leaveX OR grantedMode == NONE from leaveS if ((grantedMode == X) || (grantedMode == NONE) || chainFromLeaveX) { enter(mode, t, true); return false; } else { // remains grantedMode == CHAIN or S from leaveS, so it will be CHAIN if (readersNo == 0) { throw new IllegalStateException(this.toString()); } ThreadInfo info = new ThreadInfo(t, mode); registeredThreads.put(t, info); // prevent from grantedMode == NONE (another thread - leaveS) readersNo += 2; // prevent from new readers setGrantedMode(CHAIN); return true; } // else X means ERROR!!! }
synchronized (LOCK) { ThreadInfo info = getThreadInfo(t);
/** Tests whether this thread has already entered the mutex in write access. * If it returns true, calling <code>writeAccess</code> will be executed * immediatelly without any other blocking. <code>postReadAccess</code> * will be delayed until a write access runnable is over. * * @return true if the thread is in write access section * @since 4.48 */ public boolean isWriteAccess () { if (this == EVENT) { return javax.swing.SwingUtilities.isEventDispatchThread (); } Thread t = Thread.currentThread(); ThreadInfo info; synchronized (LOCK) { info = getThreadInfo(t); if (info != null) { if (info.counts[X] > 0) { return true; } } } return false; }
/** Tests whether this thread has already entered the mutex in write access. * If it returns true, calling <code>writeAccess</code> will be executed * immediatelly without any other blocking. <code>postReadAccess</code> * will be delayed until a write access runnable is over. * * @return true if the thread is in write access section * @since 4.48 */ public boolean isWriteAccess () { if (this == EVENT) { return javax.swing.SwingUtilities.isEventDispatchThread (); } Thread t = Thread.currentThread(); ThreadInfo info; synchronized (LOCK) { info = getThreadInfo(t); if (info != null) { if (info.counts[X] > 0) { return true; } } } return false; }
/** Tests whether this thread has already entered the mutex in write access. * If it returns true, calling <code>writeAccess</code> will be executed * immediatelly without any other blocking. <code>postReadAccess</code> * will be delayed until a write access runnable is over. * * @return true if the thread is in write access section * @since 4.48 */ public boolean isWriteAccess() { if (this == EVENT) { return javax.swing.SwingUtilities.isEventDispatchThread(); } if (wrapper != null) { Mutex m = (Mutex)LOCK; return m.isWriteAccess(); } Thread t = Thread.currentThread(); ThreadInfo info; synchronized (LOCK) { info = getThreadInfo(t); if (info != null) { if (info.counts[X] > 0) { return true; } } } return false; }
/** Tests whether this thread has already entered the mutex in write access. * If it returns true, calling <code>writeAccess</code> will be executed * immediatelly without any other blocking. <code>postReadAccess</code> * will be delayed until a write access runnable is over. * * @return true if the thread is in write access section * @since 4.48 */ public boolean isWriteAccess() { if (this == EVENT) { return javax.swing.SwingUtilities.isEventDispatchThread(); } if (wrapper != null) { Mutex m = (Mutex)LOCK; return m.isWriteAccess(); } Thread t = Thread.currentThread(); ThreadInfo info; synchronized (LOCK) { info = getThreadInfo(t); if (info != null) { if (info.counts[X] > 0) { return true; } } } return false; }
private void wakeUpReaders() { assert (grantedMode == NONE) || (grantedMode == S); if (waiters.size() == 0) return; for (int i = 0; i < waiters.size(); i++) { QueueCell qc = (QueueCell) waiters.get(i); synchronized (qc) { if (qc.isGotOut()) { // bogus waiter waiters.remove(i--); continue; } if (qc.mode == S) { // readers only waiters.remove(i--); qc.wakeMeUp(); grantedMode = S; if (getThreadInfo(qc.t) == null) { // force to have a record since recorded threads // do not use isCompatible call ThreadInfo ti = new ThreadInfo(qc.t, qc.mode); ti.forced = true; readersNo++; registeredThreads.put(qc.t, ti); } } } // sync (qc) } }
private void wakeUpReaders() { assert (grantedMode == NONE) || (grantedMode == S); if (waiters.size() == 0) return; for (int i = 0; i < waiters.size(); i++) { QueueCell qc = (QueueCell) waiters.get(i); synchronized (qc) { if (qc.isGotOut()) { // bogus waiter waiters.remove(i--); continue; } if (qc.mode == S) { // readers only waiters.remove(i--); qc.wakeMeUp(); grantedMode = S; if (getThreadInfo(qc.t) == null) { // force to have a record since recorded threads // do not use isCompatible call ThreadInfo ti = new ThreadInfo(qc.t, qc.mode); ti.forced = true; readersNo++; registeredThreads.put(qc.t, ti); } } } // sync (qc) } }
private void wakeUpReaders() { assert (grantedMode == NONE) || (grantedMode == S); if (waiters.isEmpty()) { return; } for (int i = 0; i < waiters.size(); i++) { QueueCell qc = waiters.get(i); synchronized (qc) { if (qc.isGotOut()) { // bogus waiter waiters.remove(i--); continue; } if (qc.mode == S) { // readers only waiters.remove(i--); qc.wakeMeUp(); setGrantedMode(S); if (getThreadInfo(qc.t) == null) { // force to have a record since recorded threads // do not use isCompatible call ThreadInfo ti = new ThreadInfo(qc.t, qc.mode); ti.forced = true; readersNo++; registeredThreads.put(qc.t, ti); } } } // sync (qc) } }
ThreadInfo tinfo = getThreadInfo(t); boolean chainFromLeaveX = (grantedMode == CHAIN && tinfo != null && tinfo.counts[X] > 0);
private boolean reenterImpl(Thread t, int mode) { // from leaveX -> grantedMode is NONE or S if (mode == S) { if ((grantedMode != NONE) && (grantedMode != S)) { throw new IllegalStateException(this.toString()); } enter(mode, t, true); return false; } // assert (mode == X) ThreadInfo tinfo = getThreadInfo(t); boolean chainFromLeaveX = ((grantedMode == CHAIN) && (tinfo != null) && (tinfo.counts[X] > 0)); // process grantedMode == X or CHAIN from leaveX OR grantedMode == NONE from leaveS if ((grantedMode == X) || (grantedMode == NONE) || chainFromLeaveX) { enter(mode, t, true); return false; } else { // remains grantedMode == CHAIN or S from leaveS, so it will be CHAIN if (readersNo == 0) { throw new IllegalStateException(this.toString()); } ThreadInfo info = new ThreadInfo(t, mode); registeredThreads.put(t, info); // prevent from grantedMode == NONE (another thread - leaveS) readersNo += 2; // prevent from new readers setGrantedMode(CHAIN); return true; } // else X means ERROR!!! }
private boolean reenterImpl(Thread t, int mode) { // from leaveX -> grantedMode is NONE or S if (mode == S) { if ((grantedMode != NONE) && (grantedMode != S)) { throw new IllegalStateException(this.toString()); } enter(mode, t, true); return false; } // assert (mode == X) ThreadInfo tinfo = getThreadInfo(t); boolean chainFromLeaveX = ((grantedMode == CHAIN) && (tinfo != null) && (tinfo.counts[X] > 0)); // process grantedMode == X or CHAIN from leaveX OR grantedMode == NONE from leaveS if ((grantedMode == X) || (grantedMode == NONE) || chainFromLeaveX) { enter(mode, t, true); return false; } else { // remains grantedMode == CHAIN or S from leaveS, so it will be CHAIN if (readersNo == 0) { throw new IllegalStateException(this.toString()); } ThreadInfo info = new ThreadInfo(t, mode); registeredThreads.put(t, info); // prevent from grantedMode == NONE (another thread - leaveS) readersNo += 2; // prevent from new readers setGrantedMode(CHAIN); return true; } // else X means ERROR!!! }