From 62a6638eb544f2c3d9022bcb34cae181aa8f7aae Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sun, 3 May 2009 09:51:01 +0000 Subject: Added I/O queue checks to the channels, added notes in the readme, improved the FullDuplexDriver. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@940 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- src/include/channels.h | 34 ++++++++++++++++++++++++++++++++++ src/include/serial.h | 18 ++++++++++++++++++ 2 files changed, 52 insertions(+) (limited to 'src/include') diff --git a/src/include/channels.h b/src/include/channels.h index d3d1f5d47..2ff20b1ad 100644 --- a/src/include/channels.h +++ b/src/include/channels.h @@ -31,6 +31,16 @@ * @brief @p BaseChannel specific methods. */ struct _base_channel_methods { + /** + * @brief Channel output check. + * @see chIOPutWouldBlock() + */ + bool_t (*putwouldblock)(void *instance); + /** + * @brief Channel input check. + * @see chIOGetWouldBlock() + */ + bool_t (*getwouldblock)(void *instance); /** * @brief Channel put method with timeout specification. * @see chIOPut() @@ -76,6 +86,30 @@ typedef struct { struct _base_channel_data d0; } BaseChannel; +/** + * @brief Channel output check. + * @details This function verifies if a subsequent @p chIOPut() would block. + * + * @param[in] ip pointer to a @p BaseChannel or derived class + * @return The output queue status: + * @retval FALSE if the output queue has space and would not block a write + * operation. + * @retval TRUE if the output queue is full and would block a write operation. + */ +#define chIOPutWouldBlock(ip) ((ip)->vmt->m0.putwouldblock(ip)) + +/** + * @brief Channel input check. + * @details This function verifies if a subsequent @p chIOGett() would block. + * + * @param[in] ip pointer to a @p BaseChannel or derived class + * @return The input queue status: + * @retval FALSE if the input queue contains data and would not block a read + * operation. + * @retval TRUE if the input queue is empty and would block a read operation. + */ +#define chIOGetWouldBlock(ip) ((ip)->vmt->m0.getwouldblock(ip)) + /** * @brief Channel blocking byte write. * @details This function writes a byte value to a channel. If the channel diff --git a/src/include/serial.h b/src/include/serial.h index 9bb6c4f92..08ddf61fe 100644 --- a/src/include/serial.h +++ b/src/include/serial.h @@ -136,6 +136,24 @@ extern "C" { } #endif +/** + * @brief Direct output check on a @p FullDuplexDriver. + * @details This function bypasses the indirect access to the channel and + * checks directly the output queue. This is faster but cannot + * be used to check different channels implementations. + * @see chIOPutWouldBlock() + */ +#define chFDDPutWouldBlock(sd) chOQIsFull(&(sd)->d2.oqueue) + +/** + * @brief Direct input check on a @p FullDuplexDriver. + * @details This function bypasses the indirect access to the channel and + * checks directly the input queue. This is faster but cannot + * be used to check different channels implementations. + * @see chIOGetWouldBlock() + */ +#define chFDDGetWouldBlock(sd) chIQIsEmpty(&(sd)->d2.iqueue) + /** * @brief Direct blocking write to a @p FullDuplexDriver. * @details This function bypasses the indirect access to the channel and -- cgit v1.2.3