Search in sources :

Example 1 with LockTimeoutException

use of lucee.runtime.lock.LockTimeoutException in project Lucee by lucee.

the class Lock method doStartTag.

@Override
public int doStartTag() throws PageException {
    if (timeoutInMillis <= 0) {
        TimeSpan remaining = PageContextUtil.remainingTime(pageContext, true);
        this.timeoutInMillis = toInt(remaining.getMillis());
    }
    manager = pageContext.getConfig().getLockManager();
    // check attributes
    if (name != null && scope != SCOPE_NONE) {
        throw new LockException(LockException.OPERATION_CREATE, this.name, "invalid attribute combination", "attribute [name] and [scope] can't be used together");
    }
    if (name == null && scope == SCOPE_NONE) {
        name = "id-" + id;
    }
    String lockType = null;
    if (name == null) {
        String cid = pageContext.getConfig().getIdentification().getId();
        // Session
        if (scope == SCOPE_REQUEST) {
            lockType = "request";
            name = "__request_" + cid + "__" + ((RequestImpl) pageContext.requestScope())._getId();
        } else // Session
        if (scope == SCOPE_SESSION) {
            lockType = "session";
            name = "__session_" + cid + "__" + pageContext.sessionScope()._getId();
        } else // Application
        if (scope == SCOPE_APPLICATION) {
            lockType = "application";
            name = "__application_" + cid + "__" + ((ApplicationImpl) pageContext.applicationScope())._getId();
        } else // Server
        if (scope == SCOPE_SERVER) {
            lockType = "server";
            name = "__server_" + ((ServerImpl) pageContext.serverScope())._getId();
        }
    }
    Struct cflock = new StructImpl();
    cflock.set("succeeded", Boolean.TRUE);
    cflock.set("errortext", "");
    pageContext.setVariable(result, cflock);
    start = System.nanoTime();
    try {
        // this has to be first, otherwise LockTimeoutException has nothing to release
        ((PageContextImpl) pageContext).setActiveLock(new ActiveLock(type, name, timeoutInMillis));
        data = manager.lock(type, name, timeoutInMillis, pageContext.getId());
    } catch (LockTimeoutException e) {
        LockManagerImpl mi = (LockManagerImpl) manager;
        Boolean hasReadLock = mi.isReadLocked(name);
        Boolean hasWriteLock = mi.isWriteLocked(name);
        String msg = LockTimeoutExceptionImpl.createMessage(type, name, lockType, timeoutInMillis, hasReadLock, hasWriteLock);
        _release(pageContext, System.nanoTime() - start);
        name = null;
        cflock.set("succeeded", Boolean.FALSE);
        cflock.set("errortext", msg);
        if (throwontimeout)
            throw new LockException(LockException.OPERATION_TIMEOUT, this.name, msg);
        return SKIP_BODY;
    } catch (InterruptedException e) {
        _release(pageContext, System.nanoTime() - start);
        cflock.set("succeeded", Boolean.FALSE);
        cflock.set("errortext", e.getMessage());
        if (throwontimeout)
            throw Caster.toPageException(e);
        return SKIP_BODY;
    }
    return EVAL_BODY_INCLUDE;
}
Also used : ApplicationImpl(lucee.runtime.type.scope.ApplicationImpl) PageContextImpl(lucee.runtime.PageContextImpl) Struct(lucee.runtime.type.Struct) TimeSpan(lucee.runtime.type.dt.TimeSpan) StructImpl(lucee.runtime.type.StructImpl) ActiveLock(lucee.runtime.debug.ActiveLock) LockException(lucee.runtime.exp.LockException) LockManagerImpl(lucee.runtime.lock.LockManagerImpl) RequestImpl(lucee.runtime.type.scope.RequestImpl) LockTimeoutException(lucee.runtime.lock.LockTimeoutException)

Aggregations

PageContextImpl (lucee.runtime.PageContextImpl)1 ActiveLock (lucee.runtime.debug.ActiveLock)1 LockException (lucee.runtime.exp.LockException)1 LockManagerImpl (lucee.runtime.lock.LockManagerImpl)1 LockTimeoutException (lucee.runtime.lock.LockTimeoutException)1 Struct (lucee.runtime.type.Struct)1 StructImpl (lucee.runtime.type.StructImpl)1 TimeSpan (lucee.runtime.type.dt.TimeSpan)1 ApplicationImpl (lucee.runtime.type.scope.ApplicationImpl)1 RequestImpl (lucee.runtime.type.scope.RequestImpl)1