[Click] how do I dynamically create an element ?
Eddie Kohler
kohler at CS.UCLA.EDU
Thu Mar 31 03:08:07 EST 2005
Bart,
Click is not built to do this. I will not help you do this. CERTAINLY not when
you have not even measured how slow hotswapping is for your application. How
many configuration changes do you want a second? 10000?
Eddie
bartvdb wrote:
> Hi all
>
>
> I fear the configuration will probably need to be "hotswapped" too
> often. I've tried a bit to create elements dynamically anyway in the
> C++ code of a custom element, and that seems to work up to a certain
> level, but now the router.cc code gives me a SIGABORT signal...
>
>
> Could anyone tell me please why this doesn't work and how I could make
> it to work:
> ##############
> int Valve::configure(Vector<String> &conf, ErrorHandler *errh)
> {
> int result;
> Vector<String> v;
> v.push_back("1000");
> queue->configure(v,errh);
> queue->initialize(errh);
> _errh=errh;
> //fill hashmap with dummy value;
> unsigned hash=hashcode("255.255.255.255");
> Usershaper *ushaper=new Usershaper();
> ushaper->usershaper=new BandwidthShaper();
> ushaper->userqueue=new SimpleQueue();
>
> Vector<String> vqueue;
> vqueue.push_back("1000");
> result = ushaper->userqueue->configure(vqueue,_errh);
> click_chatter("result: %i", result);
>
> Vector<String> tempv;
> tempv.push_back("56000bps");
> result = ushaper->usershaper->configure(tempv,_errh);
> click_chatter("result: %i", result);
>
> // cf.
> http://www.pdos.lcs.mit.edu/click/doc/progman.html#Initialization%20Phases
> // First configure, then connect ports, then initialize
> // cf. $CLICKDIR/lib/router.cc: "Router::set_connections()"
> // First connect output port then input port
> int *input_codes, *output_codes;
> ushaper->userqueue->processing_vector(input_codes, output_codes, _errh);
> ushaper->userqueue->initialize_ports(input_codes, output_codes);
> ushaper->usershaper->processing_vector(input_codes, output_codes,
> _errh);
> ushaper->usershaper->initialize_ports(input_codes, output_codes);
> result = ushaper->userqueue->connect_output(0,ushaper->usershaper,0);
> click_chatter("result: %i", result);
> result = ushaper->usershaper->connect_input(0,ushaper->userqueue,0);
> click_chatter("result: %i", result);
> result = ushaper->userqueue->initialize(_errh);
> click_chatter("result: %i", result);
> result = ushaper->usershaper->initialize(_errh);
> click_chatter("result: %i", result);
>
> _shapermap.insert(hash, ushaper);
>
> return 0;
> }
> ##############
>
>
> Starting a configuration with this element in userlevel Click returns
> this on the command line:
> ##############
> result: 0
> result: 0
> result: -1
> result: 0
> result: 0
> result: 0
> Segmentation fault
> ##############
>
>
> All seems very much OK, up till the segmentation fault. As mentioned
> before, the segmentation fault corresponds to a SIGABORT signal (as seen
> when debugging the code with DDD) when the configuration of this element
> finishes and the code of router.cc resumes executing. Some memory
> address cannot be accessed and it seems the "this" pointer has changed...
>
>
> Thanks in advance
> Bart
>
>
>
>
>>Hi Bart,
>>
>>Click doesn't yet support this directly, but it is possible to
>>"hotswap" a new configuration. State from the old config will be
>>inserted into the new.
>>
>>Eddie
>>
>>
>>On Mar 16, 2005, at 6:08 AM, Bart Van Keyenberg wrote:
>>
>>
>>>Hi,
>>>
>>>I want to create a click configuration where I don't know how much
>>>elements of a certain kind I will need beforehand (number of elements
>>>depends on number of users). Can I dynamically create an element
>>>(e.g. from within another element), and if so, how do I handle this
>>>kind of thing?
>>>
>>>Kind Regards
>>>
>>>Bart
>
>
> _______________________________________________
> click mailing list
> click at amsterdam.lcs.mit.edu
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
More information about the click
mailing list