On 30/04/12 10:31, Nick Rudnick wrote:
> Dear all,
>
> thanks to your help I was able to find a workaround for my problem,
> being in relation to Haskell and maybe other languages emitting signals
> that may interfere libssh2 processing (info thanks to Edward Z. Yang):
>
> http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts/Signals
>
> This problem seems to be solved by a very small modification (diff file
> is attached):
>
> 663,664c663,666
> < session->err_code = LIBSSH2_ERROR_TIMEOUT;
> < return LIBSSH2_ERROR_TIMEOUT;
> ---
> > if(errno != EINTR){
> > session->err_code = LIBSSH2_ERROR_TIMEOUT;
> > return LIBSSH2_ERROR_TIMEOUT;
> > }
>
> Pondering the operational semantics of _libssh2_wait_socket() now, with
> the impression that an EINTR usually would be regarded as a transient
> incident, I am asking myself in how far not aborting at EINTR might
> violate the intended behavior in any way.
>
> If there were no objections, an introduction to the code base would be
> great – especially on Windows, where a necessity to compile often means
> a considerable amount of effort.
The above would cause BLOCK_ADJUST to automatically go around when
interrupted. This would make it impossible, for example, to allow a user
to interrupt a long running process with Ctrl-C if the API was in
blocking mode.
Unfortunately, all uses of IO operations must be wrapped in checks which
include a test for EINTR. This allows you to do this:
int cancelled = 0;
void signal_handler() {
cancelled = 1;
}
do {
rc = libssh2_channel_read();
} while (!rc || (rc == LIBSSH2_ERROR_TIMEOUT && !cancelled));
There should be a different return code for EINTR, though.
Matt
-- Matthew Booth, RHCA, RHCSS Red Hat Engineering, Virtualisation Team GPG ID: D33C3490 GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490 _______________________________________________ libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-develReceived on 2012-04-30