BarryServer : Git

All the code for all my projects
// BarryServer : Git / Orion / commit / d41a53cbc7d055b1c00cf0a339dbed6925f4f02c / task / ipc.c

// Related

Orion

Barry Importing existing Orion kernel d41a53c (2 years, 4 months ago)
diff --git a/task/ipc.c b/task/ipc.c
new file mode 100644
index 0000000..1faafd9
--- /dev/null
+++ b/task/ipc.c
@@ -0,0 +1,131 @@
+/*
+ * This file contains all the functions related to message passing and
+ * inter-process communication.
+ */
+
+#include <stdint.h>
+#include <stddef.h>
+#include <sys/ipc.h>
+#include "task.h"
+#include "../proc/proc.h"
+#include "../mem/mem.h"
+#include "../mem/heap.h"
+#include "../spinlock.h"
+
+extern TaskQueue readyQueue;
+
+/* Block until a message is received */
+static uint8_t
+block_recv(Task *task, uint32_t from)
+{
+//	Message *head, *prev;
+//	/* Blocking for RECEIVE from any */
+//	if (!task->msgQueue)
+//		return 0;
+//	/* Block for RECEIVE from specific process */
+//	if (task->msgQueue->from != from && from != ANY) {
+//		for (head = task->msgQueue;
+//		     head->from != from;
+//		     prev = head, head = head->next);
+//		/* End of list */
+//		if (!head) return 0;
+//		/* Move message to start of queue */
+//		if (head != task->msgQueue) {
+//			prev->next = head->next;
+//			head->next = task->msgQueue;
+//			task->msgQueue = head;
+//		}
+//	}
+//
+//	return 1;
+}
+
+/* Send a message */
+Message *
+nb_send_msg(pid_t to, uint16_t type, MessageContent *msg)
+{
+//	Message *item, *msgSearch;
+//	Task *taskSearch;
+//
+//	item = kmalloc(sizeof(Message));
+//	memcpy(&item->msg, msg, sizeof(MessageContent));
+//	item->from = current->tid;
+//	item->type = type;
+//	item->next = 0;
+//
+//	/* Find target process */
+//	for (taskSearch = readyQueue;
+//	     taskSearch->tid != to && taskSearch;
+//	     taskSearch = taskSearch->next);
+//	/* Add message to queue */
+//	if (taskSearch) {
+//		acquire(&taskSearch->lock);
+//		if (taskSearch->msgQueue) {
+//			for (msgSearch = taskSearch->msgQueue;
+//			     msgSearch->next;
+//			     msgSearch = msgSearch->next);
+//			msgSearch->next = item;
+//		} else {
+//			taskSearch->msgQueue = item;
+//		}
+//		release(&taskSearch->lock);
+//	}
+//
+//	if (taskSearch)
+//		return item;
+//	kfree(item);
+//	return NULL;
+}
+
+/* Send a message and block until it is delivered */
+Message *
+send_msg(pid_t to, uint16_t type, MessageContent *msg)
+{
+//	Message *nb = nb_send_msg(to, type, msg);
+//	if (!nb) return NULL;
+//	block(block_send, (uint32_t) nb);
+//	return nb;
+}
+
+/* Receive a message */
+pid_t
+nb_recv_msg(Message *buf, pid_t from)
+{
+//	Message *msg;
+//	Task *taskSearch;
+//
+//	acquire(&current->lock);
+//	msg = current->msgQueue;
+//	if (msg && (msg->from == from || from == ANY)) {
+//		current->msgQueue = msg->next;
+//		memcpy(buf, msg, sizeof(Message));
+//		kfree(msg);
+//	}
+//	release(&current->lock);
+//
+//	if (msg && (buf->from == from || from == ANY)) {
+//		/* Find sending process */
+//		for (taskSearch = readyQueue;
+//		     taskSearch->tid != buf->from && taskSearch;
+//		     taskSearch = taskSearch->next);
+//		if (taskSearch) {
+//			if (taskSearch->block.function == block_send
+//			 && taskSearch->block.condition == (uint32_t) msg)
+//				taskSearch->block.function = NULL;
+//		}
+//		return buf->from;
+//	}
+//	return 0;
+}
+
+/* Block until a message is received */
+pid_t
+recv_msg(Message *buf, pid_t from)
+{
+//	pid_t nb;
+//check:
+//	nb = nb_recv_msg(buf, from);
+//	if (nb) return nb;
+//	block(block_recv, from);
+//	goto check;
+}