Skip to content
Snippets Groups Projects
ipc.c 1.78 KiB
Newer Older
#include <ipc.h>
#include <kernel.h>
antnh6@gmail.com's avatar
antnh6@gmail.com committed
#include <types.h>

int doSend(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen, void* Reply, int ReplyLen) {
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    int Result;
    TD* ReceiverTask = &(Colonel->Tasks[GetMemoryIndex(TaskID)]);
    TD* SenderTask = Colonel->Active;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    AP* Args = ReceiverTask->Args;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    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);
antnh6@gmail.com's avatar
antnh6@gmail.com committed
        FeedBuffer(AllSendQ[GetMemoryIndex(Colonel->Active->TaskID)],TaskID);
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    return SUCCESS;
}

int doReceive(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen) {
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    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;

antnh6@gmail.com's avatar
antnh6@gmail.com committed
    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) {
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    TD* SenderTask = &(Colonel->Tasks[GetMemoryIndex(TaskID)]);

    AP* Args = SenderTask->Args;

    Args->arg0 = (int)MyTid();
    Args->arg1 = Reply;
    Args->arg2 = (int) ReplyLen
antnh6@gmail.com's avatar
antnh6@gmail.com committed
    SenderTask->TaskState = Ready;
    pushToScheduler(SenderTask);
    return SUCCESS;