Re: [Boost-users] [multi_index] Core dump in multi-index library !!
Hi Joaquin, Seems the problem was happening when I call add and my add method tries to first find out whether that id is already present in container or not. It is not during remove method call. I was concentrating on wrong portion of the code before. Anyways, I have changed and put some print out in code also at the end I have included output that comes. I have changed container to ordered index as you have said, but seems to be the same problem. It seems that it is core dumping on following line: bool Procedure_Pool::find_by_id(Procedure * _procedure) { LD_TRACE("Procedure_Pool::find_by_id"); ACE_ASSERT(_procedure != 0); ACE_DEBUG((LM_DEBUG, "PROCEDURE TO FIND: %d\n", _procedure->id())); Procedure_By_Id::iterator it = procedure_by_id_.find(_procedure->id()); ACE_DEBUG((LM_DEBUG, "AFTER FIND CALL\n")); return (it != procedure_by_id_.end()); } Please let me know if I am doing something wrong here. Also, let me know if you need any more information. Please see debug output at the end of the email. Thanks Priyank #ifndef PROCEDURE_POOL_H #define PROCEDURE_POOL_H /** * Identifier pool of procedure. This procedure will be un-sorted * hashed index provided by procedures unique id retuned by procedure. * It internally uses boost hashed index for indexing the procedures * in procedure pool. * * @author Priyank Patel * @since Mar 30, 2006 */ #include <boost/multi_index_container.hpp> #include <boost/multi_index/member.hpp> #include <boost/multi_index/ordered_index.hpp> #include <boost/multi_index/hashed_index.hpp> #include <boost/config.hpp> #include <boost/utility.hpp> #include <boost/shared_ptr.hpp> #include <boost/multi_index/key_extractors.hpp> #include "Procedure.h" using boost::multi_index_container; using namespace boost::multi_index; /** * Defines tag used for procedure id. */ struct procedure_id_tag { }; class Procedure_Pool: boost::noncopyable { private: /** * Type definition for multi index container. */ typedef multi_index_container< Procedure*, indexed_by< ordered_unique< tag<procedure_id_tag>, const_mem_fun<Procedure, int, &Procedure::id> >
Procedure_Hashed_Pool;
/** * Type definition for indexing based on procedure id tag. */ typedef Procedure_Hashed_Pool::index<procedure_id_tag>::type Procedure_By_Id; public: /** * Constructor. */ Procedure_Pool(): pool_(), procedure_by_id_(pool_.get<procedure_id_tag>()) { } /** * Adds specified procedure in this pool. * It will intenally used procedures id() method to index procedure. * @param _procedure Procedure to be added in this pool * @return Success (0) or Failure (-1) based on addition happened or not */ int add_by_id(Procedure * _procedure); /** * Removes procedure from this pool. * @param _procedure procedure that needs to be removed * @return Success (0) or Failure (1) based on removal happend or not */ int remove_by_id(Procedure * _procedure); /** * Retrieves procedure based on specified id. * @param _id Identifier * @return Procedure Pointer to procedure. Returns 0 if procedure not found */ Procedure * find_by_id(int _id); private: /** * Returns true if procedure is present otherwise returns false. * @param _procedure procedure that needs to found * @return true if found or false if not found */ bool find_by_id(Procedure * _procedure); /** * boost multiindex object that is associated with this pool. */ Procedure_Hashed_Pool pool_; /** * Refernece of pool that is indexed by procedure id tag. */ Procedure_By_Id &procedure_by_id_; }; #endif #include "../include/Procedure_Pool.h" int Procedure_Pool::add_by_id(Procedure * _procedure) { LD_TRACE("Procedure_Pool::add_by_id"); ACE_ASSERT(_procedure != 0); ACE_DEBUG((LM_DEBUG, "FIND CALL FROM ADD\n")); if (!find_by_id(_procedure)) { // procedure not found procedure_by_id_.insert(_procedure); // debug info ACE_DEBUG((LM_DEBUG, "Added procedure : %d \n", _procedure->id())); // return success return 0; } else { // error ACE_ERROR((LD_ERROR "%N:%l Error in adding procedure : %d \n", _procedure->id())); // return failure return -1; } } int Procedure_Pool::remove_by_id(Procedure * _procedure) { LD_TRACE("Procedure_Pool::remove_by_id"); ACE_ASSERT(_procedure != 0); ACE_DEBUG((LM_DEBUG, "FIND CALL FROM REMOVE\n")); if (find_by_id(_procedure)) { // procedure found procedure_by_id_.erase(_procedure->id()); ACE_DEBUG((LM_DEBUG, "Removed procedure : %d \n", _procedure->id())); return 0; } else { ACE_ERROR((LD_ERROR "%N:%l Error in removing procedure : %d \n", _procedure->id())); return -1; } } Procedure * Procedure_Pool::find_by_id(int _id) { LD_TRACE("Procedure_Pool::find_by_id"); Procedure_By_Id::iterator it = procedure_by_id_.find(_id); if (it != procedure_by_id_.end()) { ACE_DEBUG((LM_DEBUG, "%N:%l Found procedure for id: %d \n", _id)); return *it; } ACE_ERROR((LD_ERROR "%N:%l Not able to found procedure for id: %d \n", _id)); // return null return 0; } bool Procedure_Pool::find_by_id(Procedure * _procedure) { LD_TRACE("Procedure_Pool::find_by_id"); ACE_ASSERT(_procedure != 0); ACE_DEBUG((LM_DEBUG, "PROCEDURE TO FIND: %d\n", _procedure->id())); Procedure_By_Id::iterator it = procedure_by_id_.find(_procedure->id()); ACE_DEBUG((LM_DEBUG, "AFTER FIND CALL\n")); return (it != procedure_by_id_.end()); } Debug Output: ========== May 10 11:12:49.209 2006@isdbuild1@14739@LM_DEBUG@FIND <mailto:2006@isdbuild1@14739@LM_DEBUG@FIND> CALL FROM ADD May 10 11:12:49.209 2006@isdbuild1@14739@LM_TRACE@LD_TRACE <mailto:2006@isdbuild1@14739@LM_TRACE@LD_TRACE> : (8) In Method: Procedure_Pool::find_by_id File: `src/core/procedure/Procedure_Pool.cpp' Line: 54 May 10 11:12:49.209 2006@isdbuild1@14739@LM_DEBUG@PROCEDURE <mailto:2006@isdbuild1@14739@LM_DEBUG@PROCEDURE> TO FIND: 1320 May 10 11:12:49.759 2006@<local_host>@7239@LM_ERROR@Logging <mailto:2006@<local_host>@7239@LM_ERROR@Logging> Service|closing log daemon at host isdbuild1
participants (1)
-
Patel Priyank-PPATEL1