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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user