2009-06-18 Marcus Brinkmann <marcus@g10code.de>
* gpgme.h.in (GPGME_CONF_PATHNAME): Remove obsolete macro. * w32-io.c (_gpgme_io_pipe): Allocate reader/writer thread right away. (_gpgme_io_read, _gpgme_io_write, _gpgme_io_select) (_gpgme_io_dup): Never allocate threads here. (find_writer, find_reader): Check return value of thread creation function.
This commit is contained in:
parent
3ab899f41c
commit
0d77c1a3aa
14
TODO
14
TODO
@ -8,24 +8,20 @@ Hey Emacs, this is -*- org -*- mode!
|
||||
we block reading the next line with assuan.
|
||||
|
||||
* Before release:
|
||||
** Figure out if _gpgme_io_pipe should pre-create reader/writer and if we
|
||||
then can use !start_it in most invocations. Note that gpgme_io_dup
|
||||
probably should always use !start_it, because currently it will
|
||||
always create reader/writer if they don't exist(!?).
|
||||
** Some gpg tests fail with gpg 1.3.4-cvs (gpg/t-keylist-sig)
|
||||
The test is currently disabled there and in gpg/t-import.
|
||||
** When gpg supports it, write binary subpackets directly,
|
||||
and parse SUBPACKET status lines.
|
||||
** A few months after 1.1.7:
|
||||
Remove GPGME_CONF_PATHNAME macro.
|
||||
|
||||
* ABI's to break:
|
||||
** Implementation: Remove support for old style error codes in
|
||||
conversion.c::_gpgme_map_gnupg_error.
|
||||
** gpgme_edit_cb_t: Add "processed" return argument
|
||||
(see edit.c::command_handler).
|
||||
** I/O and User Data could be made extensible. But this can be done
|
||||
without breaking the ABI hopefully.
|
||||
** All enums that should be enums need to have a maximum value to ensure
|
||||
a certain minimum width for extensibility.
|
||||
** All enums should be replaced by ints and simple macros for
|
||||
maximum compatibility.
|
||||
** Compatibility interfaces that can be removed in future versions:
|
||||
*** gpgme_data_new_from_filepart
|
||||
*** gpgme_data_new_from_file
|
||||
@ -109,7 +105,7 @@ Hey Emacs, this is -*- org -*- mode!
|
||||
the fds unregistered immediately - i think so?)
|
||||
Note that we need support in gpgsm to set include-certs to default
|
||||
as RESET does not reset it.
|
||||
** Optimize the case where a data object has 0an underlying fd we can pass
|
||||
** Optimize the case where a data object has an underlying fd we can pass
|
||||
directly to the engine. This will be automatic with socket I/O and
|
||||
descriptor passing.
|
||||
** Move code common to all engines up from gpg to engine.
|
||||
|
@ -1,5 +1,14 @@
|
||||
2009-06-18 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* gpgme.h.in (GPGME_CONF_PATHNAME): Remove obsolete macro.
|
||||
|
||||
* w32-io.c (_gpgme_io_pipe): Allocate reader/writer thread right
|
||||
away.
|
||||
(_gpgme_io_read, _gpgme_io_write, _gpgme_io_select)
|
||||
(_gpgme_io_dup): Never allocate threads here.
|
||||
(find_writer, find_reader): Check return value of thread creation
|
||||
function.
|
||||
|
||||
* context.h (CTX_OP_DATA_MAGIC): New macro.
|
||||
(struct ctx_op_data): New member MAGIC.
|
||||
* op-support.c (_gpgme_op_data_lookup): Initialize magic.
|
||||
|
@ -1793,9 +1793,6 @@ typedef enum
|
||||
GPGME_CONF_ALIAS_LIST = 37
|
||||
}
|
||||
gpgme_conf_type_t;
|
||||
/* Macro for backward compatibility (even though it was undocumented
|
||||
and marked as experimental in 1.1.6 - will be removed after 1.1.7): */
|
||||
#define GPGME_CONF_PATHNAME GPGME_CONF_FILENAME
|
||||
|
||||
|
||||
/* This represents a single argument for a configuration option.
|
||||
|
41
src/w32-io.c
41
src/w32-io.c
@ -389,10 +389,13 @@ find_reader (int fd, int start_it)
|
||||
if (i != reader_table_size)
|
||||
{
|
||||
rd = create_reader (fd_to_handle (fd));
|
||||
if (rd)
|
||||
{
|
||||
reader_table[i].fd = fd;
|
||||
reader_table[i].context = rd;
|
||||
reader_table[i].used = 1;
|
||||
}
|
||||
}
|
||||
|
||||
UNLOCK (reader_table_lock);
|
||||
return rd;
|
||||
@ -692,10 +695,13 @@ find_writer (int fd, int start_it)
|
||||
if (i != writer_table_size)
|
||||
{
|
||||
wt = create_writer (fd_to_handle (fd));
|
||||
if (wt)
|
||||
{
|
||||
writer_table[i].fd = fd;
|
||||
writer_table[i].context = wt;
|
||||
writer_table[i].used = 1;
|
||||
}
|
||||
}
|
||||
|
||||
UNLOCK (writer_table_lock);
|
||||
return wt;
|
||||
@ -733,7 +739,7 @@ _gpgme_io_write (int fd, const void *buffer, size_t count)
|
||||
if (count == 0)
|
||||
return TRACE_SYSRES (0);
|
||||
|
||||
ctx = find_writer (fd, 1);
|
||||
ctx = find_writer (fd, 0);
|
||||
if (!ctx)
|
||||
return TRACE_SYSRES (-1);
|
||||
|
||||
@ -826,6 +832,7 @@ _gpgme_io_pipe (int filedes[2], int inherit_idx)
|
||||
/* Make one end inheritable. */
|
||||
if (inherit_idx == 0)
|
||||
{
|
||||
struct writer_context_s *ctx;
|
||||
HANDLE hd;
|
||||
if (!DuplicateHandle (GetCurrentProcess(), rh,
|
||||
GetCurrentProcess(), &hd, 0,
|
||||
@ -841,6 +848,18 @@ _gpgme_io_pipe (int filedes[2], int inherit_idx)
|
||||
}
|
||||
CloseHandle (rh);
|
||||
rh = hd;
|
||||
|
||||
ctx = find_writer (handle_to_fd (wh), 0);
|
||||
assert (ctx == NULL);
|
||||
ctx = find_writer (handle_to_fd (wh), 1);
|
||||
if (!ctx)
|
||||
{
|
||||
CloseHandle (rh);
|
||||
CloseHandle (wh);
|
||||
/* FIXME: Should translate the error code. */
|
||||
errno = EIO;
|
||||
return TRACE_SYSRES (-1);
|
||||
}
|
||||
}
|
||||
else if (inherit_idx == 1)
|
||||
{
|
||||
@ -859,6 +878,18 @@ _gpgme_io_pipe (int filedes[2], int inherit_idx)
|
||||
}
|
||||
CloseHandle (wh);
|
||||
wh = hd;
|
||||
|
||||
ctx = find_reader (handle_to_fd (rh), 0);
|
||||
assert (ctx == NULL);
|
||||
ctx = find_reader (handle_to_fd (rh), 1);
|
||||
if (!ctx)
|
||||
{
|
||||
CloseHandle (rh);
|
||||
CloseHandle (wh);
|
||||
/* FIXME: Should translate the error code. */
|
||||
errno = EIO;
|
||||
return TRACE_SYSRES (-1);
|
||||
}
|
||||
}
|
||||
|
||||
filedes[0] = handle_to_fd (rh);
|
||||
@ -1248,7 +1279,7 @@ _gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock)
|
||||
{
|
||||
if (fds[i].for_read)
|
||||
{
|
||||
struct reader_context_s *ctx = find_reader (fds[i].fd,1);
|
||||
struct reader_context_s *ctx = find_reader (fds[i].fd,0);
|
||||
|
||||
if (!ctx)
|
||||
TRACE_LOG1 ("error: no reader for FD 0x%x (ignored)",
|
||||
@ -1271,7 +1302,7 @@ _gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock)
|
||||
}
|
||||
else if (fds[i].for_write)
|
||||
{
|
||||
struct writer_context_s *ctx = find_writer (fds[i].fd,1);
|
||||
struct writer_context_s *ctx = find_writer (fds[i].fd,0);
|
||||
|
||||
if (!ctx)
|
||||
TRACE_LOG1 ("error: no writer for FD 0x%x (ignored)",
|
||||
@ -1417,7 +1448,7 @@ _gpgme_io_dup (int fd)
|
||||
return TRACE_SYSRES (-1);
|
||||
}
|
||||
|
||||
rd_ctx = find_reader (fd, 1);
|
||||
rd_ctx = find_reader (fd, 0);
|
||||
if (rd_ctx)
|
||||
{
|
||||
/* No need for locking, as the only races are against the reader
|
||||
@ -1436,7 +1467,7 @@ _gpgme_io_dup (int fd)
|
||||
UNLOCK (reader_table_lock);
|
||||
}
|
||||
|
||||
wt_ctx = find_writer (fd, 1);
|
||||
wt_ctx = find_writer (fd, 0);
|
||||
if (wt_ctx)
|
||||
{
|
||||
/* No need for locking, as the only races are against the writer
|
||||
|
Loading…
Reference in New Issue
Block a user