diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-03-03 22:09:50 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-03-03 22:21:03 -0800 |
commit | 71e4f3812982dba2efb471283d310224e8db363e (patch) | |
tree | ea111a1acb8b8845dbda39c0e1b4bac1d198143b /tools/iso/kernel.soso/pipe.c | |
parent | c6b928be29ac8cdb4e4d6e1eaa20420ff03e5a4c (diff) | |
download | mu-71e4f3812982dba2efb471283d310224e8db363e.tar.gz |
7842 - new directory organization
Baremetal is now the default build target and therefore has its sources at the top-level. Baremetal programs build using the phase-2 Mu toolchain that requires a Linux kernel. This phase-2 codebase which used to be at the top-level is now under the linux/ directory. Finally, the phase-2 toolchain, while self-hosting, has a way to bootstrap from a C implementation, which is now stored in linux/bootstrap. The bootstrap C implementation uses some literate programming tools that are now in linux/bootstrap/tools. So the whole thing has gotten inverted. Each directory should build one artifact and include the main sources (along with standard library). Tools used for building it are relegated to sub-directories, even though those tools are often useful in their own right, and have had lots of interesting programs written using them. A couple of things have gotten dropped in this process: - I had old ways to run on just a Linux kernel, or with a Soso kernel. No more. - I had some old tooling for running a single test at the cursor. I haven't used that lately. Maybe I'll bring it back one day. The reorg isn't done yet. Still to do: - redo documentation everywhere. All the README files, all other markdown, particularly vocabulary.md. - clean up how-to-run comments at the start of programs everywhere - rethink what to do with the html/ directory. Do we even want to keep supporting it? In spite of these shortcomings, all the scripts at the top-level, linux/ and linux/bootstrap are working. The names of the scripts also feel reasonable. This is a good milestone to take stock at.
Diffstat (limited to 'tools/iso/kernel.soso/pipe.c')
-rw-r--r-- | tools/iso/kernel.soso/pipe.c | 224 |
1 files changed, 0 insertions, 224 deletions
diff --git a/tools/iso/kernel.soso/pipe.c b/tools/iso/kernel.soso/pipe.c deleted file mode 100644 index 7141305c..00000000 --- a/tools/iso/kernel.soso/pipe.c +++ /dev/null @@ -1,224 +0,0 @@ -#include "list.h" -#include "pipe.h" -#include "fs.h" -#include "alloc.h" -#include "fifobuffer.h" - -static List* gPipeList = NULL; - -static FileSystemNode* gPipesRoot = NULL; - -static FileSystemDirent gDirent; - -typedef struct Pipe { - char name[32]; - FifoBuffer* buffer; - FileSystemNode* fsNode; - List* accessingThreads; -} Pipe; - -static BOOL pipes_open(File *file, uint32 flags); -static FileSystemDirent *pipes_readdir(FileSystemNode *node, uint32 index); -static FileSystemNode *pipes_finddir(FileSystemNode *node, char *name); - -void initializePipes() { - gPipeList = List_Create(); - - gPipesRoot = getFileSystemNode("/system/pipes"); - - if (NULL == gPipesRoot) { - WARNING("/system/pipes not found!!"); - } - else { - gPipesRoot->open = pipes_open; - gPipesRoot->finddir = pipes_finddir; - gPipesRoot->readdir = pipes_readdir; - } -} - -static BOOL pipes_open(File *file, uint32 flags) { - return TRUE; -} - -static FileSystemDirent *pipes_readdir(FileSystemNode *node, uint32 index) { - int counter = 0; - - List_Foreach (n, gPipeList) { - Pipe* p = (Pipe*)n->data; - - if (counter == index) { - strcpy(gDirent.name, p->name); - gDirent.fileType = FT_Pipe; - - return &gDirent; - } - ++counter; - } - - return NULL; -} - -static FileSystemNode *pipes_finddir(FileSystemNode *node, char *name) { - List_Foreach (n, gPipeList) { - Pipe* p = (Pipe*)n->data; - - if (strcmp(name, p->name) == 0) { - return p->fsNode; - } - } - - return NULL; -} - -static BOOL pipe_open(File *file, uint32 flags) { - beginCriticalSection(); - - Pipe* pipe = file->node->privateNodeData; - - List_Append(pipe->accessingThreads, file->thread); - - endCriticalSection(); - - return TRUE; -} - -static void pipe_close(File *file) { - beginCriticalSection(); - - Pipe* pipe = file->node->privateNodeData; - - List_RemoveFirstOccurrence(pipe->accessingThreads, file->thread); - - endCriticalSection(); -} - -static void blockAccessingThreads(Pipe* pipe) { - disableInterrupts(); - - List_Foreach (n, pipe->accessingThreads) { - Thread* reader = n->data; - - reader->state = TS_WAITIO; - - reader->state_privateData = pipe; - } - - enableInterrupts(); - - halt(); -} - -static void wakeupAccessingThreads(Pipe* pipe) { - beginCriticalSection(); - - List_Foreach (n, pipe->accessingThreads) { - Thread* reader = n->data; - - if (reader->state == TS_WAITIO) { - if (reader->state_privateData == pipe) { - reader->state = TS_RUN; - } - } - } - - endCriticalSection(); -} - -static int32 pipe_read(File *file, uint32 size, uint8 *buffer) { - if (0 == size || NULL == buffer) { - return -1; - } - - Pipe* pipe = file->node->privateNodeData; - - uint32 used = 0; - while ((used = FifoBuffer_getSize(pipe->buffer)) < size) { - blockAccessingThreads(pipe); - } - - disableInterrupts(); - - int32 readBytes = FifoBuffer_dequeue(pipe->buffer, buffer, size); - - wakeupAccessingThreads(pipe); - - return readBytes; -} - -static int32 pipe_write(File *file, uint32 size, uint8 *buffer) { - if (0 == size || NULL == buffer) { - return -1; - } - - Pipe* pipe = file->node->privateNodeData; - - uint32 free = 0; - while ((free = FifoBuffer_getFree(pipe->buffer)) < size) { - blockAccessingThreads(pipe); - } - - disableInterrupts(); - - int32 bytesWritten = FifoBuffer_enqueue(pipe->buffer, buffer, size); - - wakeupAccessingThreads(pipe); - - return bytesWritten; -} - -BOOL createPipe(const char* name, uint32 bufferSize) { - List_Foreach (n, gPipeList) { - Pipe* p = (Pipe*)n->data; - if (strcmp(name, p->name) == 0) { - return FALSE; - } - } - - Pipe* pipe = (Pipe*)kmalloc(sizeof(Pipe)); - memset((uint8*)pipe, 0, sizeof(Pipe)); - - strcpy(pipe->name, name); - pipe->buffer = FifoBuffer_create(bufferSize); - - pipe->accessingThreads = List_Create(); - - pipe->fsNode = (FileSystemNode*)kmalloc(sizeof(FileSystemNode)); - memset((uint8*)pipe->fsNode, 0, sizeof(FileSystemNode)); - pipe->fsNode->privateNodeData = pipe; - pipe->fsNode->open = pipe_open; - pipe->fsNode->close = pipe_close; - pipe->fsNode->read = pipe_read; - pipe->fsNode->write = pipe_write; - - List_Append(gPipeList, pipe); - - return TRUE; -} - -BOOL destroyPipe(const char* name) { - List_Foreach (n, gPipeList) { - Pipe* p = (Pipe*)n->data; - if (strcmp(name, p->name) == 0) { - List_RemoveFirstOccurrence(gPipeList, p); - FifoBuffer_destroy(p->buffer); - List_Destroy(p->accessingThreads); - kfree(p->fsNode); - kfree(p); - - return TRUE; - } - } - - return FALSE; -} - -BOOL existsPipe(const char* name) { - List_Foreach (n, gPipeList) { - Pipe* p = (Pipe*)n->data; - if (strcmp(name, p->name) == 0) { - return TRUE; - } - } - - return FALSE; -} |