From 2fe9117639b81b2e5bfec12b0a3ecb994df01d49 Mon Sep 17 00:00:00 2001 From: Mike Black W9MDB Date: Sun, 26 Dec 2021 22:24:09 -0600 Subject: [PATCH] Disable async processing and move async definitions out of hamlib_port_t This broke backwards compatibility with DLL/shared libraries --- include/hamlib/rig.h | 8 +++-- src/iofunc.c | 72 +++++++++++++++++++++++++++++++++++++++----- src/iofunc.h | 2 ++ src/rig.c | 16 ++++++---- 4 files changed, 83 insertions(+), 15 deletions(-) diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index f4798396c..ffed7f159 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2211,13 +2211,16 @@ typedef struct hamlib_port { int client_port; /*!< client socket port for tcp connection */ RIG *rig; /*!< our parent RIG device */ +} hamlib_port_t; +//! @endcond + +typedef struct hamlib_async { int async; /*!< enable asynchronous data handling if true */ int fd_sync_write; /*!< file descriptor for writing synchronous data */ int fd_sync_read; /*!< file descriptor for reading synchronous data */ int fd_sync_error_write; /*!< file descriptor for writing synchronous data error codes */ int fd_sync_error_read; /*!< file descriptor for reading synchronous data error codes */ -} hamlib_port_t; -//! @endcond +} hamlib_async_t; #if !defined(__APPLE__) || !defined(__cplusplus) typedef hamlib_port_t port_t; @@ -2431,6 +2434,7 @@ struct rig_state { void *async_data_handler_priv_data; volatile int poll_routine_thread_run; void *poll_routine_priv_data; + hamlib_async_t asyncport; }; //! @cond Doxygen_Suppress diff --git a/src/iofunc.c b/src/iofunc.c index 9e105c34d..58db32705 100644 --- a/src/iofunc.c +++ b/src/iofunc.c @@ -56,7 +56,8 @@ #include "cm108.h" #include "gpio.h" -static void close_sync_data_pipe(hamlib_port_t *p) +#ifdef ASYNC_BUG +static void close_sync_data_pipe(hamlib_async_t *p) { if (p->fd_sync_read != -1) { close(p->fd_sync_read); @@ -77,6 +78,7 @@ static void close_sync_data_pipe(hamlib_port_t *p) p->fd_sync_error_write = -1; } } +#endif /** * \brief Open a hamlib_port based on its rig port type @@ -87,16 +89,19 @@ int HAMLIB_API port_open(hamlib_port_t *p) { int status; int want_state_delay = 0; +#ifdef ASYNC_BUG int sync_pipe_fds[2]; +#endif ENTERFUNC; p->fd = -1; - p->fd_sync_write = -1; - p->fd_sync_read = -1; - p->fd_sync_error_write = -1; - p->fd_sync_error_read = -1; + //p->fd_sync_write = -1; + //p->fd_sync_read = -1; + //p->fd_sync_error_write = -1; + //p->fd_sync_error_read = -1; +#if 0 if (p->async) { #ifdef HAVE_WINDOWS_H @@ -159,6 +164,7 @@ int HAMLIB_API port_open(hamlib_port_t *p) rig_debug(RIG_DEBUG_VERBOSE, "%s: created synchronous data pipe\n", __func__); } +#endif switch (p->type.rig) { @@ -169,7 +175,9 @@ int HAMLIB_API port_open(hamlib_port_t *p) { rig_debug(RIG_DEBUG_ERR, "%s: serial_open(%s) status=%d, err=%s\n", __func__, p->pathname, status, strerror(errno)); +#ifdef ASYNC_BUG close_sync_data_pipe(p); +#endif RETURNFUNC(status); } @@ -184,7 +192,9 @@ int HAMLIB_API port_open(hamlib_port_t *p) if (status != 0) { rig_debug(RIG_DEBUG_ERR, "%s: set_rts status=%d\n", __func__, status); +#ifdef ASYNC_BUG close_sync_data_pipe(p); +#endif RETURNFUNC(status); } @@ -198,7 +208,9 @@ int HAMLIB_API port_open(hamlib_port_t *p) if (status != 0) { rig_debug(RIG_DEBUG_ERR, "%s: set_dtr status=%d\n", __func__, status); +#ifdef ASYNC_BUG close_sync_data_pipe(p); +#endif RETURNFUNC(status); } @@ -218,7 +230,9 @@ int HAMLIB_API port_open(hamlib_port_t *p) if (status < 0) { +#ifdef ASYNC_BUG close_sync_data_pipe(p); +#endif RETURNFUNC(status); } @@ -229,7 +243,9 @@ int HAMLIB_API port_open(hamlib_port_t *p) if (status < 0) { +#ifdef ASYNC_BUG close_sync_data_pipe(p); +#endif RETURNFUNC(status); } @@ -240,7 +256,9 @@ int HAMLIB_API port_open(hamlib_port_t *p) if (status < 0) { +#ifdef ASYNC_BUG close_sync_data_pipe(p); +#endif RETURNFUNC(-RIG_EIO); } @@ -254,7 +272,9 @@ int HAMLIB_API port_open(hamlib_port_t *p) if (status < 0) { +#ifdef ASYNC_BUG close_sync_data_pipe(p); +#endif RETURNFUNC(status); } @@ -272,14 +292,18 @@ int HAMLIB_API port_open(hamlib_port_t *p) if (status < 0) { +#ifdef ASYNC_BUG close_sync_data_pipe(p); +#endif RETURNFUNC(status); } break; default: +#ifdef ASYNC_BUG close_sync_data_pipe(p); +#endif RETURNFUNC(-RIG_EINVAL); } @@ -331,7 +355,9 @@ int HAMLIB_API port_close(hamlib_port_t *p, rig_port_t port_type) p->fd = -1; } +#ifdef ASYNC_BUG close_sync_data_pipe(p); +#endif RETURNFUNC(ret); } @@ -473,7 +499,11 @@ static int port_select(hamlib_port_t *p, static ssize_t port_read_generic(hamlib_port_t *p, void *buf, size_t count, int direct) { +#ifdef ASYNC_BUG int fd = direct ? p->fd : p->fd_sync_read; +#else + int fd = p->fd; +#endif if (p->type.rig == RIG_PORT_SERIAL && p->parm.serial.data_bits == 7) { @@ -629,7 +659,8 @@ int HAMLIB_API write_block(hamlib_port_t *p, const unsigned char *txbuffer, size return RIG_OK; } -int HAMLIB_API write_block_sync(hamlib_port_t *p, const unsigned char *txbuffer, size_t count) +#ifdef ASYNC_BUG +int HAMLIB_API write_block_sync(async_port_t *p, const unsigned char *txbuffer, size_t count) { if (!p->async) { @@ -639,7 +670,7 @@ int HAMLIB_API write_block_sync(hamlib_port_t *p, const unsigned char *txbuffer, return (int) write(p->fd_sync_write, txbuffer, count); } -int HAMLIB_API write_block_sync_error(hamlib_port_t *p, const unsigned char *txbuffer, size_t count) +int HAMLIB_API write_block_sync_error(async_port_t *p, const unsigned char *txbuffer, size_t count) { if (!p->async) { @@ -648,6 +679,7 @@ int HAMLIB_API write_block_sync_error(hamlib_port_t *p, const unsigned char *txb return (int) write(p->fd_sync_error_write, txbuffer, count); } +#endif static int read_block_generic(hamlib_port_t *p, unsigned char *rxbuffer, size_t count, int direct) { @@ -658,12 +690,20 @@ static int read_block_generic(hamlib_port_t *p, unsigned char *rxbuffer, size_t rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); +#ifdef ASYNC_BUG if (!p->async && !direct) +#else + if (!direct) +#endif { return -RIG_EINTERNAL; } +#ifdef ASYNC_GBUG fd = direct ? p->fd : p->fd_sync_read; +#else + fd = p->fd; +#endif /* * Wait up to timeout ms. @@ -772,7 +812,11 @@ static int read_block_generic(hamlib_port_t *p, unsigned char *rxbuffer, size_t int HAMLIB_API read_block(hamlib_port_t *p, unsigned char *rxbuffer, size_t count) { +#ifdef ASYNC_BUG return read_block_generic(p, rxbuffer, count, !p->async); +#else + return read_block_generic(p, rxbuffer, count, 1); +#endif } /** @@ -851,7 +895,11 @@ static int read_string_generic(hamlib_port_t *p, int i = 0; static int minlen = 1; // dynamic minimum length of rig response data +#ifdef ASYNC_BUG if (!p->async && !direct) +#else + if (!direct) +#endif { return -RIG_EINTERNAL; } @@ -871,9 +919,15 @@ static int read_string_generic(hamlib_port_t *p, return 0; } +#if ASYNC_BUG fd = direct ? p->fd : p->fd_sync_read; errorfd = direct ? -1 : p->fd_sync_error_read; maxfd = (fd > errorfd) ? fd : errorfd; +#else + fd = p->fd; + errorfd = -1; + maxfd = (fd > errorfd) ? fd : errorfd; +#endif /* * Wait up to timeout ms. @@ -1074,7 +1128,11 @@ int HAMLIB_API read_string(hamlib_port_t *p, int flush_flag, int expected_len) { +#ifdef ASYNC_BUG return read_string_generic(p, rxbuffer, rxmax, stopset, stopset_len, flush_flag, expected_len, !p->async); +#else + return read_string_generic(p, rxbuffer, rxmax, stopset, stopset_len, flush_flag, expected_len, 1); +#endif } diff --git a/src/iofunc.h b/src/iofunc.h index 77b9df5b5..332b073fe 100644 --- a/src/iofunc.h +++ b/src/iofunc.h @@ -41,6 +41,7 @@ extern HAMLIB_EXPORT(int) write_block(hamlib_port_t *p, const unsigned char *txbuffer, size_t count); +#ifdef ASYNC_BUG extern HAMLIB_EXPORT(int) write_block_sync(hamlib_port_t *p, const unsigned char *txbuffer, size_t count); @@ -48,6 +49,7 @@ extern HAMLIB_EXPORT(int) write_block_sync(hamlib_port_t *p, extern HAMLIB_EXPORT(int) write_block_sync_error(hamlib_port_t *p, const unsigned char *txbuffer, size_t count); +#endif extern HAMLIB_EXPORT(int) read_string(hamlib_port_t *p, unsigned char *rxbuffer, diff --git a/src/rig.c b/src/rig.c index 9cf87c027..304d565ae 100644 --- a/src/rig.c +++ b/src/rig.c @@ -436,14 +436,14 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) rs->comm_state = 0; rs->rigport.type.rig = caps->port_type; /* default from caps */ #ifdef HAVE_PTHREAD - rs->rigport.async = caps->async_data_supported; + rs->asyncport.async = caps->async_data_supported; #else rs->rigport.async = 0; #endif - rs->rigport.fd_sync_write = -1; - rs->rigport.fd_sync_read = -1; - rs->rigport.fd_sync_error_write = -1; - rs->rigport.fd_sync_error_read = -1; + rs->asyncport.fd_sync_write = -1; + rs->asyncport.fd_sync_read = -1; + rs->asyncport.fd_sync_error_write = -1; + rs->asyncport.fd_sync_error_read = -1; switch (caps->port_type) { @@ -6903,11 +6903,13 @@ static int async_data_handler_stop(RIG *rig) void *async_data_handler(void *arg) { +#ifdef ASYNC_BUG struct async_data_handler_args_s *args = (struct async_data_handler_args_s *)arg; - unsigned char frame[MAX_FRAME_LENGTH]; RIG *rig = args->rig; + unsigned char frame[MAX_FRAME_LENGTH]; struct rig_state *rs = &rig->state; int result; +#endif rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Starting async data handler thread\n", __FILE__, __LINE__); @@ -6916,6 +6918,7 @@ void *async_data_handler(void *arg) // TODO: add initial support for async in Kenwood kenwood_transaction (+one) functions -> add transaction_active flag usage // TODO: add initial support for async in Yaesu newcat_get_cmd/set_cmd (+validate) functions -> add transaction_active flag usage +#ifdef ASYNC_BUG while (rs->async_data_handler_thread_run) { int frame_length; @@ -6967,6 +6970,7 @@ void *async_data_handler(void *arg) } } } +#endif rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Stopping async data handler thread\n", __FILE__, __LINE__);