From 6bbbad60f26b977fee2dcb77e415d0b26f33965d Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 1 Feb 2001 09:25:56 +0000 Subject: [PATCH] Possible fix for NT and segv fix. --- gpgme/ChangeLog | 10 +++++++++- gpgme/rungpg.c | 9 +++++---- gpgme/w32-io.c | 17 +++++++++++------ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index 458b3c97..6b63ca21 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,6 +1,14 @@ +2001-02-01 Werner Koch + + * w32-io.c (set_synchronize): Add EVENT_MODIFY_STATE. Add Debug + code to all Set/ResetEvent(). + + * rungpg.c (read_status): Check for end of stream only if we have + an r. By Timo. + 2001-01-31 Werner Koch - * wait.c (_gpgme_wait_on_condition): Remove all exit code processing. + * wait.c (_gpgme_wait_on_condition): Removed all exit code processing. (propagate_term_results,clear_active_fds): Removed. (count_active_fds): Renamed to .. (count_active_and_thawed_fds): .. this and count only thawed fds. diff --git a/gpgme/rungpg.c b/gpgme/rungpg.c index 5250b565..36b6f799 100644 --- a/gpgme/rungpg.c +++ b/gpgme/rungpg.c @@ -1016,10 +1016,11 @@ read_status ( GpgObject gpg ) gpg->status.fnc ( gpg->status.fnc_value, r->code, rest); } - } - if ( r->code == STATUS_END_STREAM ) { - if ( gpg->cmd.used ) - _gpgme_freeze_fd ( gpg->cmd.fd ); + + if ( r->code == STATUS_END_STREAM ) { + if ( gpg->cmd.used ) + _gpgme_freeze_fd ( gpg->cmd.fd ); + } } } /* To reuse the buffer for the next line we have to diff --git a/gpgme/w32-io.c b/gpgme/w32-io.c index 82e8f819..f0d31a0f 100644 --- a/gpgme/w32-io.c +++ b/gpgme/w32-io.c @@ -87,7 +87,7 @@ set_synchronize (HANDLE h) * way to do it is by duplicating the handle. Tsss.. */ if (!DuplicateHandle( GetCurrentProcess(), h, GetCurrentProcess(), &tmp, - SYNCHRONIZE, FALSE, 0 ) ) { + EVENT_MODIFY_STATE|SYNCHRONIZE, FALSE, 0 ) ) { DEBUG1 ("** Set SYNCRONIZE failed: ec=%d\n", (int)GetLastError()); } else { @@ -112,7 +112,8 @@ reader (void *arg) /* leave a one byte gap so that we can see wheter it is empty or full*/ if ((c->writepos + 1) % READBUF_SIZE == c->readpos) { /* wait for space */ - ResetEvent (c->have_space_ev); + if (!ResetEvent (c->have_space_ev) ) + DEBUG1 ("ResetEvent failed: ec=%d", (int)GetLastError ()); UNLOCK (c->mutex); DEBUG1 ("reader thread %p: waiting for space ...", c->thread_hd ); WaitForSingleObject (c->have_space_ev, INFINITE); @@ -149,11 +150,13 @@ reader (void *arg) LOCK (c->mutex); c->writepos = (c->writepos + nread) % READBUF_SIZE; - SetEvent (c->have_data_ev); + if ( !SetEvent (c->have_data_ev) ) + DEBUG1 ("SetEvent failed: ec=%d", (int)GetLastError ()); UNLOCK (c->mutex); } /* indicate that we have an error or eof */ - SetEvent (c->have_data_ev); + if ( !SetEvent (c->have_data_ev) ) + DEBUG1 ("SetEvent failed: ec=%d", (int)GetLastError ()); DEBUG1 ("reader thread %p ended", c->thread_hd ); return 0; @@ -288,9 +291,11 @@ _gpgme_io_read ( int fd, void *buffer, size_t count ) memcpy (buffer, c->buffer+c->readpos, nread); c->readpos = (c->readpos + nread) % READBUF_SIZE; if (c->readpos == c->writepos && !c->eof) { - ResetEvent (c->have_data_ev); + if ( !ResetEvent (c->have_data_ev) ) + DEBUG1 ("ResetEvent failed: ec=%d", (int)GetLastError ()); } - SetEvent (c->have_space_ev); + if (!SetEvent (c->have_space_ev)) + DEBUG1 ("SetEvent failed: ec=%d", (int)GetLastError ()); UNLOCK (c->mutex); DEBUG2 ("fd %d: got %d bytes\n", fd, nread );