[Click] nsclick readhandler and writehandler patches
Eddie Kohler
kohler at cs.ucla.edu
Wed Feb 22 03:12:05 EST 2006
Hi Bart, Michael,
Thanks -- applied! But in future, please, please, please, please send patches
in patch format (i.e. output of 'diff -ru').
Eddie
Bart Braem wrote:
> Hello,
>
> Currently nsclick does not pass a simstate when calling handlers from ns. This
> can pose problems as the time passed by ns might be completely wrong. This
> poses problems when handler callback functions use something with time. The
> proper approach is the same as when running loadclick.
>
> classifier-click.cc should contain the following code:
> else if (strcmp(argv[1], "readhandler") == 0) {
> char* readreturn = 0;
> simclick_simstate simstate;
> simstate.curtime = GetSimTime();
> readreturn = simclick_click_read_handler(clickinst_,argv[2],argv[3],0,0,
> &simstate);
> //fprintf(stderr, "readhandler: %s\n",clickretc);
> if (readreturn) {
> tcl.resultf("%s", readreturn);
> free(readreturn);
> readreturn = 0;
> }
> else {
> tcl.resultf("");
> }
> return TCL_OK;
> }
> } else if (argc == 5) {
> if (strcmp(argv[1], "writehandler") == 0) {
> int clickret;
> simclick_simstate simstate;
> simstate.curtime = GetSimTime();
> clickret = simclick_click_write_handler(clickinst_, argv[2], argv[3],
> argv[4], &simstate);
> //fprintf(stderr, "writehandler: %i\n",clickret);
> tcl.resultf("%i", clickret);
> return TCL_OK;
> }
> }
>
> (Perhaps the simstate initialisation part should become a separate
> method/constructor)
>
> include/click/simclick.h should accept the simstate parameter:
> char* simclick_click_read_handler(simclick_click clickinst,
> const char* elementname,
> const char* handlername,
> SIMCLICK_MEM_ALLOC memalloc,
> void* memparam,
> simclick_simstate* state);
>
> int simclick_click_write_handler(simclick_click clickinst,
> const char* elemname, const char*
> handlername,
> const char* writestring, simclick_simstate*
> state);
>
> ns/nsclick.cc should set the state:
> char* simclick_click_read_handler(simclick_click clickinst,
> const char* elementname,
> const char* handlername,
> SIMCLICK_MEM_ALLOC memalloc,
> void* memparam,
> simclick_simstate* state){
> Router *r = ((SimState*)clickinst)->router;
> if (!r) {
> click_chatter("simclick_click_read_handler: call with null router");
> return 0;
> }
> setsimstate(state);
>
> int simclick_click_write_handler(simclick_click clickinst,
> const char* elemname, const char*
> handlername,
> const char* writestring, simclick_simstate*
> state){
> Router *r = ((SimState*)clickinst)->router;
> if (!r) {
> click_chatter("simclick_click_write_handler: call with null router");
> return -3;
> }
> setsimstate(state);
>
> Credit for this patch goes to Michael Voorhaen, he discovered the problem and
> worked out the solution.
>
> 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