2006-10-23 Marcus Brinkmann <marcus@g10code.de>
* wait-global.c (gpgme_wait): Unlock CTX_LIST_LOCK while calling _gpgme_engine_io_event().
This commit is contained in:
parent
aeef0402a7
commit
ebb8edbb30
@ -1,5 +1,8 @@
|
||||
2006-10-23 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* wait-global.c (gpgme_wait): Unlock CTX_LIST_LOCK while calling
|
||||
_gpgme_engine_io_event().
|
||||
|
||||
* keylist.c (gpgme_op_keylist_next): Return error if OPD is NULL.
|
||||
|
||||
2006-09-25 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
@ -334,6 +334,7 @@ gpgme_wait (gpgme_ctx_t ctx, gpgme_error_t *status, int hang)
|
||||
|
||||
/* Now some contexts might have finished successfully. */
|
||||
LOCK (ctx_list_lock);
|
||||
retry:
|
||||
for (li = ctx_active_list; li; li = li->next)
|
||||
{
|
||||
gpgme_ctx_t actx = li->ctx;
|
||||
@ -344,7 +345,19 @@ gpgme_wait (gpgme_ctx_t ctx, gpgme_error_t *status, int hang)
|
||||
if (i == actx->fdt.size)
|
||||
{
|
||||
gpgme_error_t err = 0;
|
||||
|
||||
/* FIXME: This does not perform too well. We have to
|
||||
release the lock because the I/O event handler
|
||||
acquires it to remove the context from the active
|
||||
list. Two alternative strategies are worth
|
||||
considering: Either implement the DONE event handler
|
||||
here in a lock-free manner, or save a list of all
|
||||
contexts to be released and call the DONE events
|
||||
afterwards. */
|
||||
UNLOCK (ctx_list_lock);
|
||||
_gpgme_engine_io_event (actx->engine, GPGME_EVENT_DONE, &err);
|
||||
LOCK (ctx_list_lock);
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
UNLOCK (ctx_list_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user