2005-06-02 Marcus Brinkmann <marcus@g10code.de>
* wait.h (_gpgme_run_io_cb): New prototype. * wait.c (_gpgme_run_io_cb): New function. * wait-global.c (gpgme_wait): Call it. * wait-user.c (_gpgme_user_io_cb_handler): Likewise. * wait-private.c (_gpgme_wait_on_condition): Likewise.
This commit is contained in:
parent
e8ddf895a0
commit
7ccc308330
@ -1,3 +1,11 @@
|
|||||||
|
2005-06-02 Marcus Brinkmann <marcus@g10code.de>
|
||||||
|
|
||||||
|
* wait.h (_gpgme_run_io_cb): New prototype.
|
||||||
|
* wait.c (_gpgme_run_io_cb): New function.
|
||||||
|
* wait-global.c (gpgme_wait): Call it.
|
||||||
|
* wait-user.c (_gpgme_user_io_cb_handler): Likewise.
|
||||||
|
* wait-private.c (_gpgme_wait_on_condition): Likewise.
|
||||||
|
|
||||||
2005-06-02 Werner Koch <wk@g10code.com>
|
2005-06-02 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
* passphrase.c (_gpgme_passphrase_status_handler): Take care of
|
* passphrase.c (_gpgme_passphrase_status_handler): Take care of
|
||||||
|
@ -310,7 +310,7 @@ gpgme_wait (gpgme_ctx_t ctx, gpgme_error_t *status, int hang)
|
|||||||
ictx = item->ctx;
|
ictx = item->ctx;
|
||||||
assert (ictx);
|
assert (ictx);
|
||||||
|
|
||||||
err = item->handler (item->handler_value, fdt.fds[i].fd);
|
err = _gpgme_run_io_cb (&fdt.fds[i], 0);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
/* An error occured. Close all fds in this context,
|
/* An error occured. Close all fds in this context,
|
||||||
|
@ -101,15 +101,11 @@ _gpgme_wait_on_condition (gpgme_ctx_t ctx, volatile int *cond)
|
|||||||
{
|
{
|
||||||
if (ctx->fdt.fds[i].fd != -1 && ctx->fdt.fds[i].signaled)
|
if (ctx->fdt.fds[i].fd != -1 && ctx->fdt.fds[i].signaled)
|
||||||
{
|
{
|
||||||
struct wait_item_s *item;
|
|
||||||
|
|
||||||
ctx->fdt.fds[i].signaled = 0;
|
ctx->fdt.fds[i].signaled = 0;
|
||||||
assert (nr);
|
assert (nr);
|
||||||
nr--;
|
nr--;
|
||||||
|
|
||||||
item = (struct wait_item_s *) ctx->fdt.fds[i].opaque;
|
err = _gpgme_run_io_cb (&ctx->fdt.fds[i], 0);
|
||||||
|
|
||||||
err = item->handler (item->handler_value, ctx->fdt.fds[i].fd);
|
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
/* An error occured. Close all fds in this context,
|
/* An error occured. Close all fds in this context,
|
||||||
|
@ -42,15 +42,12 @@ _gpgme_user_io_cb_handler (void *data, int fd)
|
|||||||
gpgme_error_t err;
|
gpgme_error_t err;
|
||||||
struct tag *tag = (struct tag *) data;
|
struct tag *tag = (struct tag *) data;
|
||||||
gpgme_ctx_t ctx;
|
gpgme_ctx_t ctx;
|
||||||
struct wait_item_s *item;
|
|
||||||
|
|
||||||
assert (data);
|
assert (data);
|
||||||
ctx = tag->ctx;
|
ctx = tag->ctx;
|
||||||
assert (ctx);
|
assert (ctx);
|
||||||
item = (struct wait_item_s *) ctx->fdt.fds[tag->idx].opaque;
|
|
||||||
assert (item);
|
|
||||||
|
|
||||||
err = (*item->handler) (item->handler_value, fd);
|
err = _gpgme_run_io_cb (&ctx->fdt.fds[tag->idx], 0);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
unsigned int idx;
|
unsigned int idx;
|
||||||
|
35
gpgme/wait.c
35
gpgme/wait.c
@ -167,3 +167,38 @@ _gpgme_remove_io_cb (void *data)
|
|||||||
fdt->fds[idx].for_write = 0;
|
fdt->fds[idx].for_write = 0;
|
||||||
fdt->fds[idx].opaque = NULL;
|
fdt->fds[idx].opaque = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* This is slightly embarrassing. The problem is that running an I/O
|
||||||
|
callback _may_ influence the status of other file descriptors. Our
|
||||||
|
own event loops could compensate for that, but the external event
|
||||||
|
loops cannot. FIXME: We may still want to optimize this a bit when
|
||||||
|
we are called from our own event loops. So if CHECKED is 1, the
|
||||||
|
check is skipped. */
|
||||||
|
gpgme_error_t
|
||||||
|
_gpgme_run_io_cb (struct io_select_fd_s *an_fds, int checked)
|
||||||
|
{
|
||||||
|
struct wait_item_s *item;
|
||||||
|
item = (struct wait_item_s *) an_fds->opaque;
|
||||||
|
assert (item);
|
||||||
|
|
||||||
|
if (!checked)
|
||||||
|
{
|
||||||
|
int nr;
|
||||||
|
struct io_select_fd_s fds;
|
||||||
|
|
||||||
|
fds = *an_fds;
|
||||||
|
fds.signaled = 0;
|
||||||
|
/* Just give it a quick poll. */
|
||||||
|
nr = _gpgme_io_select (&fds, 1, 1);
|
||||||
|
assert (nr <= 1);
|
||||||
|
if (nr < 0)
|
||||||
|
return errno;
|
||||||
|
else if (nr == 0)
|
||||||
|
/* The status changed in the meantime, there is nothing left
|
||||||
|
to do. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return item->handler (item->handler_value, an_fds->fd);
|
||||||
|
}
|
||||||
|
@ -77,4 +77,6 @@ void _gpgme_wait_user_event_cb (void *data, gpgme_event_io_t type,
|
|||||||
|
|
||||||
gpgme_error_t _gpgme_wait_one (gpgme_ctx_t ctx);
|
gpgme_error_t _gpgme_wait_one (gpgme_ctx_t ctx);
|
||||||
|
|
||||||
|
gpgme_error_t _gpgme_run_io_cb (struct io_select_fd_s *an_fds, int checked);
|
||||||
|
|
||||||
#endif /* WAIT_H */
|
#endif /* WAIT_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user