X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Ffifo.c;h=b27c678db8f7809247300eab2be674b03eedae36;hb=b719f4869750496484938a93f279cb28c6a6e37a;hp=53e6bab3f36fde53ccdd6ee23de9b77897c95ef4;hpb=9d85201216cb35e1b1e051b1d7cdc38eaa5befa4;p=tpg%2Facess2.git diff --git a/Kernel/drv/fifo.c b/Kernel/drv/fifo.c index 53e6bab3..b27c678d 100644 --- a/Kernel/drv/fifo.c +++ b/Kernel/drv/fifo.c @@ -20,7 +20,6 @@ typedef struct sPipe { int WritePos; int BufSize; char *Buffer; - tSemaphore Semaphore; } tPipe; // === PROTOTYPES === @@ -222,7 +221,17 @@ Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) // Wait for buffer to fill if(pipe->Flags & PF_BLOCKING) { + #if 0 len = Semaphore_Wait( &pipe->Semaphore, remaining ); + #else + VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "FIFO_Read"); + // Read buffer + // TODO: Rethink this, it might not work on buffer overflow + if(pipe->WritePos - pipe->ReadPos < remaining) + len = pipe->WritePos - pipe->ReadPos; + else + len = remaining; + #endif } else { @@ -251,6 +260,12 @@ Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) pipe->ReadPos += len; pipe->ReadPos %= pipe->BufSize; + // Mark some flags + if( pipe->ReadPos == pipe->WritePos ) { + VFS_MarkAvaliable(Node, 0); + } + VFS_MarkFull(Node, 0); // Buffer can't still be full + // Decrement Remaining Bytes remaining -= len; // Increment Buffer address @@ -277,7 +292,15 @@ Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) { // Wait for buffer to empty if(pipe->Flags & PF_BLOCKING) { + #if 0 len = Semaphore_Signal( &pipe->Semaphore, remaining ); + #else + VFS_SelectNode(Node, VFS_SELECT_WRITE, NULL, "FIFO_Write"); + if(pipe->ReadPos - pipe->WritePos < remaining) + len = pipe->ReadPos - pipe->WritePos; + else + len = remaining; + #endif } else { @@ -306,6 +329,12 @@ Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) pipe->WritePos += len; pipe->WritePos %= pipe->BufSize; + // Mark some flags + if( pipe->ReadPos == pipe->WritePos ) { + VFS_MarkFull(Node, 1); // Buffer full + } + VFS_MarkAvaliable(Node, 1); + // Decrement Remaining Bytes remaining -= len; // Increment Buffer address @@ -341,7 +370,7 @@ tPipe *FIFO_Int_NewPipe(int Size, const char *Name) ret->Name = ret->Buffer + Size; strcpy(ret->Name, Name); // - Start empty, max of `Size` - Semaphore_Init( &ret->Semaphore, 0, Size, "FIFO", ret->Name ); + //Semaphore_Init( &ret->Semaphore, 0, Size, "FIFO", ret->Name ); // Set Node ret->Node.Size = 0;