1 : /* ***** BEGIN LICENSE BLOCK *****
2 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 : *
4 : * The contents of this file are subject to the Mozilla Public License Version
5 : * 1.1 (the "License"); you may not use this file except in compliance with
6 : * the License. You may obtain a copy of the License at
7 : * http://www.mozilla.org/MPL/
8 : *
9 : * Software distributed under the License is distributed on an "AS IS" basis,
10 : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 : * for the specific language governing rights and limitations under the
12 : * License.
13 : *
14 : * The Original Code is the Mozilla platform.
15 : *
16 : * The Initial Developer of the Original Code is
17 : * Benjamin Smedberg <benjamin@smedbergs.us>.
18 : *
19 : * Portions created by the Initial Developer are Copyright (C) 2006
20 : * the Mozilla Foundation <http://www.mozilla.org/>. All Rights Reserved.
21 : *
22 : * Contributor(s):
23 : *
24 : * Alternatively, the contents of this file may be used under the terms of
25 : * either the GNU General Public License Version 2 or later (the "GPL"), or
26 : * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 : * in which case the provisions of the GPL or the LGPL are applicable instead
28 : * of those above. If you wish to allow use of your version of this file only
29 : * under the terms of either the GPL or the LGPL, and not to allow others to
30 : * use your version of this file under the terms of the MPL, indicate your
31 : * decision by deleting the provisions above and replace them with the notice
32 : * and other provisions required by the GPL or the LGPL. If you do not delete
33 : * the provisions above, a recipient may use your version of this file under
34 : * the terms of any one of the MPL, the GPL or the LGPL.
35 : *
36 : * ***** END LICENSE BLOCK ***** */
37 :
38 : #ifndef nsLayoutStatics_h__
39 : #define nsLayoutStatics_h__
40 :
41 : #include "nscore.h"
42 : #include "nsThreadUtils.h"
43 :
44 : // This isn't really a class, it's a namespace for static methods.
45 : // Documents and other objects can hold a reference to the layout static
46 : // objects so that they last past the xpcom-shutdown notification.
47 :
48 : class nsLayoutStatics
49 : {
50 : public:
51 : // Called by the layout module constructor. This call performs an AddRef()
52 : // internally.
53 : static nsresult Initialize();
54 :
55 : static void AddRef()
56 : {
57 : NS_ASSERTION(NS_IsMainThread(),
58 : "nsLayoutStatics reference counting must be on main thread");
59 :
60 : NS_ASSERTION(sLayoutStaticRefcnt,
61 : "nsLayoutStatics already dropped to zero!");
62 :
63 : ++sLayoutStaticRefcnt;
64 : NS_LOG_ADDREF(&sLayoutStaticRefcnt, sLayoutStaticRefcnt,
65 : "nsLayoutStatics", 1);
66 : }
67 5278 : static void Release()
68 : {
69 5278 : NS_ASSERTION(NS_IsMainThread(),
70 : "nsLayoutStatics reference counting must be on main thread");
71 :
72 5278 : --sLayoutStaticRefcnt;
73 : NS_LOG_RELEASE(&sLayoutStaticRefcnt, sLayoutStaticRefcnt,
74 5278 : "nsLayoutStatics");
75 :
76 5278 : if (!sLayoutStaticRefcnt)
77 1403 : Shutdown();
78 5278 : }
79 :
80 : private:
81 : // not to be called!
82 : nsLayoutStatics();
83 :
84 : static void Shutdown();
85 :
86 : static nsrefcnt sLayoutStaticRefcnt;
87 : };
88 :
89 : class nsLayoutStaticsRef
90 : {
91 : public:
92 : nsLayoutStaticsRef()
93 : {
94 : nsLayoutStatics::AddRef();
95 : }
96 : ~nsLayoutStaticsRef()
97 : {
98 : nsLayoutStatics::Release();
99 : }
100 : };
101 :
102 : #endif // nsLayoutStatics_h__
|