97a243b90bcac00b2d7eecdf27e0425fc52d67a7
[WebKit.git] / Source / WTF / wtf / RecursiveLockAdapter.h
1 /*
2  * Copyright (C) 2016 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #pragma once
27
28 #include <wtf/Threading.h>
29
30 namespace WTF {
31
32 template<typename LockType>
33 class RecursiveLockAdapter {
34 public:
35     RecursiveLockAdapter()
36     {
37     }
38     
39     void lock()
40     {
41         ThreadIdentifier me = currentThread();
42         if (me == m_owner) {
43             m_recursionCount++;
44             return;
45         }
46         
47         m_lock.lock();
48         ASSERT(!m_owner);
49         ASSERT(!m_recursionCount);
50         m_owner = me;
51         m_recursionCount = 1;
52     }
53     
54     void unlock()
55     {
56         if (--m_recursionCount)
57             return;
58         m_owner = 0;
59         m_lock.unlock();
60     }
61     
62     bool tryLock()
63     {
64         ThreadIdentifier me = currentThread();
65         if (me == m_owner) {
66             m_recursionCount++;
67             return true;
68         }
69         
70         if (!m_lock.tryLock())
71             return false;
72         
73         ASSERT(!m_owner);
74         ASSERT(!m_recursionCount);
75         m_owner = me;
76         m_recursionCount = 1;
77         return true;
78     }
79     
80     bool isLocked() const
81     {
82         return m_lock.isLocked();
83     }
84     
85 private:
86     ThreadIdentifier m_owner { 0 };
87     unsigned m_recursionCount { 0 };
88     LockType m_lock;
89 };
90
91 } // namespace WTF
92
93