From 0d77c1a3aa9927f0bac6ff1b543f883e1d69753e Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Thu, 18 Jun 2009 13:41:48 +0000 Subject: [PATCH] 2009-06-18 Marcus Brinkmann * 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. --- TODO | 14 +++++-------- src/ChangeLog | 9 +++++++++ src/gpgme.h.in | 3 --- src/w32-io.c | 53 +++++++++++++++++++++++++++++++++++++++----------- 4 files changed, 56 insertions(+), 23 deletions(-) diff --git a/TODO b/TODO index d84b295..adbfb93 100644 --- a/TODO +++ b/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. diff --git a/src/ChangeLog b/src/ChangeLog index 95b5f2d..88be268 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,14 @@ 2009-06-18 Marcus Brinkmann + * 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. diff --git a/src/gpgme.h.in b/src/gpgme.h.in index e02a98c..45c1613 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -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. diff --git a/src/w32-io.c b/src/w32-io.c index b6dd6fb..67a02bb 100644 --- a/src/w32-io.c +++ b/src/w32-io.c @@ -389,9 +389,12 @@ find_reader (int fd, int start_it) if (i != reader_table_size) { rd = create_reader (fd_to_handle (fd)); - reader_table[i].fd = fd; - reader_table[i].context = rd; - reader_table[i].used = 1; + if (rd) + { + reader_table[i].fd = fd; + reader_table[i].context = rd; + reader_table[i].used = 1; + } } UNLOCK (reader_table_lock); @@ -692,9 +695,12 @@ find_writer (int fd, int start_it) if (i != writer_table_size) { wt = create_writer (fd_to_handle (fd)); - writer_table[i].fd = fd; - writer_table[i].context = wt; - writer_table[i].used = 1; + if (wt) + { + writer_table[i].fd = fd; + writer_table[i].context = wt; + writer_table[i].used = 1; + } } UNLOCK (writer_table_lock); @@ -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 -- 2.26.2