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