inline static Magnitude KERNEL_PREFIX reduce(Magnitude x, Magnitude y) {return TEUCHOS_MAX(x,y);}
void RCPNodeTracer::addNewRCPNode( RCPNode* rcp_node, const std::string &info ) { // Used to allow unique identification of rcp_node to allow setting breakpoints static int insertionNumber = 0; // Set the insertion number right away in case an exception gets thrown so // that you can set a break point to debug this. #ifdef TEUCHOS_DEBUG rcp_node->set_insertion_number(insertionNumber); #endif if (loc_isTracingActiveRCPNodes()) { // Print the node we are adding if configured to do so. We have to send // to std::cerr to make sure that this gets printed. #ifdef RCP_NODE_DEBUG_TRACE_PRINT std::cerr << "RCPNodeTracer::addNewRCPNode(...): Adding " << convertRCPNodeToString(rcp_node) << " ...\n"; #endif TEUCHOS_TEST_FOR_EXCEPT(0==rcp_node_list()); const void * const map_key_void_ptr = get_map_key_void_ptr(rcp_node); // See if the rcp_node or its object has already been added. typedef rcp_node_list_t::iterator itr_t; typedef std::pair<itr_t, itr_t> itr_itr_t; const itr_itr_t itr_itr = rcp_node_list()->equal_range(map_key_void_ptr); const bool rcp_node_already_exists = itr_itr.first != itr_itr.second; RCPNode *previous_rcp_node = 0; bool previous_rcp_node_has_ownership = false; for (itr_t itr = itr_itr.first; itr != itr_itr.second; ++itr) { previous_rcp_node = itr->second.nodePtr; if (previous_rcp_node->has_ownership()) { previous_rcp_node_has_ownership = true; break; } } TEUCHOS_TEST_FOR_EXCEPTION( rcp_node_already_exists && rcp_node->has_ownership() && previous_rcp_node_has_ownership, DuplicateOwningRCPError, "RCPNodeTracer::addNewRCPNode(rcp_node): Error, the client is trying to create a new\n" "RCPNode object to an existing managed object in another RCPNode:\n" "\n" " New " << convertRCPNodeToString(rcp_node) << "\n" "\n" " Existing " << convertRCPNodeToString(previous_rcp_node) << "\n" "\n" " Number current nodes = " << rcp_node_list()->size() << "\n" "\n" "This may indicate that the user might be trying to create a weak RCP to an existing\n" "object but forgot make it non-ownning. Perhaps they meant to use rcpFromRef(...)\n" "or an equivalent function?\n" "\n" << getCommonDebugNotesString(); ); // NOTE: We allow duplicate RCPNodes if the new node is non-owning. This // might indicate a advanced usage of the RCP class that we want to // support. The typical problem is when the programmer unknowingly // creates an owning RCP to an object already owned by another RCPNode. // Add the new RCP node keyed as described above. (*rcp_node_list()).insert( itr_itr.second, std::make_pair(map_key_void_ptr, RCPNodeInfo(info, rcp_node)) ); // NOTE: Above, if there is already an existing RCPNode with the same key // value, this iterator itr_itr.second will point to one after the found // range. I suspect that this might also ensure that the elements are // sorted in natural order. // Update the insertion number an node tracing statistics ++insertionNumber; ++loc_rcpNodeStatistics().totalNumRCPNodeAllocations; loc_rcpNodeStatistics().maxNumRCPNodes = TEUCHOS_MAX(loc_rcpNodeStatistics().maxNumRCPNodes, numActiveRCPNodes()); }