dvander@2088: #ifndef _INCLUDE_SOURCEMOD_NATIVE_OWNER_H_ dvander@2088: #define _INCLUDE_SOURCEMOD_NATIVE_OWNER_H_ dvander@2088: dvander@2088: #include dvander@2088: #include dvander@3872: #include "common_logic.h" dvander@2088: dvander@3872: struct NativeEntry; dvander@2088: class CPlugin; dvander@3872: dvander@3872: using namespace SourceMod; dvander@2088: dvander@2088: struct WeakNative dvander@2088: { dvander@3872: WeakNative(IPlugin *plugin, uint32_t index) : dvander@2088: pl(plugin), idx(index), entry(NULL) dvander@2088: { dvander@2088: pl = plugin; dvander@2088: idx = index; dvander@2088: } dvander@3872: WeakNative(IPlugin *plugin, uint32_t index, NativeEntry *pEntry) : dvander@2088: pl(plugin), idx(index), entry(pEntry) dvander@2088: { dvander@2088: pl = plugin; dvander@2088: idx = index; dvander@2088: } dvander@3872: IPlugin *pl; dvander@2088: uint32_t idx; dvander@2088: NativeEntry *entry; dvander@2088: }; dvander@2088: dvander@2088: using namespace SourceHook; dvander@2088: dvander@2088: class CNativeOwner dvander@2088: { dvander@2088: public: dvander@2226: CNativeOwner(); dvander@2226: public: dvander@2088: virtual void DropEverything(); dvander@2088: public: dvander@2088: void AddNatives(const sp_nativeinfo_t *info); dvander@2088: public: dvander@2088: void SetMarkSerial(unsigned int serial); dvander@2088: unsigned int GetMarkSerial(); dvander@3872: void PropagateMarkSerial(unsigned int serial); dvander@2088: public: dvander@2088: void AddDependent(CPlugin *pPlugin); dvander@2088: void AddWeakRef(const WeakNative & ref); dvander@2088: void DropRefsTo(CPlugin *pPlugin); dvander@2088: void AddReplacedNative(NativeEntry *pEntry); dvander@2088: private: dvander@2088: void DropWeakRefsTo(CPlugin *pPlugin); dvander@2088: void UnbindWeakRef(const WeakNative & ref); dvander@2088: protected: dvander@2088: List m_Dependents; dvander@2088: unsigned int m_nMarkSerial; dvander@2088: List m_WeakRefs; dvander@2088: List m_Natives; dvander@2088: List m_ReplacedNatives; dvander@2088: }; dvander@2088: dvander@3872: extern CNativeOwner g_CoreNatives; dvander@3872: dvander@2088: #endif //_INCLUDE_SOURCEMOD_NATIVE_OWNER_H_