Skip to content
Snippets Groups Projects
ipc.c 4.29 KiB
Newer Older
Tom Feng's avatar
Tom Feng committed
#include <bwio.h>
#include <buffer.h>
#include <ipc.h>
#include <kernel.h>
Tom Feng's avatar
Tom Feng committed
#include <scheduler.h>
#include <td.h>
#include <tools.h>
antnh6@gmail.com's avatar
antnh6@gmail.com committed
#include <types.h>
Tom Feng's avatar
Tom Feng committed

int doSend(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen, void* ReplyMsg, int ReplyLen) {
  Colonel->Active->RetVal = SRR_FAILED;
  Buffer** AllSendQ = Colonel->AllSendQ;
Tom Feng's avatar
Tom Feng committed
  // check the TD availability
  int TIDIndex = GetMemoryIndexINT(TaskID);
  bwprintf(COM2,"doSend: TID: %d, TID Index:%d\n\r",TaskID, TIDIndex);
Tom Feng's avatar
Tom Feng committed
  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) {
Tom Feng's avatar
Tom Feng committed
    AP* Args = ReceiverTask->Args;
    int *ReceiverSlot = (int *)Args->arg1;
    int ReceiverLen = (int)(Args->arg2);
Tom Feng's avatar
Tom Feng committed
    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;
Tom Feng's avatar
Tom Feng committed
    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;
Tom Feng's avatar
Tom Feng committed
    bwprintf(COM2,"doSend: inside k2\n\r");
Tom Feng's avatar
Tom Feng committed
    FeedBuffer(AllSendQ[TIDIndex],(void *)(SenderTask->TaskID));
Tom Feng's avatar
Tom Feng committed
    bwprintf(COM2,"doSend: Guess 4, after feed buffer\n\r");
Tom Feng's avatar
Tom Feng committed
  }
  Colonel->Active = NULL;
  return SUCCESS;
}

int doReceive(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen) {
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    TD* ReceiverTask = Colonel->Active; // me
Tom Feng's avatar
Tom Feng committed
    int TIDIndex = GetMemoryIndexINT(TaskID);
    TD* SenderTask = &(Colonel->Tasks[TIDIndex]);
    Buffer** AllSendQ = Colonel->AllSendQ;
Tom Feng's avatar
Tom Feng committed
    int Result;
    AP* Args = SenderTask->Args;
antnh6@gmail.com's avatar
antnh6@gmail.com committed

    void* SendMsg = Args->arg1;
    int SendMsgLen = (int)Args->arg2;

Tom Feng's avatar
Tom Feng committed
    if (SenderTask->TaskState!= ReceiveBlocked) {
      //bwprintf(COM2,"doReceive: Sender %d not send yet\n\r",SenderTask->TaskID);
Tom Feng's avatar
Tom Feng committed
      ReceiverTask->TaskState = SendBlocked;
      Colonel->Active = NULL;
    }else{
      //bwprintf(COM2,"doReceive,MsgLen:%d,SendMsgLen:%d\n\r",MsgLen,SendMsgLen);
Tom Feng's avatar
Tom Feng committed
      Result = byteCopy(Msg, SendMsg, MsgLen, SendMsgLen);
      //bwprintf(COM2,"doReceive: Receive Message from %d, result: %d\n\r",SenderTask->TaskID, Result);
Tom Feng's avatar
Tom Feng committed
      if (Result == FAILURE){
	ReceiverTask->RetVal = MSG_TRUNCATED;
	return Result;
      }
      SenderTask->TaskState = ReplyBlocked;
      //bwprintf(COM2,"doReceive: Sender%d Reply Blocked\n\r",TaskID);
Tom Feng's avatar
Tom Feng committed
      Result = BufferPopHead(AllSendQ[GetMemoryIndexINT(ReceiverTask->TaskID)]);
      //bwprintf(COM2,"doReceive: BufferPopHead %d\n\r");
Tom Feng's avatar
Tom Feng committed
      Colonel->Active->RetVal = MsgLen;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    }
    return SUCCESS;
Tom Feng's avatar
Tom Feng committed
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);
Tom Feng's avatar
Tom Feng committed
    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");
Tom Feng's avatar
Tom Feng committed
    Colonel->Active->RetVal = SRR_FAILED;
    return FAILURE;
  }
  
  Result = byteCopy(SenderReply, ReplyMsg, SenderLen, ReplyLen);
  if(Result != SUCCESS){
    bwprintf(COM2,"doReply: MSG_TRUNCATED\n\r");
Tom Feng's avatar
Tom Feng committed
    SenderTask->RetVal = MSG_TRUNCATED;
    return Result;
  }
  
  SenderTask->TaskState = Ready;
  SenderTask->RetVal = ReplyLen;
  Colonel->Active->RetVal = 0;
  pushToScheduler(Colonel, SenderTask);
  return SUCCESS;