/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Licensed under the Apache License, Version 2.0.

See LICENSE file in the project root for details.
***************************************************************************** */
import { CancellationToken } from "./cancellation";
import { Cancelable } from "@esfx/cancelable";
import { Disposable } from "@esfx/disposable";
/**
 * Coordinates readers and writers for a resource.
 */
export declare class ReaderWriterLock {
    private _readers;
    private _upgradeables;
    private _upgrades;
    private _writers;
    private _upgradeable;
    private _upgraded;
    private _count;
    /**
     * Asynchronously waits for and takes a read lock on a resource.
     *
     * @param token A CancellationToken used to cancel the request.
     */
    read(token?: CancellationToken | Cancelable): Promise<LockHandle>;
    /**
     * Asynchronously waits for and takes a read lock on a resource
     * that can later be upgraded to a write lock.
     *
     * @param token A CancellationToken used to cancel the request.
     */
    upgradeableRead(token?: CancellationToken | Cancelable): Promise<UpgradeableLockHandle>;
    /**
     * Asynchronously waits for and takes a write lock on a resource.
     *
     * @param token A CancellationToken used to cancel the request.
     */
    write(token?: CancellationToken | Cancelable): Promise<LockHandle>;
    private _upgrade;
    private _processLockRequests;
    private _canTakeReadLock;
    private _processReadLockRequests;
    private _takeReadLock;
    private _releaseReadLock;
    private _canTakeUpgradeableReadLock;
    private _processUpgradeableReadLockRequest;
    private _takeUpgradeableReadLock;
    private _releaseUpgradeableReadLock;
    private _canTakeUpgradeLock;
    private _processUpgradeRequest;
    private _takeUpgradeLock;
    private _releaseUpgradeLock;
    private _canTakeWriteLock;
    private _processWriteLockRequest;
    private _takeWriteLock;
    private _releaseWriteLock;
}
/**
 * An object used to release a held lock.
 */
export interface LockHandle extends Disposable {
    /**
     * Releases the lock.
     */
    release(): void;
}
/**
 * An object used to release a held lock or upgrade to a write lock.
 */
export interface UpgradeableLockHandle extends LockHandle, Disposable {
    /**
     * Upgrades the lock to a write lock.
     *
     * @param token A CancellationToken used to cancel the request.
     */
    upgrade(token?: CancellationToken | Cancelable): Promise<LockHandle>;
}
