core/logic/ShareSys.cpp
changeset 4109 10eb68d668af
parent 4108 dabaea5ab45c
child 4358 52aa5fab9866
     1.1 --- a/core/logic/ShareSys.cpp	Fri Aug 30 10:14:18 2013 -0700
     1.2 +++ b/core/logic/ShareSys.cpp	Fri Aug 30 10:16:28 2013 -0700
     1.3 @@ -37,6 +37,8 @@
     1.4  #include "HandleSys.h"
     1.5  #include <assert.h>
     1.6  
     1.7 +using namespace ke;
     1.8 +
     1.9  ShareSystem g_ShareSys;
    1.10  static unsigned int g_mark_serial = 0;
    1.11  
    1.12 @@ -259,12 +261,12 @@
    1.13  	assert(false);
    1.14  }
    1.15  
    1.16 -NativeEntry *ShareSystem::FindNative(const char *name)
    1.17 +PassRef<Native> ShareSystem::FindNative(const char *name)
    1.18  {
    1.19 -	NativeEntry *entry;
    1.20 -	if (!m_NtvCache.retrieve(name, &entry))
    1.21 +	NativeCache::Result r = m_NtvCache.find(name);
    1.22 +	if (!r.found())
    1.23  		return NULL;
    1.24 -	return entry;
    1.25 +	return *r;
    1.26  }
    1.27  
    1.28  void ShareSystem::BindNativesToPlugin(CPlugin *pPlugin, bool bCoreOnly)
    1.29 @@ -290,7 +292,7 @@
    1.30  			continue;
    1.31  
    1.32  		/* Otherwise, the native must be in our cache. */
    1.33 -		NativeEntry *pEntry = FindNative(native->name);
    1.34 +		Ref<Native> pEntry = FindNative(native->name);
    1.35  		if (!pEntry)
    1.36  			continue;
    1.37  
    1.38 @@ -301,41 +303,32 @@
    1.39  	}
    1.40  }
    1.41  
    1.42 -void ShareSystem::BindNativeToPlugin(CPlugin *pPlugin, NativeEntry *pEntry)
    1.43 +void ShareSystem::BindNativeToPlugin(CPlugin *pPlugin, const Ref<Native> &entry)
    1.44  {
    1.45 -	uint32_t i;
    1.46 -	sp_native_t *native;
    1.47 -	IPluginContext *pContext;
    1.48 +	if (!entry->owner)
    1.49 +		return;
    1.50  
    1.51 -	pContext = pPlugin->GetBaseContext();
    1.52 +	IPluginContext *pContext = pPlugin->GetBaseContext();
    1.53  
    1.54 -	if (pContext->FindNativeByName(pEntry->name(), &i) != SP_ERROR_NONE)
    1.55 -	{
    1.56 +	uint32_t i;
    1.57 +	if (pContext->FindNativeByName(entry->name(), &i) != SP_ERROR_NONE)
    1.58  		return;
    1.59 -	}
    1.60 +
    1.61 +	sp_native_t *native;
    1.62  	if (pContext->GetNativeByIndex(i, &native) != SP_ERROR_NONE)
    1.63 -	{
    1.64  		return;
    1.65 -	}
    1.66  
    1.67  	if (native->status == SP_NATIVE_BOUND)
    1.68 -	{
    1.69  		return;
    1.70 -	}
    1.71  
    1.72 -	BindNativeToPlugin(pPlugin, native, i, pEntry);
    1.73 +	BindNativeToPlugin(pPlugin, native, i, entry);
    1.74  }
    1.75  
    1.76 -void ShareSystem::BindNativeToPlugin(CPlugin *pPlugin, 
    1.77 -									 sp_native_t *native,
    1.78 -									 uint32_t index,
    1.79 -									 NativeEntry *pEntry)
    1.80 +void ShareSystem::BindNativeToPlugin(CPlugin *pPlugin, sp_native_t *native, uint32_t index,
    1.81 +                                     const Ref<Native> &pEntry)
    1.82  {
    1.83  	/* Mark as bound... we do the rest next. */
    1.84  	native->status = SP_NATIVE_BOUND;
    1.85 -	native->user = pEntry;
    1.86 -
    1.87 -	/* Perform a bind. */
    1.88  	native->pfn = pEntry->func();
    1.89  
    1.90  	/* We don't bother with dependency crap if the owner is Core. */
    1.91 @@ -345,14 +338,10 @@
    1.92  		if ((native->flags & SP_NTVFLAG_OPTIONAL) == SP_NTVFLAG_OPTIONAL)
    1.93  		{
    1.94  			/* Only add if there is a valid owner. */
    1.95 -			if (pEntry->owner != NULL)
    1.96 -			{
    1.97 +			if (pEntry->owner)
    1.98  				pEntry->owner->AddWeakRef(WeakNative(pPlugin, index));
    1.99 -			}
   1.100  			else
   1.101 -			{
   1.102  				native->status = SP_NATIVE_UNBOUND;
   1.103 -			}
   1.104  		}
   1.105  		/* Otherwise, we're a strong dependent and not a weak one */
   1.106  		else
   1.107 @@ -373,23 +362,15 @@
   1.108  	}
   1.109  }
   1.110  
   1.111 -NativeEntry *ShareSystem::AddNativeToCache(CNativeOwner *pOwner, const sp_nativeinfo_t *ntv)
   1.112 +PassRef<Native> ShareSystem::AddNativeToCache(CNativeOwner *pOwner, const sp_nativeinfo_t *ntv)
   1.113  {
   1.114 -	NativeEntry *pEntry;
   1.115 -
   1.116 -	if ((pEntry = FindNative(ntv->name)) == NULL)
   1.117 -	{
   1.118 -		pEntry = new NativeEntry(pOwner, ntv);
   1.119 -		m_NtvCache.insert(ntv->name, pEntry);
   1.120 -		return pEntry;
   1.121 -	}
   1.122 -
   1.123 -	if (pEntry->owner != NULL)
   1.124 +	NativeCache::Insert i = m_NtvCache.findForAdd(ntv->name);
   1.125 +	if (i.found())
   1.126  		return NULL;
   1.127  
   1.128 -	pEntry->owner = pOwner;
   1.129 -	pEntry->native = NULL;
   1.130 -	return pEntry;
   1.131 +	Ref<Native> entry = Newborn<Native>(new Native(pOwner, ntv));
   1.132 +	m_NtvCache.insert(ntv->name, entry);
   1.133 +	return entry;
   1.134  }
   1.135  
   1.136  FakeNative::~FakeNative()
   1.137 @@ -399,27 +380,27 @@
   1.138  
   1.139  void ShareSystem::ClearNativeFromCache(CNativeOwner *pOwner, const char *name)
   1.140  {
   1.141 -	NativeEntry *pEntry;
   1.142 -
   1.143 -	if ((pEntry = FindNative(name)) == NULL)
   1.144 +	NativeCache::Result r = m_NtvCache.find(name);
   1.145 +	if (!r.found())
   1.146  		return;
   1.147  
   1.148 -	if (pEntry->owner != pOwner)
   1.149 +	Ref<Native> entry(*r);
   1.150 +	if (entry->owner != pOwner)
   1.151  		return;
   1.152  
   1.153 -	pEntry->fake = NULL;
   1.154 -	pEntry->native = NULL;
   1.155 -	pEntry->owner = NULL;
   1.156 +	// Clear out the owner bit as a sanity measure.
   1.157 +	entry->owner = NULL;
   1.158 +
   1.159 +	m_NtvCache.remove(r);
   1.160  }
   1.161  
   1.162 -NativeEntry *ShareSystem::AddFakeNative(IPluginFunction *pFunc, const char *name, SPVM_FAKENATIVE_FUNC func)
   1.163 +PassRef<Native> ShareSystem::AddFakeNative(IPluginFunction *pFunc, const char *name, SPVM_FAKENATIVE_FUNC func)
   1.164  {
   1.165 -	NativeEntry *pEntry;
   1.166 -
   1.167 -	if ((pEntry = FindNative(name)) != NULL && pEntry->owner != NULL)
   1.168 +	Ref<Native> entry(FindNative(name));
   1.169 +	if (entry)
   1.170  		return NULL;
   1.171  
   1.172 -	ke::AutoPtr<FakeNative> fake(new FakeNative(name, pFunc));
   1.173 +	AutoPtr<FakeNative> fake(new FakeNative(name, pFunc));
   1.174  
   1.175  	fake->gate = g_pSourcePawn2->CreateFakeNative(func, fake);
   1.176  	if (!fake->gate)
   1.177 @@ -427,16 +408,10 @@
   1.178  
   1.179  	CNativeOwner *owner = g_PluginSys.GetPluginByCtx(fake->ctx->GetContext());
   1.180  
   1.181 -	if (!pEntry)
   1.182 -	{
   1.183 -		pEntry = new NativeEntry(owner, fake.take());
   1.184 -		m_NtvCache.insert(name, pEntry);
   1.185 -	} else {
   1.186 -		pEntry->owner = owner;
   1.187 -		pEntry->fake = fake.take();
   1.188 -	}
   1.189 +	entry = Newborn<Native>(new Native(owner, fake.take()));
   1.190 +	m_NtvCache.insert(name, entry);
   1.191  
   1.192 -	return pEntry;
   1.193 +	return entry;
   1.194  }
   1.195  
   1.196  void ShareSystem::AddCapabilityProvider(IExtension *myself, IFeatureProvider *provider,
   1.197 @@ -496,13 +471,10 @@
   1.198  		}
   1.199  	}
   1.200  
   1.201 -	NativeEntry *entry = FindNative(name);
   1.202 +	Ref<Native> entry = FindNative(name);
   1.203  	if (!entry)
   1.204  		return FeatureStatus_Unknown;
   1.205  
   1.206 -	if (entry->owner)
   1.207 -		return FeatureStatus_Available;
   1.208 -
   1.209  	return FeatureStatus_Unavailable;
   1.210  }
   1.211