/* * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package com.sun.webkit; import com.sun.webkit.perf.PerfLogger; import java.util.concurrent.locks.ReentrantLock; public abstract class Invoker { private static Invoker instance; private static final PerfLogger locksLog = PerfLogger.getLogger("Locks"); public static synchronized void setInvoker(Invoker invoker) { instance = invoker; } public static synchronized Invoker getInvoker() { return instance; } /* * Acquires the lock if it's not yet held by the current thread. * * @returns {@code true} if the lock has been acquired, otherwise {@code false} */ protected boolean lock(ReentrantLock lock) { if (lock.getHoldCount() == 0) { lock.lock(); locksLog.resumeCount(isEventThread() ? "EventThread" : "RenderThread"); return true; } return false; } /* * Releases the lock if it's held by the current thread. * * @returns {@code true} if the lock has been released, otherwise {@code false} */ protected boolean unlock(ReentrantLock lock) { if (lock.getHoldCount() != 0) { locksLog.suspendCount(isEventThread() ? "EventThread" : "RenderThread"); lock.unlock(); return true; } return false; } protected abstract boolean isEventThread(); /** * Throws {@link IllegalStateException} if the current thread is not * the event thread. * @throws IllegalStateException if the current thread is not the event * thread */ public void checkEventThread() { if (!isEventThread()) { throw new IllegalStateException("Current thread is not event thread" + ", current thread: " + Thread.currentThread().getName()); } } public abstract void invokeOnEventThread(Runnable r); public abstract void postOnEventThread(Runnable r); }