From 15e6d5a6459a2fb0bec3fb6fdf0a8e510f2df9ec Mon Sep 17 00:00:00 2001 From: Charl Wentzel Date: Wed, 29 Nov 2017 12:51:29 +0200 Subject: [PATCH] Important Update: - SelectableCore: - Simplify Handle AutoManage logic - Bug fix: AutoManage fail to open (WaitingToOpen) if no data written --- SelectableCore.cpp | 66 ++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/SelectableCore.cpp b/SelectableCore.cpp index 2dcb328..521bf37 100644 --- a/SelectableCore.cpp +++ b/SelectableCore.cpp @@ -1245,23 +1245,19 @@ bool CSelectableCore::Write( THandle * Handle ) if ((Handle->State == csNone) || (Handle->State == csFailed) || (Handle->State == csClosed)) { // May it be opened? - if (Handle && Handle->AutoManage) - { - // Check duration since last PortIn - if (Timeout( Handle->ReopenStart, Handle->ReopenDelay )) - { - // Complete opening process - if (Open( Handle ) == -1) { - // Reset Timer - SetStartTime( &(Handle->ReopenStart) ); - } - } - } - else + if (!Handle->AutoManage) { // Must be opened manually return false; } + else if (Timeout( Handle->ReopenStart, Handle->ReopenDelay )) + { + // Complete opening process + if (Open( Handle ) == -1) { + // Reset Timer + SetStartTime( &(Handle->ReopenStart) ); + } + } } // Log Ready for Write Event @@ -1497,33 +1493,29 @@ int CSelectableCore::InputHandle( THandle * Handle, const char * Data, int Len ) if (Log) Log->Message( LogLevel, dlHigh, "%s: Handle '%s' - Input rejected, Handle not Open (not auto-managed)", Name, Handle->Name ); return 0; } - else + else if (Timeout( Handle->ReopenStart, Handle->ReopenDelay )) { - // Check duration since last PortIn - if (Timeout( Handle->ReopenStart, Handle->ReopenDelay )) - { - // Complete opening process - if (Open( Handle ) == -1) { - // Reset Timer - SetStartTime( &(Handle->ReopenStart) ); - } - - // Check if Handle is open - if (Handle->State == csWaitingtoOpen) { - if (Log) Log->Message( LogLevel, dlHigh, "%s: Handle '%s' - Input rejected, Waiting to open (auto-managed) Handle", Name, Handle->Name ); - return 0; - } - else if (Handle->State != csOpen) { - if (Log) Log->Message( LogLevel, dlHigh, "%s: Handle '%s' - Input rejected, (auto-managed) Handle failed to Open", Name, Handle->Name ); - return 0; - } + // Complete opening process + if (Open( Handle ) == -1) { + // Reset Timer + SetStartTime( &(Handle->ReopenStart) ); } - else - { - if (Log) Log->Message( LogLevel, dlHigh, "%s: Handle '%s' - Input rejected, Retry (auto-managed) Handle re-open in %d ms", Name, Handle->Name, - TimeLeft( Handle->ReopenStart, Handle->ReopenDelay) ); + + // Check if Handle is open + if (Handle->State == csWaitingtoOpen) { + if (Log) Log->Message( LogLevel, dlHigh, "%s: Handle '%s' - Input rejected, Waiting to open (auto-managed) Handle", Name, Handle->Name ); return 0; } + else if (Handle->State != csOpen) { + if (Log) Log->Message( LogLevel, dlHigh, "%s: Handle '%s' - Input rejected, (auto-managed) Handle failed to Open", Name, Handle->Name ); + return 0; + } + } + else + { + if (Log) Log->Message( LogLevel, dlHigh, "%s: Handle '%s' - Input rejected, Retry (auto-managed) Handle re-open in %d ms", Name, Handle->Name, + TimeLeft( Handle->ReopenStart, Handle->ReopenDelay) ); + return 0; } } @@ -1604,7 +1596,7 @@ bool CSelectableCore::Process() while (Handle) { // Auto manage handles - if (Handle->AutoManage && Handle->Persistent && ((Handle->State == csNone) || (Handle->State == csFailed) || (Handle->State == csClosed))) + if ((Handle->State != csOpen) && Handle->AutoManage && Handle->Persistent) { // Check duration since last PortIn if (Timeout( Handle->ReopenStart, Handle->ReopenDelay ))