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
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
Handle = &FirstHandle;
while (*Handle && ((*Handle)->FD != FD)) {
Handle = &((*Handle)->Next);
// Check if SelectHandle already exists
SelectHandle = &FirstHandle;
while (*SelectHandle && ((*SelectHandle)->FD != FD)) {
SelectHandle = &((*SelectHandle)->Next);
}
if (!*Handle) {
if (!*SelectHandle) {
// Create if not exist
*Handle = (TSelectHandle*)malloc( sizeof(TSelectHandle) );
memset( *Handle, 0, sizeof(TSelectHandle) );
*SelectHandle = (TSelectHandle*)malloc( sizeof(TSelectHandle) );
memset( *SelectHandle, 0, sizeof(TSelectHandle) );
// Set Parameters
(*Handle)->FD = FD;
(*Handle)->Function = Function;
(*SelectHandle)->FD = FD;
(*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
Remove( FD, true, true );
// 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
if (Read && !(*Handle)->Read) {
(*Handle)->Read = true;
if (Read && !(*SelectHandle)->Read) {
(*SelectHandle)->Read = true;
FD_SET( FD, &ReadTestFDS );
// 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
if (Write && !(*Handle)->Write) {
(*Handle)->Write = true;
if (Write && !(*SelectHandle)->Write) {
(*SelectHandle)->Write = true;
FD_SET( FD, &WriteTestFDS );
// 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)
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 )
{
TSelectHandle ** Handle = NULL;
TSelectHandle ** SelectHandle = NULL;
THandle * Handle = NULL;
// Check if Handle already exists
Handle = &FirstHandle;
while (*Handle && ((*Handle)->FD != FD)) {
Handle = &((*Handle)->Next);
// Check if SelectHandle already exists
SelectHandle = &FirstHandle;
while (*SelectHandle && ((*SelectHandle)->FD != FD)) {
SelectHandle = &((*SelectHandle)->Next);
}
// Check if found
if (!*Handle)
if (!*SelectHandle)
return;
Handle = (*SelectHandle)->Handle;
// Remove from set for select read check
if (Read && (*Handle)->Read) {
(*Handle)->Read = false;
if (Read && (*SelectHandle)->Read) {
(*SelectHandle)->Read = false;
FD_CLR( FD, &ReadTestFDS);
// 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
if (Write && (*Handle)->Write) {
(*Handle)->Write = false;
if (Write && (*SelectHandle)->Write) {
(*SelectHandle)->Write = false;
FD_CLR( FD, &WriteTestFDS);
// 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
}