Important Update:

- SelectableCore:
  - Bug fix: correct ConnectTypeNames
  - Pass handle reference to Select when adding file discriptor.
  - Rename Select vars Handle -> SelectHandle
  - Show type and name of handle on Select logs
This commit is contained in:
Charl Wentzel
2018-11-04 17:31:12 +02:00
parent 12a8ddb7ba
commit d18e046e57
3 changed files with 59 additions and 44 deletions

View File

@@ -84,51 +84,61 @@ void CSelect::Clear()
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Add Select File Descriptor // Add Select File Descriptor
void CSelect::Add( int FD, bool Read, bool Write, CSelectableCore * Function ) void CSelect::Add( int FD, bool Read, bool Write, THandle * Handle, CSelectableCore * Function )
{ {
TSelectHandle ** Handle = NULL; TSelectHandle ** SelectHandle = NULL;
// Check if Handle already exists // Check if SelectHandle already exists
Handle = &FirstHandle; SelectHandle = &FirstHandle;
while (*Handle && ((*Handle)->FD != FD)) { while (*SelectHandle && ((*SelectHandle)->FD != FD)) {
Handle = &((*Handle)->Next); SelectHandle = &((*SelectHandle)->Next);
} }
if (!*Handle) { if (!*SelectHandle) {
// Create if not exist // Create if not exist
*Handle = (TSelectHandle*)malloc( sizeof(TSelectHandle) ); *SelectHandle = (TSelectHandle*)malloc( sizeof(TSelectHandle) );
memset( *Handle, 0, sizeof(TSelectHandle) ); memset( *SelectHandle, 0, sizeof(TSelectHandle) );
// Set Parameters // Set Parameters
(*Handle)->FD = FD; (*SelectHandle)->FD = FD;
(*Handle)->Function = Function; (*SelectHandle)->Handle = Handle;
(*SelectHandle)->Function = Function;
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Created", FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
} }
else if ((*Handle)->Function != Function) { else if ((*SelectHandle)->Function != Function) {
// Old handle for another function, not yet removed, remove from read/write lists // Old handle for another function, not yet removed, remove from read/write lists
Remove( FD, true, true ); Remove( FD, true, true );
// Overwrite Parameters // Overwrite Parameters
(*Handle)->Function = Function; (*SelectHandle)->Handle = Handle;
(*SelectHandle)->Function = Function;
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Re-used", FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
} }
// Add Read select // Add Read select
if (Read && !(*Handle)->Read) { if (Read && !(*SelectHandle)->Read) {
(*Handle)->Read = true; (*SelectHandle)->Read = true;
FD_SET( FD, &ReadTestFDS ); FD_SET( FD, &ReadTestFDS );
// Log event // Log event
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d] - Add Read", FD ); if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Add Read", FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
} }
// Add Write Select // Add Write Select
if (Write && !(*Handle)->Write) { if (Write && !(*SelectHandle)->Write) {
(*Handle)->Write = true; (*SelectHandle)->Write = true;
FD_SET( FD, &WriteTestFDS ); FD_SET( FD, &WriteTestFDS );
// Log event // Log event
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d] - Add Write", FD ); if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Add Write", FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
} }
// Check Maximum File Handle // Check Maximum File SelectHandle
if (MaxFD <= FD) if (MaxFD <= FD)
MaxFD = FD+1; MaxFD = FD+1;
} }
@@ -136,33 +146,37 @@ void CSelect::Add( int FD, bool Read, bool Write, CSelectableCore * Function )
void CSelect::Remove( int FD, bool Read, bool Write ) void CSelect::Remove( int FD, bool Read, bool Write )
{ {
TSelectHandle ** Handle = NULL; TSelectHandle ** SelectHandle = NULL;
THandle * Handle = NULL;
// Check if Handle already exists // Check if SelectHandle already exists
Handle = &FirstHandle; SelectHandle = &FirstHandle;
while (*Handle && ((*Handle)->FD != FD)) { while (*SelectHandle && ((*SelectHandle)->FD != FD)) {
Handle = &((*Handle)->Next); SelectHandle = &((*SelectHandle)->Next);
} }
// Check if found // Check if found
if (!*Handle) if (!*SelectHandle)
return; return;
Handle = (*SelectHandle)->Handle;
// Remove from set for select read check // Remove from set for select read check
if (Read && (*Handle)->Read) { if (Read && (*SelectHandle)->Read) {
(*Handle)->Read = false; (*SelectHandle)->Read = false;
FD_CLR( FD, &ReadTestFDS); FD_CLR( FD, &ReadTestFDS);
// Log event // Log event
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d] - Remove Read", FD ); if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Remove Read", FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
} }
// Remove from set for select write check // Remove from set for select write check
if (Write && (*Handle)->Write) { if (Write && (*SelectHandle)->Write) {
(*Handle)->Write = false; (*SelectHandle)->Write = false;
FD_CLR( FD, &WriteTestFDS); FD_CLR( FD, &WriteTestFDS);
// Log event // Log event
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d] - Remove Write", FD ); if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Remove Write", FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
} }
// Handle will be removed in Test() if both Read & Write flags are false // Handle will be removed in Test() if both Read & Write flags are false
} }

View File

@@ -582,7 +582,7 @@ int CSelectableCore::OpenSerialPort( THandle * Handle )
// Add to Select Lists // Add to Select Lists
if (Selector) { if (Selector) {
Selector->Add( Handle->FD, true, false, this ); Selector->Add( Handle->FD, true, false, Handle, this );
} }
// Set state // Set state
@@ -622,7 +622,7 @@ int CSelectableCore::OpenLinePrinterPort( THandle * Handle )
// Add to Select Lists // Add to Select Lists
if (Selector) { if (Selector) {
Selector->Add( Handle->FD, true, false, this ); Selector->Add( Handle->FD, true, false, Handle, this );
} }
// Set state // Set state
@@ -718,7 +718,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle )
// Add to Select Lists // Add to Select Lists
if (Selector) { if (Selector) {
Selector->Add( Handle->FD, false, true, this ); Selector->Add( Handle->FD, false, true, Handle, this );
} }
// Set state // Set state
@@ -910,7 +910,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle, bool DelayResolve )
// Add to Select Lists // Add to Select Lists
if (Selector) { if (Selector) {
Selector->Add( Handle->FD, true, false, this ); Selector->Add( Handle->FD, true, false, Handle, this );
} }
// Set state // Set state
@@ -993,7 +993,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
// Add to Select Lists // Add to Select Lists
if (Selector) { if (Selector) {
Selector->Add( (*RemoteClient)->FD, true, true, this ); Selector->Add( (*RemoteClient)->FD, true, true, Handle, this );
} }
return (*RemoteClient)->FD; return (*RemoteClient)->FD;
@@ -1079,7 +1079,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle, bool DelayResolve )
// Add to Select Lists // Add to Select Lists
if (Selector) { if (Selector) {
Selector->Add( Handle->FD, true, true, this ); Selector->Add( Handle->FD, true, true, Handle, this );
} }
// Set status // Set status
@@ -1093,7 +1093,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle, bool DelayResolve )
// Add to Select Lists // Add to Select Lists
if (Selector) { if (Selector) {
Selector->Add( Handle->FD, true, true, this ); Selector->Add( Handle->FD, true, true, Handle, this );
} }
// Set status // Set status
@@ -1278,7 +1278,7 @@ bool CSelectableCore::Read( THandle * Handle )
// Add to Select Lists // Add to Select Lists
if (Selector) { if (Selector) {
Selector->Add( ClientFD, true, true, this ); Selector->Add( ClientFD, true, true, Handle, this );
} }
return true; return true;
} }
@@ -1681,7 +1681,7 @@ int CSelectableCore::OutputHandle( THandle * Handle, const char * Data, int Len
// Add to select write list // Add to select write list
if (BytesWritten && Selector) { if (BytesWritten && Selector) {
Selector->Add( ChildHandle->FD, false, true, this ); Selector->Add( ChildHandle->FD, false, true, ChildHandle, this );
} }
} }
else else
@@ -1713,7 +1713,7 @@ int CSelectableCore::OutputHandle( THandle * Handle, const char * Data, int Len
// Add to select write list // Add to select write list
if (BytesWritten && Selector) { if (BytesWritten && Selector) {
Selector->Add( Handle->FD, false, true, this ); Selector->Add( Handle->FD, false, true, Handle, this );
} }
} }
else else

View File

@@ -18,7 +18,7 @@
// Types required for connections // Types required for connections
typedef enum { ctNone = 0, ctSerial = 1, ctLinePrinter = 2, ctServer = 3, ctRemoteClient = 4, ctClient = 5, ctForkPipe = 6 } EConnectType; typedef enum { ctNone = 0, ctSerial = 1, ctLinePrinter = 2, ctServer = 3, ctRemoteClient = 4, ctClient = 5, ctForkPipe = 6 } EConnectType;
const char ConnectTypeName[][15] = { "None", "Port", "ForkPipe", "Server", "RemoteClient", "Client" }; const char ConnectTypeName[][15] = { "None", "SerialPort", "ParallelPort", "Server", "RemoteClient", "Client", "ForkPipe" };
typedef enum { csNone = 0, csOpenRequest = 1, csWaitingtoOpen = 2, csOpen = 3, csDataWaiting = 4, csClosed = 5, csFailed = 6 } EConnectState; typedef enum { csNone = 0, csOpenRequest = 1, csWaitingtoOpen = 2, csOpen = 3, csDataWaiting = 4, csClosed = 5, csFailed = 6 } EConnectState;
const char ConnectStateName[][15] = { "None", "OpenRequest", "WaitingToOpen", "Open", "DataWaiting", "Closed", "Failed" }; const char ConnectStateName[][15] = { "None", "OpenRequest", "WaitingToOpen", "Open", "DataWaiting", "Closed", "Failed" };
@@ -58,6 +58,7 @@ struct SSelectHandle {
bool Write; bool Write;
// Event Object // Event Object
THandle * Handle;
CSelectableCore * Function; CSelectableCore * Function;
// List // List
@@ -160,7 +161,7 @@ public:
// Manage FDs // Manage FDs
void Clear(); void Clear();
void Add( int FD, bool Read, bool Write, CSelectableCore * Function = NULL); void Add( int FD, bool Read, bool Write, THandle * Handle, CSelectableCore * Function = NULL);
void Remove( int FD, bool Read, bool Write ); void Remove( int FD, bool Read, bool Write );
// Testing FDs // Testing FDs