⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nsisupportsimpl.h

📁 gcj java applet的web browser 插件
💻 H
📖 第 1 页 / 共 5 页
字号:
/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is XPCOM. * * The Initial Developer of the Original Code is Netscape Communications Corp. * Portions created by the Initial Developer are Copyright (C) 2001 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */#ifndef nsISupportsImpl_h__#define nsISupportsImpl_h__#ifndef nscore_h___#include "nscore.h"#endif#ifndef nsISupportsBase_h__#include "nsISupportsBase.h"#endif#include "prthread.h" /* needed for thread-safety checks */#include "pratom.h"   /* needed for PR_AtomicIncrement and PR_AtomicDecrement */#include "nsDebug.h"#include "nsTraceRefcnt.h" ////////////////////////////////////////////////////////////////////////////////// Macros to help detect thread-safety:#if defined(NS_DEBUG)class nsAutoOwningThread {public:    nsAutoOwningThread() { mThread = PR_GetCurrentThread(); }    void *GetThread() const { return mThread; }private:    void *mThread;};#define NS_DECL_OWNINGTHREAD            nsAutoOwningThread _mOwningThread;#define NS_ASSERT_OWNINGTHREAD(_class) \  NS_CheckThreadSafe(_mOwningThread.GetThread(), #_class " not thread-safe")#else // !(defined(NS_DEBUG))#define NS_DECL_OWNINGTHREAD            /* nothing */#define NS_ASSERT_OWNINGTHREAD(_class)  ((void)0)#endif // !(defined(NS_DEBUG))class nsAutoRefCnt { public:    nsAutoRefCnt() : mValue(0) {}    nsAutoRefCnt(nsrefcnt aValue) : mValue(aValue) {}    // only support prefix increment/decrement    nsrefcnt operator++() { return ++mValue; }    nsrefcnt operator--() { return --mValue; }        nsrefcnt operator=(nsrefcnt aValue) { return (mValue = aValue); }    operator nsrefcnt() const { return mValue; }    nsrefcnt get() const { return mValue; } private:    // do not define these to enforce the faster prefix notation    nsrefcnt operator++(int);    nsrefcnt operator--(int);    nsrefcnt mValue;};////////////////////////////////////////////////////////////////////////////////** * Declare the reference count variable and the implementations of the * AddRef and QueryInterface methods. */#define NS_DECL_ISUPPORTS                                                     \public:                                                                       \  NS_IMETHOD QueryInterface(REFNSIID aIID,                                    \                            void** aInstancePtr);                             \  NS_IMETHOD_(nsrefcnt) AddRef(void);                                         \  NS_IMETHOD_(nsrefcnt) Release(void);                                        \protected:                                                                    \  nsAutoRefCnt mRefCnt;                                                       \  NS_DECL_OWNINGTHREAD                                                        \public:////////////////////////////////////////////////////////////////////////////////** * Previously used to initialize the reference count, but no longer needed. * * DEPRECATED. */#define NS_INIT_ISUPPORTS() ((void)0)/** * Use this macro to implement the AddRef method for a given <i>_class</i> * @param _class The name of the class implementing the method */#define NS_IMPL_ADDREF(_class)                                                \NS_IMETHODIMP_(nsrefcnt) _class::AddRef(void)                                 \{                                                                             \  NS_PRECONDITION(PRInt32(mRefCnt) >= 0, "illegal refcnt");                   \  NS_ASSERT_OWNINGTHREAD(_class);                                             \  ++mRefCnt;                                                                  \  NS_LOG_ADDREF(this, mRefCnt, #_class, sizeof(*this));                       \  return mRefCnt;                                                             \}/** * Use this macro to implement the AddRef method for a given <i>_class</i> * implemented as a wholly owned aggregated object intended to implement * interface(s) for its owner * @param _class The name of the class implementing the method * @param _aggregator the owning/containing object */#define NS_IMPL_ADDREF_USING_AGGREGATOR(_class, _aggregator)                  \NS_IMETHODIMP_(nsrefcnt) _class::AddRef(void)                                 \{                                                                             \  NS_PRECONDITION(_aggregator, "null aggregator");                            \  return (_aggregator)->AddRef();                                             \}/** * Use this macro to implement the Release method for a given * <i>_class</i>. * @param _class The name of the class implementing the method * @param _destroy A statement that is executed when the object's *   refcount drops to zero. * * For example, * *   NS_IMPL_RELEASE_WITH_DESTROY(Foo, Destroy(this)) * * will cause * *   Destroy(this); * * to be invoked when the object's refcount drops to zero. This * allows for arbitrary teardown activity to occur (e.g., deallocation * of object allocated with placement new). */#define NS_IMPL_RELEASE_WITH_DESTROY(_class, _destroy)                        \NS_IMETHODIMP_(nsrefcnt) _class::Release(void)                                \{                                                                             \  NS_PRECONDITION(0 != mRefCnt, "dup release");                               \  NS_ASSERT_OWNINGTHREAD(_class);                                             \  --mRefCnt;                                                                  \  NS_LOG_RELEASE(this, mRefCnt, #_class);                                     \  if (mRefCnt == 0) {                                                         \    mRefCnt = 1; /* stabilize */                                              \    _destroy;                                                                 \    return 0;                                                                 \  }                                                                           \  return mRefCnt;                                                             \}/** * Use this macro to implement the Release method for a given <i>_class</i> * @param _class The name of the class implementing the method * * A note on the 'stabilization' of the refcnt to one. At that point, * the object's refcount will have gone to zero. The object's * destructor may trigger code that attempts to QueryInterface() and * Release() 'this' again. Doing so will temporarily increment and * decrement the refcount. (Only a logic error would make one try to * keep a permanent hold on 'this'.)  To prevent re-entering the * destructor, we make sure that no balanced refcounting can return * the refcount to |0|. */#define NS_IMPL_RELEASE(_class) \  NS_IMPL_RELEASE_WITH_DESTROY(_class, NS_DELETEXPCOM(this))/** * Use this macro to implement the Release method for a given <i>_class</i> * implemented as a wholly owned aggregated object intended to implement * interface(s) for its owner * @param _class The name of the class implementing the method * @param _aggregator the owning/containing object */#define NS_IMPL_RELEASE_USING_AGGREGATOR(_class, _aggregator)                 \NS_IMETHODIMP_(nsrefcnt) _class::Release(void)                                \{                                                                             \  NS_PRECONDITION(_aggregator, "null aggregator");                            \  return (_aggregator)->Release();                                            \}////////////////////////////////////////////////////////////////////////////////* * Some convenience macros for implementing QueryInterface */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -