Skip to content
Snippets Groups Projects
nameserver.c 3.73 KiB
Newer Older
Tom Feng's avatar
Tom Feng committed
#include <buffer.h>
#include <bwio.h>
#include <hash-table.h>
antnh6@gmail.com's avatar
antnh6@gmail.com committed
#include <nameserver.h>
Tom Feng's avatar
Tom Feng committed
#include <syscall.h>
#include <td.h>
antnh6@gmail.com's avatar
antnh6@gmail.com committed
#include <tools.h>
Tom Feng's avatar
Tom Feng committed
#include <types.h>
antnh6@gmail.com's avatar
antnh6@gmail.com committed

Tom Feng's avatar
Tom Feng committed
extern Buffer*** TotalSendQ;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
void NameServer(){
  int TIDSeq[HASH_SIZE];
Tom Feng's avatar
Tom Feng committed
  int i = 0;
  for(;i<HASH_SIZE;i++){
    TIDSeq[i] = -1;
  }
  char Names[HASH_SIZE*(NAME_LENGTH_MAX+1)];
antnh6@gmail.com's avatar
antnh6@gmail.com committed

Tom Feng's avatar
Tom Feng committed
  // set up send q
  int MyID = MyTid();
Tom Feng's avatar
Tom Feng committed
  int MyIndex = GetMemoryIndexINT(MyID);
  Buffer** AllSendQ = GetAllSendQ();
Tom Feng's avatar
Tom Feng committed
  bwprintf(COM2,"NS Index %d\n\r",MyIndex);
  bwprintf(COM2,"NS AllSendQ add%d\n\r",AllSendQ);
Tom Feng's avatar
Tom Feng committed
  Buffer SendQ;
  int QStorage[MAX_NUM_TD];
  SendQ.Storage = (void *)QStorage;
Tom Feng's avatar
Tom Feng committed
  SendQ.Size = MAX_NUM_TD;
Tom Feng's avatar
Tom Feng committed
  SendQ.Length = 0;
  SendQ.Head = 0;
  SendQ.Tail = 0;
  AllSendQ[MyIndex] = &SendQ;

Tom Feng's avatar
Tom Feng committed
  
  bwprintf(COM2,"SendQ Setup\n\r");
antnh6@gmail.com's avatar
antnh6@gmail.com committed
  // initialize Names
Tom Feng's avatar
Tom Feng committed
  for(i=0;i<HASH_SIZE;i++){
    Names[i*(NAME_LENGTH_MAX+1)-1] = 0;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
  }
  
  HT HashTable;
  HashTable.TidSequence = TIDSeq;
  HashTable.NameSequence = Names;
  HashTable.size = HASH_SIZE;
Tom Feng's avatar
Tom Feng committed
  
  bwprintf(COM2,"HashTable Setup\n\r");
  
antnh6@gmail.com's avatar
antnh6@gmail.com committed
  // some sort of while loop to receive and reply
Tom Feng's avatar
Tom Feng committed
  int TaskToReceive;
  NSReq ReceiveSlot;
  int Result;
  int StrLen;
Tom Feng's avatar
Tom Feng committed

Tom Feng's avatar
Tom Feng committed
  FOREVER{
Tom Feng's avatar
Tom Feng committed
    TaskToReceive = NULL;
    BufferFIFO(&SendQ,(void *)&TaskToReceive);
    bwprintf(COM2,"NS_LOOP: Got %d from SendQ\n\r",TaskToReceive);
    if(TaskToReceive != NULL){
      Result = Receive(TaskToReceive,(void*) &ReceiveSlot, sizeof(NSReq));
      bwprintf(COM2,"NS_LOOP:Task %d Receive Result: %d\n\r",TaskToReceive,Result);
      bwprintf(COM2,"NS_LOOP: Msg:%s\n\r",ReceiveSlot.Msg);
Tom Feng's avatar
Tom Feng committed
      StrLen = stringLen(ReceiveSlot.Msg);
      //bwprintf(COM2,"NS_LOOP:after string length function\n\r");
      if(ReceiveSlot.MsgType == WhoIS){
	//bwprintf(COM2,"NS_LOOP: msg type == %d\n\r",ReceiveSlot.MsgType);
	//bwprintf(COM2,"NS_LOOP: before hash look up, Sender: %d\n\r",TaskToReceive);
Tom Feng's avatar
Tom Feng committed
	Result = Lookup(&HashTable, ReceiveSlot.Msg,StrLen);
	//bwprintf(COM2,"NS_LOOP: hash look up result %d\n\r",Result);
Tom Feng's avatar
Tom Feng committed
	Reply(TaskToReceive,(void *)(&Result), sizeof(int));
Tom Feng's avatar
Tom Feng committed
      }else if(ReceiveSlot.MsgType == RegAS){
	Result = InsertTo(&HashTable,ReceiveSlot.TaskID, ReceiveSlot.Msg,StrLen);
	bwprintf(COM2,"NS_USR: Inserted to %d, %d, %s\n\r",Result, &(Names[Result*17]),(Names + (Result * 17)));
Tom Feng's avatar
Tom Feng committed
	Reply(TaskToReceive,(void *)(&Result), sizeof(int));
Tom Feng's avatar
Tom Feng committed
      }
Tom Feng's avatar
Tom Feng committed
    }else{
Tom Feng's avatar
Tom Feng committed
      bwprintf(COM2,"NS has no sender, pass\n\r");
Tom Feng's avatar
Tom Feng committed
      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 SendReq;
Tom Feng's avatar
Tom Feng committed
  int ReplyTID;
  int Status;
  AP Args;
Tom Feng's avatar
Tom Feng committed
  
  stringCopy(SendReq.Msg, Name, NS_MESSAGE_MAX_LENGTH);
  bwprintf(COM2,"WhoIs: Name: %s, SendReq.Msg: %s\n\r",Name, SendReq.Msg);
Tom Feng's avatar
Tom Feng committed
  SendReq.MsgType = WhoIS;
  bwprintf(COM2,"WhoIs: MsgType: %d\n\r",SendReq.MsgType);
  
  Args.arg1 = (void *)(&SendReq);
  Args.arg2 = (void *)sizeof(NSReq);
  Args.arg3 = (void *)(&ReplyTID);
  Args.arg4 = (void *)sizeof(int);
Tom Feng's avatar
Tom Feng committed
  bwprintf(COM2,"NS_USR: WhoIs %s\n\r",Name);
  Status = ActualWhoIS(&Args);
  
  if (Status == sizeof(int)) return ReplyTID; 
  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
  NSReq SendReq;
  int Result;
  int Status;
  AP Args;
  
  SendReq.TaskID = MyTid();
  stringCopy(SendReq.Msg, Name, NS_MESSAGE_MAX_LENGTH);
  SendReq.MsgType = RegAS;
  bwprintf(COM2,"RegAS: MsgType %d\n\r",RegAS);
  
  Args.arg1 = (void *)(&SendReq);
  Args.arg2 = (void *)sizeof(NSReq);
  Args.arg3 = (void *)(&Result);
  Args.arg4 = (void *)sizeof(int);
Tom Feng's avatar
Tom Feng committed
  
  bwprintf(COM2,"NS_USR: registering %s\n\r",Name);
  Status = ActualRegAS(&Args);
  
  if (Status == sizeof(int)) return Result;
  return NAMESERVER_TID_INVALID;