Newer
Older
#include <ipc.h>
#include <kernel.h>
int doSend(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen, void* ReplyMsg, int ReplyLen) {
Colonel->Active->RetVal = SRR_FAILED;
// check the TD availability
int TIDIndex = GetMemoryIndexINT(TaskID);
bwprintf(COM2,"doSend: TID: %d, TID Index:%d\n\r",TaskID, TIDIndex);
TD* SenderTask = Colonel->Active;
if(TIDIndex >= MAX_NUM_TD){
bwprintf(COM2,"doSend: TID Index:%d out of MaxNumTD\n\r", TIDIndex);
SenderTask->RetVal = TASK_DNE;
return FAILURE;
}
TD* ReceiverTask = &(Colonel->Tasks[TIDIndex]);
if(GetAvailability(ReceiverTask)){
bwprintf(COM2,"doSend: Task %d Availability %d\n\r",TaskID, GetAvailability(ReceiverTask));
SenderTask->RetVal = TASK_DNE;
return FAILURE;
}
bwprintf(COM2,"doSend: Task %d SendMsgLen:%d\n\r",SenderTask->TaskID,MsgLen);
int Result;
if (ReceiverTask->TaskState == SendBlocked) {
AP* Args = ReceiverTask->Args;
int *ReceiverSlot = (int *)Args->arg1;
int ReceiverLen = (int)(Args->arg2);
bwprintf(COM2,"doSend: Receiver %d SendBlocked\n\r", TaskID);
Result = byteCopy(ReceiverSlot, Msg, ReceiverLen, MsgLen);
if (Result == FAILURE){
bwprintf(COM2,"doSend: byteCopy Failed\n\r");
ReceiverTask->RetVal = MSG_TRUNCATED;
return Result;
SenderTask->TaskState = ReplyBlocked;
ReceiverTask->TaskState = Ready;
pushToScheduler(Colonel, ReceiverTask);
BufferPopHead(AllSendQ[TIDIndex]);
}
else {
bwprintf(COM2,"doSend: Receiver %d not Received, Task %d RBLocked\n\r",TaskID,SenderTask->TaskID);
SenderTask->TaskState = ReceiveBlocked;
}
int doReceive(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen) {
int TIDIndex = GetMemoryIndexINT(TaskID);
TD* SenderTask = &(Colonel->Tasks[TIDIndex]);
void* SendMsg = Args->arg1;
int SendMsgLen = (int)Args->arg2;
//bwprintf(COM2,"doReceive: Sender %d not send yet\n\r",SenderTask->TaskID);
ReceiverTask->TaskState = SendBlocked;
Colonel->Active = NULL;
}else{
//bwprintf(COM2,"doReceive,MsgLen:%d,SendMsgLen:%d\n\r",MsgLen,SendMsgLen);
//bwprintf(COM2,"doReceive: Receive Message from %d, result: %d\n\r",SenderTask->TaskID, Result);
if (Result == FAILURE){
ReceiverTask->RetVal = MSG_TRUNCATED;
return Result;
}
SenderTask->TaskState = ReplyBlocked;
//bwprintf(COM2,"doReceive: Sender%d Reply Blocked\n\r",TaskID);
Result = BufferPopHead(AllSendQ[GetMemoryIndexINT(ReceiverTask->TaskID)]);
//bwprintf(COM2,"doReceive: BufferPopHead %d\n\r");
int doReply(KernelStruct* Colonel, int TaskID, void* ReplyMsg, int ReplyLen) {
TD* ReplyTask = Colonel->Active; // me
int TIDIndex = GetMemoryIndexINT(TaskID);
TD* SenderTask = &(Colonel->Tasks[TIDIndex]);
if(TIDIndex >= MAX_NUM_TD){
bwprintf(COM2,"doReply: TID:%d invalid \n\r", TIDIndex);
SenderTask->RetVal = TASK_DNE;
return FAILURE;
}
if(GetAvailability(SenderTask)){
SenderTask->RetVal = TASK_DNE;
return FAILURE;
}
AP* Args = SenderTask->Args;
int Result;
void* SenderReply = Args->arg3;
int SenderLen = (int)Args->arg4;
if(SenderTask->TaskState != ReplyBlocked){
bwprintf(COM2,"doReply: Sender is not in ReplyBlocked state\n\r");
Colonel->Active->RetVal = SRR_FAILED;
return FAILURE;
}
Result = byteCopy(SenderReply, ReplyMsg, SenderLen, ReplyLen);
if(Result != SUCCESS){
SenderTask->RetVal = MSG_TRUNCATED;
return Result;
}
SenderTask->TaskState = Ready;
SenderTask->RetVal = ReplyLen;
Colonel->Active->RetVal = 0;
pushToScheduler(Colonel, SenderTask);
return SUCCESS;