Newer
Older
#include <ipc.h>
#include <kernel.h>
int doSend(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen, void* Reply, int ReplyLen) {
int Result;
TD* ReceiverTask = &(Colonel->Tasks[GetMemoryIndex(TaskID)]);
TD* SenderTask = Colonel->Active;
Args->arg0 = MyTid();
Args->arg1 = Reply;
Args->arg2 = ReplyLen;
Result = byteCopy(Reply, Msg, Args->arg2, MsgLen);
if (Result == FAILURE) return Result;
SenderTask->TaskState = ReceiveBlocked;
if (ReceiverTask->TaskState == SendBlocked) {
ReceiverTask->TaskState = Ready;
pushToScheduler(ReceiverTask);
FeedBuffer(AllSendQ[GetMemoryIndex(Colonel->Active->TaskID)],TaskID);
}
int doReceive(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen) {
int Result;
TD* ReceiverTask = Colonel->Active; // me
TD* SenderTask = &(Colonel->Tasks[GetMemoryIndex(TaskID)]);
AP* Args = ReceiverTask->Args;
int SenderID = (int)Args->arg0;
void* SendMsg = Args->arg1;
int SendMsgLen = (int)Args->arg2;
if (SenderTask!= ReceiveBlocked) {
ReceiverTask->TaskState = SendBlocked;
return
}
else{
Result = byteCopy(char*)Msg, SendMsg, SendMsgLen);
if (Result == FAILURE) return Result;
SenderTask->TaskState = ReplyBlocked;
Colonel->Active = NULL;
}
return SUCCESS;
}
int doReply(KernelStruct* Colonel, int TaskID, void* Reply, int ReplyLen) {
TD* SenderTask = &(Colonel->Tasks[GetMemoryIndex(TaskID)]);
AP* Args = SenderTask->Args;
Args->arg0 = (int)MyTid();
Args->arg1 = Reply;
Args->arg2 = (int) ReplyLen
SenderTask->TaskState = Ready;
pushToScheduler(SenderTask);
return SUCCESS;