// static XPCNativeInterface* XPCNativeInterface::GetNewOrUsed(XPCCallContext& ccx, nsIInterfaceInfo* info) { AutoMarkingNativeInterfacePtr iface(ccx); const nsIID* iid; if(NS_FAILED(info->GetIIDShared(&iid)) || !iid) return nsnull; XPCJSRuntime* rt = ccx.GetRuntime(); IID2NativeInterfaceMap* map = rt->GetIID2NativeInterfaceMap(); if(!map) return nsnull; { // scoped lock XPCAutoLock lock(rt->GetMapLock()); iface = map->Find(*iid); } if(iface) return iface; iface = NewInstance(ccx, info); if(!iface) return nsnull; { // scoped lock XPCAutoLock lock(rt->GetMapLock()); XPCNativeInterface* iface2 = map->Add(iface); if(!iface2) { NS_ERROR("failed to add our interface!"); DestroyInstance(ccx, rt, iface); iface = nsnull; } else if(iface2 != iface) { DestroyInstance(ccx, rt, iface); iface = iface2; } } return iface; }
// static XPCNativeInterface* XPCNativeInterface::GetNewOrUsed(XPCCallContext& ccx, const nsIID* iid) { AutoMarkingNativeInterfacePtr iface(ccx); XPCJSRuntime* rt = ccx.GetRuntime(); IID2NativeInterfaceMap* map = rt->GetIID2NativeInterfaceMap(); if(!map) return nsnull; { // scoped lock XPCAutoLock lock(rt->GetMapLock()); iface = map->Find(*iid); } if(iface) return iface; nsCOMPtr<nsIInterfaceInfo> info; ccx.GetXPConnect()->GetInfoForIID(iid, getter_AddRefs(info)); if(!info) return nsnull; iface = NewInstance(ccx, info); if(!iface) return nsnull; { // scoped lock XPCAutoLock lock(rt->GetMapLock()); XPCNativeInterface* iface2 = map->Add(iface); if(!iface2) { NS_ERROR("failed to add our interface!"); DestroyInstance(ccx, rt, iface); iface = nsnull; } else if(iface2 != iface) { DestroyInstance(ccx, rt, iface); iface = iface2; } } return iface; }
// static XPCNativeInterface* XPCNativeInterface::GetNewOrUsed(const nsIID* iid) { AutoJSContext cx; AutoMarkingNativeInterfacePtr iface(cx); XPCJSRuntime* rt = XPCJSRuntime::Get(); IID2NativeInterfaceMap* map = rt->GetIID2NativeInterfaceMap(); if (!map) return nullptr; { // scoped lock XPCAutoLock lock(rt->GetMapLock()); iface = map->Find(*iid); } if (iface) return iface; nsCOMPtr<nsIInterfaceInfo> info; XPTInterfaceInfoManager::GetSingleton()->GetInfoForIID(iid, getter_AddRefs(info)); if (!info) return nullptr; iface = NewInstance(info); if (!iface) return nullptr; { // scoped lock XPCAutoLock lock(rt->GetMapLock()); XPCNativeInterface* iface2 = map->Add(iface); if (!iface2) { NS_ERROR("failed to add our interface!"); DestroyInstance(iface); iface = nullptr; } else if (iface2 != iface) { DestroyInstance(iface); iface = iface2; } } return iface; }
// static XPCNativeInterface* XPCNativeInterface::GetNewOrUsed(nsIInterfaceInfo* info) { AutoJSContext cx; AutoMarkingNativeInterfacePtr iface(cx); const nsIID* iid; if (NS_FAILED(info->GetIIDShared(&iid)) || !iid) return nullptr; XPCJSRuntime* rt = XPCJSRuntime::Get(); IID2NativeInterfaceMap* map = rt->GetIID2NativeInterfaceMap(); if (!map) return nullptr; iface = map->Find(*iid); if (iface) return iface; iface = NewInstance(info); if (!iface) return nullptr; XPCNativeInterface* iface2 = map->Add(iface); if (!iface2) { NS_ERROR("failed to add our interface!"); DestroyInstance(iface); iface = nullptr; } else if (iface2 != iface) { DestroyInstance(iface); iface = iface2; } return iface; }