1e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// found in the LICENSE file.
4e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
5e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)/**
6e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @constructor
7e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @extends {WebInspector.Object}
8e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) */
9e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.Lock = function()
10e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
11e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this._count = 0; // Reentrant.
12e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
13e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
14e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)/**
15e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @enum {string}
16e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) */
17e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.Lock.Events = {
18e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    StateChanged: "StateChanged"
19e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
20e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
21e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.Lock.prototype = {
22e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /**
23e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @return {boolean}
24e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     */
25e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    isAcquired: function()
26e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
27e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return !!this._count;
28e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
29e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
30e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    acquire: function()
31e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
32e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (++this._count === 1)
33e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this.dispatchEventToListeners(WebInspector.Lock.Events.StateChanged);
34e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
35e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
36e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    release: function()
37e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
38e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        --this._count;
39e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (this._count < 0) {
40e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            console.error("WebInspector.Lock acquire/release calls are unbalanced " + new Error().stack);
41e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            return;
42e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
43e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (!this._count)
44e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this.dispatchEventToListeners(WebInspector.Lock.Events.StateChanged);
45e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
46e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
47e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    __proto__: WebInspector.Object.prototype
48e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
49