Skip to content
Snippets Groups Projects
nameserver.c 2.58 KiB
Newer Older
antnh6@gmail.com's avatar
antnh6@gmail.com committed
#include <nameserver.h>
#include <tools.h>

antnh6@gmail.com's avatar
antnh6@gmail.com committed
void NameServer(){
  int TIDSeq[HASH_SIZE];
  char Names[HASH_SIZE][NAME_LENGTH_MAX+1];

Tom Feng's avatar
Tom Feng committed
  // set up send q
  int MyID = MyTid();
  int MyIndex = GetMemoryIndex(MyID);

  Buffer SendQ;
  int QStorage[MAX_NUM_TD];
  SendQ.Storage = (void *)QStorage;
  SendQ.size = MAX_NUM_TD;
  SendQ.Length = 0;
  SendQ.Head = 0;
  SendQ.Tail = 0;
  AllSendQ[MyIndex] = &SendQ;

antnh6@gmail.com's avatar
antnh6@gmail.com committed
  // initialize Names
  int i = 0;
  for(;i<257;i++){
    Names[i][NAME_LENGTH_MAX] = 0;
  }
  
  HT HashTable;
  HashTable.TidSequence = TIDSeq;
  HashTable.NameSequence = Names;
  HashTable.size = HASH_SIZE;

  Buffer SendQ;
  int storage[MAX_NUM_BUFFER];
  SendQ.Storage = (void *)(storage);
  SendQ.size = MAX_NUM_BUFFER;
  SendQ.Head = 0;
  SendQ.Tail = 0;
  SendQ.Length = 0;

  // some sort of while loop to receive and reply
Tom Feng's avatar
Tom Feng committed
  int TaskToReceive;
  NSReq ReceiveSlot;
  int Result;
  int StrLen;
  FOREVER{
    TaskToReceive = -1;
    BufferFIFO(SendQ,&TaskToReceive);
    if(TaskToReceive != -1){
      Receive(TaskToReceive,(void*) &ReceiveSlot, sizeof(NSReq));
      StrLen = stringLen(ReceiveSlot->Msg);
      if(ReceiveSlot.MsgType == WhoIs){
	Result = Lookup(&HashTable, ReceiveSlot->Msg,StrLen));
	Reply(TaskToReceive,(void *)(&Result), sizeof(int));
      }else if(ReceiveSlot.MsgType == RegAs){
	Result = InsertTo(&HashTable,ReceiveSlot->TaskID, ReceiveSlot->Msg,StrLen);
	Reply(TaskToReceive,(void *)(&Result), sizeof(int));
    }else{
      Pass();
    }
  }
antnh6@gmail.com's avatar
antnh6@gmail.com committed
}

int ActualWhoIS(AP* Args){
  asm volatile ("swi 9\n\t");
  register int r0 asm ("r0");
  int R = r0;
  return R;
}

int WhoIs(char* Name) {
Tom Feng's avatar
Tom Feng committed
  NSReq SendMsg;
  int ReplyTID;
  int Status;
  AP Args;
    SendMsg.MsgType = WhoIs; 
    stringCopy(SendMsg.Msg, Name, NS_MESSAGE_MAX_LENGTH);
    
Tom Feng's avatar
Tom Feng committed
    Args.arg0 = (void *)(&SendMsg);
    Args.arg1 = sizeof(NSReq);
    Args.arg2 = (void *)(&ReplyTID);
    Args.arg3 = sizeof(int);
    Status = ActualWhoIS(&Args)
Tom Feng's avatar
Tom Feng committed
    if (Status == sizeof(NSMsg)) return ReplyTID; 
    else return NAMESERVER_TID_INVALID;
}
int ActualRegAS(AP* Args){
  asm volatile ("swi 10\n\t");
  register int r0 asm ("r0");
  int R = r0;
  return R;
}
antnh6@gmail.com's avatar
antnh6@gmail.com committed

int RegisterAs (char* Name) {
Tom Feng's avatar
Tom Feng committed
    NSReqMsg SendMsg;
    int Result;
    int Status;
    AP Args;

Tom Feng's avatar
Tom Feng committed
    SendMsg.TaskID = MyTid();
    SendMsg.MsgType = RegisterAs; 
    stringCopy(SendMsg.Msg, Name, NS_MESSAGE_MAX_LENGTH);
    
Tom Feng's avatar
Tom Feng committed
    Args.arg0 = (void *)(&SendMsg);
    Args.arg1 = sizeof(NSMsg);
Tom Feng's avatar
Tom Feng committed
    Args.arg2 = (void *)(&Result);
    Args.arg3 = sizeof(int);
    Status = ActualRegAS(&Args);
Tom Feng's avatar
Tom Feng committed
    if (Status == sizeof(int)) return Result;
    else return NAMESERVER_TID_INVALID;