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>
|
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.
|
* keylist.c (gpgme_op_keylist_next): Return error if OPD is NULL.
|
||||||
|
|
||||||
2006-09-25 Marcus Brinkmann <marcus@g10code.de>
|
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. */
|
/* Now some contexts might have finished successfully. */
|
||||||
LOCK (ctx_list_lock);
|
LOCK (ctx_list_lock);
|
||||||
|
retry:
|
||||||
for (li = ctx_active_list; li; li = li->next)
|
for (li = ctx_active_list; li; li = li->next)
|
||||||
{
|
{
|
||||||
gpgme_ctx_t actx = li->ctx;
|
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)
|
if (i == actx->fdt.size)
|
||||||
{
|
{
|
||||||
gpgme_error_t err = 0;
|
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);
|
_gpgme_engine_io_event (actx->engine, GPGME_EVENT_DONE, &err);
|
||||||
|
LOCK (ctx_list_lock);
|
||||||
|
goto retry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UNLOCK (ctx_list_lock);
|
UNLOCK (ctx_list_lock);
|
||||||
|
Loading…
Reference in New Issue
Block a user