Added BochsGA to build
[tpg/acess2.git] / Kernel / drv / fifo.c
index 0057053..b27c678 100644 (file)
@@ -20,7 +20,6 @@ typedef struct sPipe {
         int    WritePos;
         int    BufSize;
        char    *Buffer;
-       tSemaphore      Semaphore;
 } tPipe;
 
 // === PROTOTYPES ===
@@ -33,7 +32,7 @@ void  FIFO_Close(tVFS_Node *Node);
  int   FIFO_Relink(tVFS_Node *Node, const char *OldName, const char *NewName);
 Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
 Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
-tPipe  *FIFO_Int_NewPipe(int Size, char *Name);
+tPipe  *FIFO_Int_NewPipe(int Size, const char *Name);
 
 // === GLOBALS ===
 MODULE_DEFINE(0, 0x0032, FIFO, FIFO_Install, NULL, NULL);
@@ -220,8 +219,19 @@ Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        while(remaining)
        {
                // Wait for buffer to fill
-               if(pipe->Flags & PF_BLOCKING) {
+               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
                {
@@ -239,7 +249,7 @@ Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                {
                        int ofs = pipe->BufSize - pipe->ReadPos;
                        memcpy(Buffer, &pipe->Buffer[pipe->ReadPos], ofs);
-                       memcpy(Buffer + ofs, &pipe->Buffer, len-ofs);
+                       memcpy((Uint8*)Buffer + ofs, &pipe->Buffer, len-ofs);
                }
                else
                {
@@ -250,10 +260,16 @@ 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
-               Buffer += len;
+               Buffer = (Uint8*)Buffer + len;
        }
 
        return Length;
@@ -276,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
                {
@@ -294,7 +318,7 @@ Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                {
                        int ofs = pipe->BufSize - pipe->WritePos;
                        memcpy(&pipe->Buffer[pipe->WritePos], Buffer, ofs);
-                       memcpy(&pipe->Buffer, Buffer + ofs, len-ofs);
+                       memcpy(&pipe->Buffer, (Uint8*)Buffer + ofs, len-ofs);
                }
                else
                {
@@ -305,10 +329,16 @@ 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
-               Buffer += len;
+               Buffer = (Uint8*)Buffer + len;
        }
 
        return Length;
@@ -316,10 +346,10 @@ Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
 
 // --- HELPERS ---
 /**
- * \fn tPipe *FIFO_Int_NewPipe(int Size, char *Name)
+ * \fn tPipe *FIFO_Int_NewPipe(int Size, const char *Name)
  * \brief Create a new pipe
  */
-tPipe *FIFO_Int_NewPipe(int Size, char *Name)
+tPipe *FIFO_Int_NewPipe(int Size, const char *Name)
 {
        tPipe   *ret;
         int    namelen = strlen(Name) + 1;
@@ -340,7 +370,7 @@ tPipe *FIFO_Int_NewPipe(int Size, 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;

UCC git Repository :: git.ucc.asn.au