git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
BuildConf/host - Slight fix to allow scan-build for non 64-bit architectures
[tpg/acess2.git]
/
Kernel
/
drv
/
fifo.c
diff --git
a/Kernel/drv/fifo.c
b/Kernel/drv/fifo.c
index
b028fcb
..
b27c678
100644
(file)
--- a/
Kernel/drv/fifo.c
+++ b/
Kernel/drv/fifo.c
@@
-4,6
+4,7
@@
#include <acess.h>
#include <modules.h>
#include <fs_devfs.h>
#include <acess.h>
#include <modules.h>
#include <fs_devfs.h>
+#include <semaphore.h>
// === CONSTANTS ===
#define DEFAULT_RING_SIZE 2048
// === CONSTANTS ===
#define DEFAULT_RING_SIZE 2048
@@
-25,19
+26,20
@@
typedef struct sPipe {
int FIFO_Install(char **Arguments);
int FIFO_IOCtl(tVFS_Node *Node, int Id, void *Data);
char *FIFO_ReadDir(tVFS_Node *Node, int Id);
int FIFO_Install(char **Arguments);
int FIFO_IOCtl(tVFS_Node *Node, int Id, void *Data);
char *FIFO_ReadDir(tVFS_Node *Node, int Id);
-tVFS_Node *FIFO_FindDir(tVFS_Node *Node, char *Filename);
- int FIFO_MkNod(tVFS_Node *Node, char *Name, Uint Flags);
+tVFS_Node *FIFO_FindDir(tVFS_Node *Node, c
onst c
har *Filename);
+ int FIFO_MkNod(tVFS_Node *Node, c
onst c
har *Name, Uint Flags);
void FIFO_Close(tVFS_Node *Node);
void FIFO_Close(tVFS_Node *Node);
- int FIFO_Relink(tVFS_Node *Node, c
har *OldName,
char *NewName);
+ int FIFO_Relink(tVFS_Node *Node, c
onst 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);
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, c
onst c
har *Name);
// === GLOBALS ===
MODULE_DEFINE(0, 0x0032, FIFO, FIFO_Install, NULL, NULL);
tDevFS_Driver gFIFO_DriverInfo = {
NULL, "fifo",
{
// === GLOBALS ===
MODULE_DEFINE(0, 0x0032, FIFO, FIFO_Install, NULL, NULL);
tDevFS_Driver gFIFO_DriverInfo = {
NULL, "fifo",
{
+ .Size = 1,
.NumACLs = 1,
.ACLs = &gVFS_ACL_EveryoneRW,
.Flags = VFS_FFLAG_DIRECTORY,
.NumACLs = 1,
.ACLs = &gVFS_ACL_EveryoneRW,
.Flags = VFS_FFLAG_DIRECTORY,
@@
-62,7
+64,7
@@
tPipe *gFIFO_NamedPipes = NULL;
int FIFO_Install(char **Options)
{
DevFS_AddDevice( &gFIFO_DriverInfo );
int FIFO_Install(char **Options)
{
DevFS_AddDevice( &gFIFO_DriverInfo );
- return MODULE_
INIT_SUCCESS
;
+ return MODULE_
ERR_OK
;
}
/**
}
/**
@@
-80,6
+82,7
@@
int FIFO_IOCtl(tVFS_Node *Node, int Id, void *Data)
char *FIFO_ReadDir(tVFS_Node *Node, int Id)
{
tPipe *tmp = gFIFO_NamedPipes;
char *FIFO_ReadDir(tVFS_Node *Node, int Id)
{
tPipe *tmp = gFIFO_NamedPipes;
+
// Entry 0 is Anon Pipes
if(Id == 0) return strdup("anon");
// Entry 0 is Anon Pipes
if(Id == 0) return strdup("anon");
@@
-92,11
+95,11
@@
char *FIFO_ReadDir(tVFS_Node *Node, int Id)
}
/**
}
/**
- * \fn tVFS_Node *FIFO_FindDir(tVFS_Node *Node, char *Filename)
+ * \fn tVFS_Node *FIFO_FindDir(tVFS_Node *Node, c
onst c
har *Filename)
* \brief Find a file in the FIFO root
* \note Creates an anon pipe if anon is requested
*/
* \brief Find a file in the FIFO root
* \note Creates an anon pipe if anon is requested
*/
-tVFS_Node *FIFO_FindDir(tVFS_Node *Node, char *Filename)
+tVFS_Node *FIFO_FindDir(tVFS_Node *Node, c
onst c
har *Filename)
{
tPipe *tmp;
if(!Filename) return NULL;
{
tPipe *tmp;
if(!Filename) return NULL;
@@
-124,15
+127,16
@@
tVFS_Node *FIFO_FindDir(tVFS_Node *Node, char *Filename)
}
/**
}
/**
- * \fn int FIFO_MkNod(tVFS_Node *Node, char *Name, Uint Flags)
+ * \fn int FIFO_MkNod(tVFS_Node *Node, c
onst c
har *Name, Uint Flags)
*/
*/
-int FIFO_MkNod(tVFS_Node *Node, char *Name, Uint Flags)
+int FIFO_MkNod(tVFS_Node *Node, c
onst c
har *Name, Uint Flags)
{
return 0;
}
/**
{
return 0;
}
/**
- * \fn void FIFO_Close(vfs_node *Node)
+ * \fn void FIFO_Close(tVFS_Node *Node)
+ * \brief Close a FIFO end
*/
void FIFO_Close(tVFS_Node *Node)
{
*/
void FIFO_Close(tVFS_Node *Node)
{
@@
-153,10
+157,10
@@
void FIFO_Close(tVFS_Node *Node)
}
/**
}
/**
- * \fn int FIFO_Relink(tVFS_Node *Node, c
har *OldName,
char *NewName)
+ * \fn int FIFO_Relink(tVFS_Node *Node, c
onst char *OldName, const
char *NewName)
* \brief Relink a file (Deletes named pipes)
*/
* \brief Relink a file (Deletes named pipes)
*/
-int FIFO_Relink(tVFS_Node *Node, c
har *OldName,
char *NewName)
+int FIFO_Relink(tVFS_Node *Node, c
onst char *OldName, const
char *NewName)
{
tPipe *pipe, *tmp;
{
tPipe *pipe, *tmp;
@@
-216,24
+220,36
@@
Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
{
// Wait for buffer to fill
if(pipe->Flags & PF_BLOCKING)
{
// Wait for buffer to fill
if(pipe->Flags & PF_BLOCKING)
- while(pipe->ReadPos == pipe->WritePos)
- Threads_Yield();
+ {
+ #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
else
+ {
if(pipe->ReadPos == pipe->WritePos)
return 0;
if(pipe->ReadPos == pipe->WritePos)
return 0;
-
- // Read buffer
- if(pipe->WritePos - pipe->ReadPos < remaining)
- len = pipe->WritePos - pipe->ReadPos;
- else
- len = remaining;
+ // Read buffer
+ if(pipe->WritePos - pipe->ReadPos < remaining)
+ len = pipe->WritePos - pipe->ReadPos;
+ else
+ len = remaining;
+ }
// Check if read overflows buffer
if(len > pipe->BufSize - pipe->ReadPos)
{
int ofs = pipe->BufSize - pipe->ReadPos;
memcpy(Buffer, &pipe->Buffer[pipe->ReadPos], ofs);
// Check if read overflows buffer
if(len > pipe->BufSize - pipe->ReadPos)
{
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
{
}
else
{
@@
-244,10
+260,16
@@
Uint64 FIFO_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
pipe->ReadPos += len;
pipe->ReadPos %= pipe->BufSize;
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
// Decrement Remaining Bytes
remaining -= len;
// Increment Buffer address
- Buffer
+=
len;
+ Buffer
= (Uint8*)Buffer +
len;
}
return Length;
}
return Length;
@@
-269,25
+291,34
@@
Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
while(remaining)
{
// Wait for buffer to empty
while(remaining)
{
// Wait for buffer to empty
- if(pipe->Flags & PF_BLOCKING)
- while(pipe->ReadPos == (pipe->WritePos+1)%pipe->BufSize)
- Threads_Yield();
+ 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
else
+ {
if(pipe->ReadPos == (pipe->WritePos+1)%pipe->BufSize)
return 0;
if(pipe->ReadPos == (pipe->WritePos+1)%pipe->BufSize)
return 0;
-
- // Write buffer
- if(pipe->ReadPos - pipe->WritePos < remaining)
- len = pipe->ReadPos - pipe->WritePos;
- else
- len = remaining;
+ // Write buffer
+ if(pipe->ReadPos - pipe->WritePos < remaining)
+ len = pipe->ReadPos - pipe->WritePos;
+ else
+ len = remaining;
+ }
// Check if write overflows buffer
if(len > pipe->BufSize - pipe->WritePos)
{
int ofs = pipe->BufSize - pipe->WritePos;
memcpy(&pipe->Buffer[pipe->WritePos], Buffer, ofs);
// Check if write overflows buffer
if(len > pipe->BufSize - pipe->WritePos)
{
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
{
}
else
{
@@
-298,10
+329,16
@@
Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
pipe->WritePos += len;
pipe->WritePos %= pipe->BufSize;
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
// Decrement Remaining Bytes
remaining -= len;
// Increment Buffer address
- Buffer
+=
len;
+ Buffer
= (Uint8*)Buffer +
len;
}
return Length;
}
return Length;
@@
-309,29
+346,31
@@
Uint64 FIFO_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
// --- HELPERS ---
/**
// --- HELPERS ---
/**
- * \fn tPipe *FIFO_Int_NewPipe(int Size, char *Name)
+ * \fn tPipe *FIFO_Int_NewPipe(int Size, c
onst c
har *Name)
* \brief Create a new pipe
*/
* \brief Create a new pipe
*/
-tPipe *FIFO_Int_NewPipe(int Size, char *Name)
+tPipe *FIFO_Int_NewPipe(int Size, c
onst c
har *Name)
{
tPipe *ret;
{
tPipe *ret;
- int allocsize = sizeof(tPipe) + sizeof(tVFS_ACL) + Size;
+ int namelen = strlen(Name) + 1;
+ int allocsize = sizeof(tPipe) + sizeof(tVFS_ACL) + Size + namelen;
ret = malloc(allocsize);
if(!ret) return NULL;
// Clear Return
memset(ret, 0, allocsize);
ret = malloc(allocsize);
if(!ret) return NULL;
// Clear Return
memset(ret, 0, allocsize);
-
- ret->Name = Name;
+ ret->Flags = PF_BLOCKING;
// Allocate Buffer
ret->BufSize = Size;
ret->Buffer = (void*)( (Uint)ret + sizeof(tPipe) + sizeof(tVFS_ACL) );
// Allocate Buffer
ret->BufSize = Size;
ret->Buffer = (void*)( (Uint)ret + sizeof(tPipe) + sizeof(tVFS_ACL) );
- if(!ret->Buffer) {
- free(ret);
- return NULL;
- }
+
+ // Set name (and FIFO name)
+ ret->Name = ret->Buffer + Size;
+ strcpy(ret->Name, Name);
+ // - Start empty, max of `Size`
+ //Semaphore_Init( &ret->Semaphore, 0, Size, "FIFO", ret->Name );
// Set Node
ret->Node.Size = 0;
// Set Node
ret->Node.Size = 0;
UCC
git Repository :: git.ucc.asn.au