Uint64 VT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
{
int pos = 0;
+ int avail;
tVTerm *term = &gVT_Terminals[ Node->Inode ];
Mutex_Acquire( &term->ReadingLock );
{
// Text Mode (UTF-8)
case TERM_MODE_TEXT:
- while(pos < Length)
- {
- int avail_bytes;
- VFS_SelectNode(Node, VFS_SELECT_READ, NULL);
- avail_bytes = term->InputRead - term->InputWrite;
+ VFS_SelectNode(Node, VFS_SELECT_READ, NULL);
- if(avail_bytes < 0)
- avail_bytes += MAX_INPUT_CHARS8;
- if(avail_bytes > Length - pos)
- avail_bytes = Length - pos;
-
- while( avail_bytes -- )
- {
- ((char*)Buffer)[pos] = term->InputBuffer[term->InputRead];
- pos ++;
- term->InputRead ++;
- term->InputRead %= MAX_INPUT_CHARS8;
- }
+ avail = term->InputWrite - term->InputRead;
+ if(avail < 0)
+ avail += MAX_INPUT_CHARS8;
+ if(avail > Length - pos)
+ avail = Length - pos;
+
+ while( avail -- )
+ {
+ ((char*)Buffer)[pos] = term->InputBuffer[term->InputRead];
+ pos ++;
+ term->InputRead ++;
+ term->InputRead %= MAX_INPUT_CHARS8;
}
break;
//case TERM_MODE_FB:
// Other - UCS-4
default:
- while(pos < Length)
- {
- int avail;
- VFS_SelectNode(Node, VFS_SELECT_READ, NULL);
+ VFS_SelectNode(Node, VFS_SELECT_READ, NULL);
- avail = term->InputRead - term->InputWrite;
- if(avail < 0)
- avail += MAX_INPUT_CHARS32;
- if(avail > Length - pos)
- avail = Length/4 - pos;
-
-
- while( avail -- )
- {
- ((Uint32*)Buffer)[pos] = ((Uint32*)term->InputBuffer)[term->InputRead];
- pos ++;
- term->InputRead ++;
- term->InputRead %= MAX_INPUT_CHARS32;
- }
+ avail = term->InputWrite - term->InputRead;
+ if(avail < 0)
+ avail += MAX_INPUT_CHARS32;
+ if(avail > Length - pos)
+ avail = Length/4 - pos;
+
+
+ while( avail -- )
+ {
+ ((Uint32*)Buffer)[pos] = ((Uint32*)term->InputBuffer)[term->InputRead];
+ pos ++;
+ term->InputRead ++;
+ term->InputRead %= MAX_INPUT_CHARS32;
}
pos *= 4;
break;
if( !Handles ) return 0;
- ENTER("pThread iMaxHandle pHandles iType BIsKernel", Thread, MaxHandle, Handles, Type, IsKernel);
+ ENTER("pThread iMaxHandle pHandles iType iIsKernel", Thread, MaxHandle, Handles, Type, IsKernel);
for( i = 0; i < MaxHandle; i ++ )
{
if( !Handles ) return 0;
- ENTER("pThread iMaxHandle pHandles iType BIsKernel", Thread, MaxHandle, Handles, Type, IsKernel);
+ ENTER("pThread iMaxHandle pHandles iType iIsKernel", Thread, MaxHandle, Handles, Type, IsKernel);
for( i = 0; i < MaxHandle; i ++ )
{
int i;
tVFS_SelectListEnt *block;
+ if( !List ) return ;
+
ENTER("pList", List);
// Lock to avoid concurrency issues
#include "ipv4.h"
#include "tcp.h"
+#define USE_SELECT 1
+
#define TCP_MIN_DYNPORT 0xC000
#define TCP_MAX_HALFOPEN 1024 // Should be enough
if(Header->Flags & TCP_FLAG_ACK) {
// TODO: Process an ACKed Packet
Log_Log("TCP", "Conn %p, Packet 0x%x ACKed", Connection, Header->AcknowlegementNumber);
+
+ // HACK
+ // TODO: Make sure that the packet is actually ACKing the FIN
+ if( Connection->State == TCP_ST_FIN_SENT ) {
+ Connection->State = TCP_ST_FINISHED;
+ return ;
+ }
}
// TODO: Check what to do here
// Poll packets
for(;;)
{
- #if USE_SELECT
// Wait
VFS_SelectNode(Node, VFS_SELECT_READ, NULL);
// Lock list and read
Mutex_Acquire( &conn->lRecievedPackets );
- #else
- // Lock list and check if there is a packet
- Mutex_Acquire( &conn->lRecievedPackets );
- if( conn->RecievedBuffer->Length == 0 ) {
- // If not, release the lock, yield and try again
- Mutex_Release( &conn->lRecievedPackets );
- Threads_Yield(); // TODO: Less expensive wait
- continue;
- }
- #endif
// Attempt to read all `Length` bytes
len = RingBuffer_Read( destbuf, conn->RecievedBuffer, Length );
- #if USE_SELECT
- if( conn->RecievedBuffer->Length == 0 )
+ if( len == 0 || conn->RecievedBuffer->Length == 0 ) {
+ LOG("Marking as none avaliable (len = %i)\n", len);
VFS_MarkAvaliable(Node, 0);
- #endif
-
+ }
+
// Release the lock (we don't need it any more)
Mutex_Release( &conn->lRecievedPackets );