[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [ns] weird interactions
I finally found out how stupid I can be.
(the culprit line pointed out below).
-ratul
On Fri, 13 Oct 2000, Ratul Mahajan wrote:
>
> I am seeing some behavior for which i have no explaination for. I would
> appreciate if someone can help.
>
> I write a new queue and a new agent (also changed the makefile). And after
> instantiating the agent, i pass that as parameter to the queue which
> stores a pointer to it. All is fine till here. When a packet comes to this
> queue, I do an upcall to the agent. In this upcall i try to access a
> member variable of the agent, at which point the code seg faults.
>
> I have appended both the .cc and .tcl file i am wrote. They are rather
> small and simple (i tore them down to the minumum before posting). Again,
> any help or directions appreciated.
>
> thanks,
> -ratul
>
> -----------------------
>
> trial.cc
> ========
>
> #include "agent.h"
> #include "queue.h"
>
> class PushbackAgent : public Agent {
>
> public:
> PushbackAgent();
> int last_index_;
>
> void upcall() {
> printf("In Agent upcall\n");
> printf("Last Index = %d\n", last_index_);
> }
>
> };
>
> static class PushbackClass : public TclClass {
> public:
> PushbackClass() : TclClass("Agent/Pushback") {}
> TclObject* create(int, const char*const*) {
> return (new PushbackAgent());
> }
> } class_Pushback;
>
> PushbackAgent::PushbackAgent() : Agent(PT_PING), last_index_(0) {
> bind("last_index_", &last_index_);
> }
>
>
> //##################### PushbackQueue #####################
>
> class PushbackQueue: public Queue {
> public:
> PushbackQueue( const char* const);
>
> void enque(Packet *p);
> Packet * deque() {return NULL;}
>
> PushbackAgent * pushback_;
> };
>
> static class PushbackQueueClass : public TclClass {
> public:
> PushbackQueueClass() : TclClass("Queue/Pushback") {}
> TclObject * create(int argc, const char*const* argv) {
> if (argc==4) {
> printf("Missing Argument for Pushback Queue Constructor\n");
> exit(-1);
> }
> return (new PushbackQueue(argv[4]));
> }
>
> } class_pushback_queue;
>
> PushbackQueue::PushbackQueue(const char* const pba) {
>
> PushbackAgent * pushback_ = (PushbackAgent *)TclObject::lookup(pba);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
decalring another pushback_ instead of assigning value to old one.
> if (pushback_ == NULL) {
> printf("Wrong Argument for Pushback Queue Constructor\n");
> exit(-1);
> }
> printf("pushback queue instantiated %d\n",pushback_->last_index_);
> }
>
> void
> PushbackQueue::enque(Packet *p) {
>
> printf("In queue enque\n");
> pushback_->upcall();
> }
>
>
> --------------------------------------------------------
>
> first.tcl
> ========
>
> set ns [new Simulator]
>
> set n0 [$ns node]
> set n1 [$ns node]
>
> set pushback0 [new Agent/Pushback]
> $ns attach-agent $n0 $pushback0
>
> $ns simplex-link $n0 $n1 0.5Mb 10ms Pushback $pushback0
> $ns simplex-link $n1 $n0 0.5Mb 10ms DropTail
>
> set src1 [$ns create-connection TCP $n0 TCPSink $n1 0]
> set ftp1 [$src1 attach-app FTP]
>
> $ns at 1.0 "$ftp1 start"
> $ns at 20.0 "$ns halt; exit 0"
> $ns run
>
>
> -----------------------------------------------
> output
> -----
>
> warning: no class variable Agent/Pushback::last_index_
>
> see tcl-object.tcl in tclcl for info about this warning.
>
> pushback queue instantiated 0
> In queue enque
> In Agent upcall
> Segmentation fault (core dumped)
>
>
> -> so it fails at the point i try to access "last_index_".
> any clues?
>
>