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
Usermode/AxWin4 - Tweak handling of AcessNative (doesn't have SHM and mmap)
[tpg/acess2.git]
/
KernelLand
/
Kernel
/
drv
/
fifo.c
diff --git
a/KernelLand/Kernel/drv/fifo.c
b/KernelLand/Kernel/drv/fifo.c
index
2adaec7
..
6d5d483
100644
(file)
--- a/
KernelLand/Kernel/drv/fifo.c
+++ b/
KernelLand/Kernel/drv/fifo.c
@@
-1,20
+1,25
@@
-/* AcessOS
- * FIFO Pipe Driver
+/*
+ * Acess2 Kernel
+ * - By John Hodge (thePowersGang)
+ *
+ * drv/fifo.c
+ * - FIFO Pipe Driver
*/
#define DEBUG 0
#include <acess.h>
#include <modules.h>
#include <fs_devfs.h>
#include <semaphore.h>
*/
#define DEBUG 0
#include <acess.h>
#include <modules.h>
#include <fs_devfs.h>
#include <semaphore.h>
+#include <memfs_helpers.h>
// === CONSTANTS ===
#define DEFAULT_RING_SIZE 2048
#define PF_BLOCKING 1
// === TYPES ===
// === CONSTANTS ===
#define DEFAULT_RING_SIZE 2048
#define PF_BLOCKING 1
// === TYPES ===
-typedef struct sPipe
{
- struct sPipe *Next;
-
char *Name
;
+typedef struct sPipe
+{
+
tMemFS_FileHdr FileHdr
;
tVFS_Node Node;
Uint Flags;
int ReadPos;
tVFS_Node Node;
Uint Flags;
int ReadPos;
@@
-27,17
+32,20
@@
typedef struct sPipe {
int FIFO_Install(char **Arguments);
int FIFO_IOCtl(tVFS_Node *Node, int Id, void *Data);
int FIFO_ReadDir(tVFS_Node *Node, int Id, char Dest[FILENAME_MAX]);
int FIFO_Install(char **Arguments);
int FIFO_IOCtl(tVFS_Node *Node, int Id, void *Data);
int FIFO_ReadDir(tVFS_Node *Node, int Id, char Dest[FILENAME_MAX]);
-tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename);
+tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename
, Uint Flags
);
tVFS_Node *FIFO_MkNod(tVFS_Node *Node, const char *Name, Uint Flags);
void FIFO_Reference(tVFS_Node *Node);
void FIFO_Close(tVFS_Node *Node);
int FIFO_Unlink(tVFS_Node *Node, const char *OldName);
tVFS_Node *FIFO_MkNod(tVFS_Node *Node, const char *Name, Uint Flags);
void FIFO_Reference(tVFS_Node *Node);
void FIFO_Close(tVFS_Node *Node);
int FIFO_Unlink(tVFS_Node *Node, const char *OldName);
-size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer);
-size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer);
+size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer
, Uint Flags
);
+size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer
, Uint Flags
);
tPipe *FIFO_Int_NewPipe(int Size, const char *Name);
// === GLOBALS ===
MODULE_DEFINE(0, 0x0032, FIFO, FIFO_Install, NULL, NULL);
tPipe *FIFO_Int_NewPipe(int Size, const char *Name);
// === GLOBALS ===
MODULE_DEFINE(0, 0x0032, FIFO, FIFO_Install, NULL, NULL);
+tMemFS_DirHdr gFIFO_RootDir = {
+ .FileHdr = { .Name = "FIFO" },
+};
tVFS_NodeType gFIFO_DirNodeType = {
.TypeName = "FIFO Dir Node",
.ReadDir = FIFO_ReadDir,
tVFS_NodeType gFIFO_DirNodeType = {
.TypeName = "FIFO Dir Node",
.ReadDir = FIFO_ReadDir,
@@
-67,7
+75,6
@@
tVFS_Node gFIFO_AnonNode = {
.NumACLs = 1,
.ACLs = &gVFS_ACL_EveryoneRW,
};
.NumACLs = 1,
.ACLs = &gVFS_ACL_EveryoneRW,
};
-tPipe *gFIFO_NamedPipes = NULL;
// === CODE ===
/**
// === CODE ===
/**
@@
-76,6
+83,7
@@
tPipe *gFIFO_NamedPipes = NULL;
*/
int FIFO_Install(char **Options)
{
*/
int FIFO_Install(char **Options)
{
+ MemFS_InitDir( &gFIFO_RootDir );
DevFS_AddDevice( &gFIFO_DriverInfo );
return MODULE_ERR_OK;
}
DevFS_AddDevice( &gFIFO_DriverInfo );
return MODULE_ERR_OK;
}
@@
-94,22
+102,14
@@
int FIFO_IOCtl(tVFS_Node *Node, int Id, void *Data)
*/
int FIFO_ReadDir(tVFS_Node *Node, int Id, char Dest[FILENAME_MAX])
{
*/
int FIFO_ReadDir(tVFS_Node *Node, int Id, char Dest[FILENAME_MAX])
{
- tPipe *tmp = gFIFO_NamedPipes;
-
// Entry 0 is Anon Pipes
// Entry 0 is Anon Pipes
- if(Id == 0) {
+ if(Id == 0)
+ {
strcpy(Dest, "anon");
return 0;
}
strcpy(Dest, "anon");
return 0;
}
- // Find the id'th node
- while(--Id && tmp) tmp = tmp->Next;
- // If the list ended, error return
- if(!tmp)
- return -EINVAL;
- // Return good
- strncpy(Dest, tmp->Name, FILENAME_MAX);
- return 0;
+ return MemFS_ReadDir(&gFIFO_RootDir, Id-1, Dest);
}
/**
}
/**
@@
-117,31
+117,26
@@
int FIFO_ReadDir(tVFS_Node *Node, int Id, char Dest[FILENAME_MAX])
* \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, const char *Filename)
+tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename
, Uint Flags
)
{
{
- tPipe *tmp;
- if(!Filename) return NULL;
-
- // NULL String Check
- if(Filename[0] == '\0') return NULL;
+ ASSERTR(Filename, NULL);
+ ASSERTR(Filename[0], NULL);
// Anon Pipe
// Anon Pipe
- if(Filename[0] == 'a' && Filename[1] == 'n'
- && Filename[2] == 'o' && Filename[3] == 'n'
- && Filename[4] == '\0') {
- tmp = FIFO_Int_NewPipe(DEFAULT_RING_SIZE, "anon");
- return &tmp->Node;
+ if( strcmp(Filename, "anon") == 0 )
+ {
+ if( Flags & VFS_FDIRFLAG_STAT ) {
+ //return &gFIFI_TemplateAnonNode;
+ }
+ tPipe *ret = FIFO_Int_NewPipe(DEFAULT_RING_SIZE, "anon");
+ return &ret->Node;
}
// Check Named List
}
// Check Named List
- tmp = gFIFO_NamedPipes;
- while(tmp)
- {
- if(strcmp(tmp->Name, Filename) == 0)
- return &tmp->Node;
- tmp = tmp->Next;
- }
- return NULL;
+ tPipe *ret = (tPipe*)MemFS_FindDir(&gFIFO_RootDir, Filename);
+ if(!ret)
+ return NULL;
+ return &ret->Node;
}
/**
}
/**
@@
-149,6
+144,25
@@
tVFS_Node *FIFO_FindDir(tVFS_Node *Node, const char *Filename)
*/
tVFS_Node *FIFO_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
{
*/
tVFS_Node *FIFO_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
{
+ UNIMPLEMENTED();
+ return NULL;
+}
+
+/**
+ * \brief Delete a pipe
+ */
+int FIFO_Unlink(tVFS_Node *Node, const char *OldName)
+{
+ if(Node != &gFIFO_DriverInfo.RootNode) return 0;
+
+ // Can't relink anon
+ if(strcmp(OldName, "anon")) return 0;
+
+ // Find node
+ tPipe* pipe = (tPipe*)MemFS_Remove(&gFIFO_RootDir, OldName);
+ if(!pipe) return 0;
+
+ free(pipe);
return 0;
}
return 0;
}
@@
-165,58
+179,27
@@
void FIFO_Reference(tVFS_Node *Node)
*/
void FIFO_Close(tVFS_Node *Node)
{
*/
void FIFO_Close(tVFS_Node *Node)
{
- tPipe *pipe;
if(!Node->ImplPtr) return ;
Node->ReferenceCount --;
if(Node->ReferenceCount) return ;
if(!Node->ImplPtr) return ;
Node->ReferenceCount --;
if(Node->ReferenceCount) return ;
- pipe = Node->ImplPtr;
+
tPipe *
pipe = Node->ImplPtr;
- if(strcmp(pipe->Name, "anon") == 0) {
- Log_Debug("FIFO", "Pipe %p closed", Node->ImplPtr);
- free(Node->ImplPtr);
+ if(strcmp(pipe->FileHdr.Name, "anon") == 0)
+ {
+ Log_Debug("FIFO", "Pipe %p closed", pipe);
+ free(pipe);
return ;
}
return ;
}
return ;
}
return ;
}
-/**
- * \brief Delete a pipe
- */
-int FIFO_Unlink(tVFS_Node *Node, const char *OldName)
-{
- tPipe *pipe;
-
- if(Node != &gFIFO_DriverInfo.RootNode) return 0;
-
- // Can't relink anon
- if(strcmp(OldName, "anon")) return 0;
-
- // Find node
- for(pipe = gFIFO_NamedPipes;
- pipe;
- pipe = pipe->Next)
- {
- if(strcmp(pipe->Name, OldName) == 0)
- break;
- }
- if(!pipe) return 0;
-
- // Unlink the pipe
- if(Node->ImplPtr) {
- free(Node->ImplPtr);
- return 1;
- }
-
- return 0;
-}
-
/**
* \brief Read from a fifo pipe
*/
/**
* \brief Read from a fifo pipe
*/
-size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)
+size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer
, Uint Flags
)
{
tPipe *pipe = Node->ImplPtr;
Uint len;
{
tPipe *pipe = Node->ImplPtr;
Uint len;
@@
-229,7
+212,7
@@
size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)
while(remaining)
{
// Wait for buffer to fill
while(remaining)
{
// Wait for buffer to fill
- if(
pipe->Flags & PF_BLOCKING
)
+ if(
(pipe->Flags & PF_BLOCKING) && !(Flags & VFS_IOFLAG_NOBLOCK)
)
{
if( pipe->ReadPos == pipe->WritePos )
VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "FIFO_Read");
{
if( pipe->ReadPos == pipe->WritePos )
VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "FIFO_Read");
@@
-277,6
+260,7
@@
size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)
// Mark some flags
if( pipe->ReadPos == pipe->WritePos ) {
// Mark some flags
if( pipe->ReadPos == pipe->WritePos ) {
+ LOG("%i == %i, marking none to read", pipe->ReadPos, pipe->WritePos);
VFS_MarkAvaliable(Node, 0);
}
VFS_MarkFull(Node, 0); // Buffer can't still be full
VFS_MarkAvaliable(Node, 0);
}
VFS_MarkFull(Node, 0); // Buffer can't still be full
@@
-299,7
+283,7
@@
size_t FIFO_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)
/**
* \brief Write to a fifo pipe
*/
/**
* \brief Write to a fifo pipe
*/
-size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer)
+size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer
, Uint Flags
)
{
tPipe *pipe = Node->ImplPtr;
Uint len;
{
tPipe *pipe = Node->ImplPtr;
Uint len;
@@
-312,9
+296,12
@@
size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff
while(remaining)
{
// Wait for buffer to empty
while(remaining)
{
// Wait for buffer to empty
- if(pipe->Flags & PF_BLOCKING) {
- if( pipe->ReadPos == (pipe->WritePos+1)%pipe->BufSize )
+ if( (pipe->Flags & PF_BLOCKING) && !(Flags & VFS_IOFLAG_NOBLOCK) )
+ {
+ if( pipe->ReadPos == (pipe->WritePos+1)%pipe->BufSize ) {
+ LOG("Blocking write on FIFO");
VFS_SelectNode(Node, VFS_SELECT_WRITE, NULL, "FIFO_Write");
VFS_SelectNode(Node, VFS_SELECT_WRITE, NULL, "FIFO_Write");
+ }
len = remaining;
if( pipe->ReadPos > pipe->WritePos )
len = remaining;
if( pipe->ReadPos > pipe->WritePos )
@@
-346,11
+333,14
@@
size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff
if(len > pipe->BufSize - pipe->WritePos)
{
int ofs = pipe->BufSize - pipe->WritePos;
if(len > pipe->BufSize - pipe->WritePos)
{
int ofs = pipe->BufSize - pipe->WritePos;
+ LOG("pipe->Buffer = %p, pipe->WritePos = %i, ofs=%i, len=%i",
+ pipe->Buffer, pipe->WritePos, ofs, len);
memcpy(&pipe->Buffer[pipe->WritePos], Buffer, ofs);
memcpy(&pipe->Buffer[pipe->WritePos], Buffer, ofs);
- memcpy(&pipe->Buffer, (Uint8*)Buffer + ofs, len-ofs);
+ memcpy(&pipe->Buffer
[0]
, (Uint8*)Buffer + ofs, len-ofs);
}
else
{
}
else
{
+ LOG("pipe->Buffer = %p, pipe->WritePos = %i", pipe->Buffer, pipe->WritePos);
memcpy(&pipe->Buffer[pipe->WritePos], Buffer, len);
}
memcpy(&pipe->Buffer[pipe->WritePos], Buffer, len);
}
@@
-360,6
+350,7
@@
size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff
// Mark some flags
if( pipe->ReadPos == pipe->WritePos ) {
// Mark some flags
if( pipe->ReadPos == pipe->WritePos ) {
+ LOG("Buffer is full");
VFS_MarkFull(Node, 1); // Buffer full
}
VFS_MarkAvaliable(Node, 1);
VFS_MarkFull(Node, 1); // Buffer full
}
VFS_MarkAvaliable(Node, 1);
@@
-374,7
+365,7
@@
size_t FIFO_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff
return Length;
}
return Length;
}
-// --- H
E
LPERS ---
+// --- H
e
LPERS ---
/**
* \fn tPipe *FIFO_Int_NewPipe(int Size, const char *Name)
* \brief Create a new pipe
/**
* \fn tPipe *FIFO_Int_NewPipe(int Size, const char *Name)
* \brief Create a new pipe
@@
-384,11
+375,13
@@
tPipe *FIFO_Int_NewPipe(int Size, const char *Name)
tPipe *ret;
int namelen = strlen(Name) + 1;
int allocsize = sizeof(tPipe) + sizeof(tVFS_ACL) + Size + namelen;
tPipe *ret;
int namelen = strlen(Name) + 1;
int allocsize = sizeof(tPipe) + sizeof(tVFS_ACL) + Size + namelen;
-
+
+ ENTER("iSize sName", Size, Name);
+
ret = calloc(1, allocsize);
ret = calloc(1, allocsize);
- if(!ret)
return NULL
;
+ if(!ret)
LEAVE_RET('n', NULL)
;
- //
Clear Return
+ //
Set default flags
ret->Flags = PF_BLOCKING;
// Allocate Buffer
ret->Flags = PF_BLOCKING;
// Allocate Buffer
@@
-396,10
+389,8
@@
tPipe *FIFO_Int_NewPipe(int Size, const char *Name)
ret->Buffer = (void*)( (Uint)ret + sizeof(tPipe) + sizeof(tVFS_ACL) );
// Set name (and FIFO name)
ret->Buffer = (void*)( (Uint)ret + sizeof(tPipe) + sizeof(tVFS_ACL) );
// 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 );
+ ret->FileHdr.Name = ret->Buffer + Size;
+ strcpy((char*)ret->FileHdr.Name, Name);
// Set Node
ret->Node.ReferenceCount = 1;
// Set Node
ret->Node.ReferenceCount = 1;
@@
-409,14
+400,16
@@
tPipe *FIFO_Int_NewPipe(int Size, const char *Name)
ret->Node.GID = Threads_GetGID();
ret->Node.NumACLs = 1;
ret->Node.ACLs = (void*)( (Uint)ret + sizeof(tPipe) );
ret->Node.GID = Threads_GetGID();
ret->Node.NumACLs = 1;
ret->Node.ACLs = (void*)( (Uint)ret + sizeof(tPipe) );
- ret->Node.ACLs->Group = 0;
- ret->Node.ACLs->ID = ret->Node.UID;
- ret->Node.ACLs->Inv = 0;
- ret->Node.ACLs->Perms = -1;
+ ret->Node.ACLs->
Ent.
Group = 0;
+ ret->Node.ACLs->
Ent.
ID = ret->Node.UID;
+ ret->Node.ACLs->
Perm.
Inv = 0;
+ ret->Node.ACLs->Perm
.Perm
s = -1;
ret->Node.CTime
= ret->Node.MTime
= ret->Node.ATime = now();
ret->Node.Type = &gFIFO_PipeNodeType;
ret->Node.CTime
= ret->Node.MTime
= ret->Node.ATime = now();
ret->Node.Type = &gFIFO_PipeNodeType;
+
+ LEAVE('p', ret);
return ret;
}
return ret;
}
UCC
git Repository :: git.ucc.asn.au