Re: Problem with tame and aprc

"edouard funke" <[email protected]> Sat, 15 Jul 2006 17:10:51 +0100
Newsgroups gmane.comp.file-systems.sfs.general
Message-ID <[email protected]>
If i declare ptr<asrv> srv inside the class it will work ...
or
If I put getRPC's code instead of BLOCK { getRPC ... and i declare the
two variables inside the VARS of init, it will also work.

Do you have an explanation ? I would like to keep doRPC and avoid
declaring the srv variable in my class

On 7/15/06, edouard funke <[email protected]> wrote:
> Hi,
>
> I'm a student from Oxford Brookes University in Msc High Speed
> Networks and Computer Science.
>
> I'm actually writing a simple "tamed" version of chord. I faced this
> problem that  you could probably resolve :
>
> i have a function init that create a "server" socket and blocks until
> it receives an incoming connection, accept it and send the new fd to a
> getRPC function
> :
>
> TAMED int node::init ()
> {
>         // stack variables for tame
>         VARS
>         {
>                 int fd;
>                 int lfd;
>                 int result;
>                 sockaddr_in sin;
>                 socklen_t len;
>
>                 coordgroup_t<> read;
>         }
>
>         DEFAULT_RETURN { return SUCCESS; }
>
>         warn << "init !\n";
>
>         // create server socket
>         if((fd = inetsocket (SOCK_STREAM, me->port)) < 0)
>         {
>                 warn << "node::init: cannot allocate TCP port: "
>                         << me->port << " on " << ntohl(inet_addr(me->addr)) << "\n";
>                 return FAILURE;
>         }
>
>         close_on_exec(fd);
>
>         // listen to the incoming connection
>         if (listen (fd, BACKLOG) < 0)
>         {
>                 warn << "listen : " << strerror(errno) << "\n";
>                 return FAILURE;
>         }
>
>         // Call 'fdcb' to select on a file descriptor,
>         // Once the socket is readable, we'll be callback
>         fdcb (fd, selread, @[read]());
>
>         // fd ready to be read after wait
>         while (true)
>         {
>                 WAIT(read);
>
>                 len = sizeof (sin);
>                 bzero (&sin, len);
>
>                 // accepting connection
>                 if ((lfd = accept (fd, reinterpret_cast<sockaddr *> (&sin), &len)) < 0)
>                 {
>                         perror ("accept");
>                         return FAILURE;
>                 }
>
>                 warn << "accepting connection from " << inet_ntoa (sin.sin_addr) << "\n";
>
>                 // call rpc manager and set callback
>                 BLOCK { getRPC(lfd, @(result)); }
>
>                 if (result < 0)
>                 {
>                         warn << "RPC received failed !\n";
>                         continue;
>                 }
>         }
> }
>
> void node::getRPC (int fd, cbi_t result)
> {
>         // standard libasync class that wraps a TCP connection
>         ptr<axprt_stream> x = axprt_stream::alloc (fd);
>
>         // bind the rpc handler to the dispatch function
>         ptr<asrv> srv = asrv::alloc (x, node_prog_1, wrap(this,
> &node::dispatch, result));
> }
>
> The dispatch function will of course send back the response.
> The problem is that it never enters the dispatch function, why ?
>
> Thanks for your time.
> Edouard FUNKE
>