On Mi, 2012-01-18 at 16:55 +0100, Chris Kühl wrote:
> I've renamed my branch to concurrent-sync-sessions and rebased onto
> master. I'm now going through and making required changes to get tests
> to work.

Note that I pushed another change onto a new "signal-handling" branch.
This affects you because syncevo-dbus-server will have to relay
suspend/abort requests. The helper process will have to deal with
signals similar to syncevo-local-sync helper in that branch.

Do these changes make sense?

commit 9b4e87732ef4e9f540016022473e5ab381a21534
Author: Patrick Ohly <[email protected]>
Date:   Thu Jan 19 16:11:22 2012 +0100

    rewrote signal handling
    
    Having the signal handling code in SyncContext created an unnecessary
    dependency of some classes (in particular the transports) on
    SyncContext.h. Now the code is in its own SuspendFlags.cpp/h files.
    
    Cleaning up when the caller is done with signal handling is now part
    of the utility class (removed automatically when guard instance is
    freed).
    
    The signal handlers now push one byte for each caught signal into a
    pipe. That byte tells the rest of the code which message it needs to
    print, which cannot be done in the signal handlers (because the
    logging code is not reentrant and thus not safe to call from a signal
    handler).
    
    Compared to the previous solution, this solves several problems:
    - no more race condition between setting and printing the message
    - the pipe can be watched in a glib event loop, thus removing
      the need to poll at regular intervals; polling is still possible
      (and necessary) in those transports which do not integrate with
      the event loop (CurlTransport) while it can be removed from
      others (SoupTransport, OBEXTransport)
    
    A boost::signal is emitted when the global SuspendFlags change.
    Automatic connection management is used to disconnect instances which
    are managed by boost::shared_ptr. For example, the current transport's
    cancel() method is called when the state changes to "aborted".
    
    The early connection phase of the OBEX transport now also can be
    aborted (required cleaning up that transport!).
    
    Currently watching for aborts via the event loop only works for real
    Unix signals, but not for "abort" flags set in derived SyncContext
    instances. The plan is to change that by allowing a "set abort" on
    SuspendFlags and thus making
    SyncContext::checkForSuspend/checkForAbort() redundant.
    
    The new class is used as follows:
    - syncevolution command line without daemon uses it to control
      suspend/abort directly
    - syncevolution command line as client of syncevo-dbus-server
      connects to the state change signal and relays it to the
      syncevo-dbus-server session via D-Bus; now all operations
      are protected like that, not just syncing
    - syncevo-dbus-server installs its own handlers for SIGINT
      and SIGTERM and tries to shut down when either of them
      is received. SuspendFlags then doesn't activate its own
      handler. Instead that handler is invoked by the
      syncevo-dbus-server niam() handler, to suspend or abort
      a running sync. Once syncs run in a separate process, the
      syncevo-dbus-server should request that these processes
      suspend or abort before shutting down itself.
    - The syncevo-local-sync helper ignores SIGINT after a sync
      has started. It would receive that signal when forked by
      syncevolution in non-daemon mode and the user presses
      CTRL-C. Now the signal is only handled in the parent
      process, which suspends as part of its own side of
      the SyncML session and aborts by sending a SIGTERM+SIGINT
      to syncevo-local-sync. SIGTERM in syncevo-local-sync is
      handled by SuspendFlags and is meant to abort whatever
      is going on there at the moment (see below).
    
    Aborting long-running operations like import/export or communication
    via CardDAV or ActiveSync still needs further work. The backends need
    to check the abort state and return early instead of continuing.

-- 
Best Regards, Patrick Ohly

The content of this message is my personal opinion only and although
I am an employee of Intel, the statements I make here in no way
represent Intel's position on the issue, nor am I authorized to speak
on behalf of Intel on this matter.


_______________________________________________
SyncEvolution mailing list
[email protected]
http://lists.syncevolution.org/listinfo/syncevolution

Reply via email to