On Mon, May 03, 2021 at 09:14:13AM +0300, Aki Tuomi wrote:
>
> > On 01/05/2021 18:32 Ryan Beethe <r...@splintermail.com> wrote:
> >
> > 1. Why does cmd-idle.c sometimes call client_command_free()?  But
> > sometimes it doesn't?
> >
> >     For example, cmd_idle_continue() frees it in some branches but not
> >     others.  That makes no sense to me; it seems like it should be based
> >     on your entrypoint (mailbox notify callback vs input callback vs
> >     timeout callback), not based on which branch of logic within that
> >     entrypoint.
> >
> > 2. Why does cmd-idle.c ever call client_destroy()?  That seems like
> > something that should be invoked only by the imap process, not by any
> > command.
> >
> >     It calls it in cmd-idle.c:idle_callback (which is a mailbox notify
> >     callback).  It invokes it after idle_sync_now() when it detects that
> >     client->disconnected is set.  Maybe that happens in imap_sync_init()
> >     or something?
> >
> > 3. Why does cmd-idle.c ever call client_disconnect()?  That also seems
> > like the responsibility of the imap process, and not any command.
> >
> >     idle_client_input_more() detects when i_stream_read returns -1,
> >     meaning that the client has *already disconnected*.  Then it calls
> >     client_disconnect().
> >
> >     I think this is the crazy part... the istream is effectively unique
> >     to the imap process, so it seems unreasonable that any command is
> >     responsible for cleaning it up; it should just always happen at the
> >     imap process level before exiting, right?
> >
>
> IDLE cmd can be sometimes delegated to a separate worker called 
> imap-hibernate, in which case the connection is moved to another process. 
> This explains about all your questions.

Wait, but then why does APPEND also make each of these calls?  APPEND
can't be hibernated, as far as I can tell?

> > 4. What does client_continue_pending_input() actually do, and under
> > what conditions does it need to be called?
>
> It means that you did not consume all the input there was.

Ok, reading over the code now with this understanding makes a lot of
sense, thank you.

> You probably shold look some much more simple commands as insipiration. Try 
> looking e.g. how cmd_id is implemented instead.

I implemented a simpler command as well, but because it was simple I
didn't have any questions :)

Unfortunately I do need a long-running command more like IDLE as well.

Ryan

Reply via email to