Hi Joaquin,
 
Sometime also I get following message when I run.  I have pure virtual method in Procedure.h file but I have
overridden in my Sample_Procedure.h file and implemented there. But still I am getting error relating pure
virtual method call.
 
Thanks
Priyank
 
 
// PROCEDURE HEADER
 
#ifndef  PROCEDURE_H
#define  PROCEDURE_H
 
#include <boost/utility.hpp>
#include <boost/shared_ptr.hpp>
#include <ace/Message_Block.h>
#include <ace/Task.h>
#include "Procedure_State_Enum.h"
#include "Procedure_Type_Enum.h"
#include "Loader_Trace.h"
 
class Procedure : boost::noncopyable {
 
public:
 /**
  * Virtual destructor.
  */
 virtual Procedure::~Procedure() {
 }
 /**
  * Stats this procedure.
  * @return Success of failure status of start
  */
 virtual int start() = 0;
 /**
  * Handles this message block. Here we can not use scoped pointer since
  * we have to use release() method that does more than just deleting the
  * memory allocated.
  * @param _msg_block Message block to handler by procedure.
  * @return Indicates success or failure
  */
 virtual int handle(boost::shared_ptr<ACE_Message_Block> _msg_block) = 0;
 /**
  * Returns state of the procedure.
  * @return Success or failure of the procedure.
  */
 virtual const Procedure_State_Enum& state() const = 0;
 /**
  * Sets state of the procedure.
  * @param state to set
  */
 virtual void state(const Procedure_State_Enum& _state) = 0;
 /**
  * Id for registration with connection.
  * @return Id that is used for registration in subscriber.
  */
 virtual int id() const = 0;
 /**
  * Returns type of the procedure.
  * @return type of the procedure.
  */
 virtual const Procedure_Type_Enum& procedure_type() const = 0;
 /**
  * This method will be called whenever procedure timed out for incoming
  * message. Each procedure will register to appropriate reactor (global for now) using
  * Procedure Timer Handler class and that class will forward the time out method back
  * to procedure once time out happens.
  * @param Indicates where timed out handled successfully or not
  */
 virtual void handle_timeout() = 0;
};
 
#endif
 
 
// SAMPLE PROCEDURE HEADER
 
#ifndef  SAMPLE_PROCEDURE_H
#define  SAMPLE_PROCEDURE_H

#include <boost/utility.hpp>
#include <boost/scoped_ptr.hpp>
#include <ace/Auto_Event.h>
#include <ace/Message_Block.h>
#include "../../../../core/include/Procedure.h"
#include "../../../../core/include/Connection.h"
#include "../../../../core/include/Procedure_Timer_Handler.h"
#include "../../../../core/include/Logger.h"
#include "../../../apps/include/Access_Point.h"
 
class Sample_Procedure : public Procedure {
 
public:
 /**
  * Constructor.
  * @param _ap Access point associated with this procedure.
  * @param _wait_timer Wait period for receiving message
  * may not require for real procedure
  */
 Sample_Procedure (Access_Point * _ap, int _recv_timer);
 /**
  * Start method will be called when this procedure is activated.
  */
 virtual int start();
 /**
  * Returns state this procedure.
  * @return Success or failure of the procedure.
  */
 virtual const Procedure_State_Enum& state () const {
  return state_;
 }
 /**
  * Sets state of the procedure.
  * @param state to set
  */
 virtual void state(const Procedure_State_Enum& _state) {
  state_ = _state;
 }
 /**
  * Returns id for this procedure. This has to be unique id
  * for the procedure.
  */
 virtual int id () const {
  return id_;
 }

 /**
  * Returns type of the procedure.
  * @return type of the procedure.
  */
 virtual const Procedure_Type_Enum& procedure_type() const {
  return type_;
 }
 /**
  * This method will be called whenever procedure timed out for incoming
  * message. Each procedure will register to appropriate reactor (global for now) using
  * Procedure Timer Handler class and that class will forward the time out method back
  * to procedure once time out happens.
  */
 virtual void handle_timeout();
 /**
  * Handles this message block. Here we can not use scoped pointer since
  * we have to use release() method that does more than just deleting the
  * memory allocated.
  * @param _msg_block Message block to handler by procedure.
  * @return Indicates success or failure
  */
 virtual int handle(boost::shared_ptr<ACE_Message_Block> _msg_block);
 static int ID;
 
private:
 /**
  * Access point for which the procedure is related to.
  * This is just a temporary storage. User has to pass
  * each time procedure is created.
  */
 Access_Point* ap_;
 /**
  * State of this procedure.
  */
 Procedure_State_Enum state_;
 /**
  * State of the procedure.
  */
 Procedure_Type_Enum type_;
 /**
  * Wait period to wait.
  */
 int recv_timer_;
 /**
  * Procedure timer handler.
  */
 boost::scoped_ptr<Procedure_Timer_Handler> recv_timer_handler_;
 /**
  * Created static for this samle procedure. Might be regular
  * data member for real procedure.
  */
 int id_;
};
 
#endif
 
 
Thanks,
Priyank
 
LD_TRACE:                                                   (8) In Method: Procedure_Pool::find_by_id File: `src/core/procedure/Procedure_Pool.cpp' Line: 54
PROCEDURE TO FIND: 1548
pure virtual method called
Abort (core dumped)

 
(gdb) where
#0  0xfe8d9764 in __sigprocmask () from /usr/lib/libthread.so.1
#1  0xfe8ce978 in _resetsig () from /usr/lib/libthread.so.1
#2  0xfe8ce118 in _sigon () from /usr/lib/libthread.so.1
#3  0xfe8d1158 in _thrp_kill () from /usr/lib/libthread.so.1
#4  0xfea4b9dc in raise () from /usr/lib/libc.so.1
#5  0xfea358fc in abort () from /usr/lib/libc.so.1
#6  0xfeb61208 in __cxxabiv1::__terminate (handler=0xfea357f4 <abort>)
    at ../../../../gcc-3.3/libstdc++-v3/libsupc++/eh_terminate.cc:47
#7  0xfeb61244 in std::terminate () at ../../../../gcc-3.3/libstdc++-v3/libsupc++/eh_terminate.cc:57
#8  0xfeb61744 in __cxa_pure_virtual () at ../../../../gcc-3.3/libstdc++-v3/libsupc++/pure.cc:50
#9  0x000ce1d8 in _ZNK5boost11multi_index13const_mem_funI9ProcedureiXadsrS2_NKS2_2idEvEEclERKS2_ ()
#10 0x000ce174 in _ZNK5boost11multi_index13const_mem_funI9ProcedureiXadsrS2_NKS2_2idEvEEclIPS2_EEiRKT_ ()
#11 0x000ce3e4 in _ZN5boost11multi_index6detail18ordered_index_findINS1_18ordered_index_nodeINS1_15index_node_baseIP9ProcedureEEEENS0_13const_mem_funIS5_iXadsrS5_NKS5_2idEvEEEiSt4lessIiEEEPT_SE_RKT0_RKT1_RKT2_ ()
#12 0x000cd72c in _ZNK5boost11multi_index6detail13ordered_indexINS0_13const_mem_funI9ProcedureiXadsrS4_NKS4_2idEvEEESt4lessIiENS1_9nth_layerILi1EPS4_NS0_10indexed_byINS0_14ordered_uniqueINS0_3tagI16procedure_id_tagN4mpl_2naESF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_EES5_SF_EESF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_SF_EESaIS9_EEENS_3mpl6v_itemISD_NSL_7vector0ISF_EELi0EEENS1_18ordered_unique_tagEE4findIiEENS1_14index_iteratorINS1_18ordered_index_nodeINS1_15index_node_baseIS9_EEEEEERKT_ ()
#13 0x00064d78 in Procedure_Pool::find_by_id ()
#14 0x00064650 in Procedure_Pool::add_by_id ()
#15 0x000783d4 in AP_TCP_Connection::subscribe ()
#16 0x00069d64 in Access_Point::subscribe ()
#17 0x00076450 in Procedure_Executor::handle_timeout ()
#18 0xff2c1940 in ACE_Event_Handler_Handle_Timeout_Upcall<ACE_Recursive_Thread_Mutex>::timeout ()
   from /vob/wibb_test/tools/cots/ACE_5.5/ace/libACE.so.5.5.0
#19 0xff26f2e4 in ACE_TP_Reactor::handle_timer_events ()
    at /mot/proj/ivtools/ppatel1/ACE_wrappers/ace/String_Base.inl:32
#20 0xff26f160 in ACE_TP_Reactor::dispatch_i () at /mot/proj/ivtools/ppatel1/ACE_wrappers/ace/String_Base.inl:32
---Type <return> to continue, or q <return> to quit---q
Quit
(gdb) quit
 
// METHOD
 
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());
}