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