template<class T> inline ArrayRCP<T>::ArrayRCP( T* p, size_type lowerOffset_in, size_type size_in, bool has_ownership_in, const ERCPNodeLookup rcpNodeLookup ) : ptr_(p), #ifndef TEUCHOS_DEBUG node_(ArrayRCP_createNewRCPNodeRawPtr(p, has_ownership_in)), #endif // TEUCHOS_DEBUG lowerOffset_(lowerOffset_in), upperOffset_(size_in + lowerOffset_in - 1) { #ifdef TEUCHOS_DEBUG if (p) { RCPNode* existing_RCPNode = 0; if (!has_ownership_in && rcpNodeLookup==RCP_ENABLE_NODE_LOOKUP) { existing_RCPNode = RCPNodeTracer::getExistingRCPNode(p); } if (existing_RCPNode) { // Will not call add_new_RCPNode(...) node_ = RCPNodeHandle(existing_RCPNode, RCP_WEAK, false); } else { // Will call add_new_RCPNode(...) RCPNodeThrowDeleter nodeDeleter(ArrayRCP_createNewRCPNodeRawPtr(p, has_ownership_in)); node_ = RCPNodeHandle( nodeDeleter.get(), p, typeName(*p), concreteTypeName(*p), has_ownership_in ); nodeDeleter.release(); } } #endif // TEUCHOS_DEBUG }
// ReadVNode status_t HaikuKernelVolume::ReadVNode(ino_t vnid, bool reenter, void** _node, int* type, uint32* flags, FSVNodeCapabilities* _capabilities) { if (!fVolume.ops->get_vnode) return B_BAD_VALUE; // create a new wrapper node and add it to the map HaikuKernelNode* node = new(std::nothrow) HaikuKernelNode(this, vnid, NULL, NULL, NULL); if (node == NULL) return B_NO_MEMORY; ObjectDeleter<HaikuKernelNode> nodeDeleter(node); AutoLocker<NodeMap> locker(fNodes); if (fNodes->Get(vnid) != NULL) return B_BAD_VALUE; status_t error = fNodes->Put(vnid, node); if (error != B_OK) return error; locker.Unlock(); // get the node error = fVolume.ops->get_vnode(&fVolume, vnid, node, type, flags, reenter); if (error != B_OK) { locker.Lock(); fNodes->Remove(vnid); return error; } // get node capabilities HaikuKernelNode::Capabilities* capabilities = _FileSystem()->GetNodeCapabilities(node->ops); if (capabilities == NULL) { node->ops->put_vnode(&fVolume, node, reenter); locker.Lock(); fNodes->Remove(vnid); return B_NO_MEMORY; } locker.Lock(); node->capabilities = capabilities; node->published = true; nodeDeleter.Detach(); *_node = node; *_capabilities = capabilities->capabilities; return B_OK; }