LinkedListNavigator<string>* UserNetwork::FindPath(string start, string end) {
	User* startU = users->Get(start);
	if (startU == NULL || start == end) return NULL;
	HashTable<UserAndPath>* visited = new HashTable<UserAndPath>(NumUsers());
	LinkedListNavigator<User>* visitQueue = new LinkedListNavigator<User>();
	visitQueue->AddHead(startU);

	UserAndPath* found;
	visited->Add(start, new UserAndPath(startU));

	while ((found = visited->Get(end)) == NULL) {
		if (visitQueue->Length() <= 0) {
			delete visitQueue;
			delete visited;
			return NULL;
		}
		DLinkedListNode<User>* n = visitQueue->RemoveTail();
		User* next = n->GetValue();
		n->SetValue(NULL);
		delete n;
		next->Visit(visitQueue, visited, this);
	}

	LinkedListNavigator<string>* path = found->path;
	found->path = NULL;
	visitQueue->RemoveReferences();
	visitQueue->DeleteList();
	delete visitQueue;
	delete visited;

	path->AddHead(new string(end));
	return path;
}
예제 #2
0
int main(int argc, char **argv)
{
  int options;           /* stores getopt() return status */
  extern char *optarg;   /* contains argument passed to an option */
  extern int optind;     /* stores the argv index of the next arg */

  long hostRes = 0;
  long count = 257;
  char hostname[257];
  char rateBuf[10];
  char expiresBuf[20];
  char *tmpTopic = NULL;
  char *routerUrl = NULL;  /* initial value of the router url */
  int updateRate = 5;      /* default value of the update rate */

  knserv_ref knServer;
  knevent_mref knEvent;
  knstr_ref uri, topic, rate, expires;

  /* Parse args and get options.  -r for pubsub server url
   * and -u for update rate.  Anything else will print a usage message
   */

  while ((options = getopt(argc, argv, "r:u:")) != EOF) {
        switch (options) {
        case 'r':
            routerUrl = optarg;  /* store arg in routerUrl */
            break;
        case 'u':
            updateRate = atoi(optarg); /* convert str to int and store */
            break;
        default:
            PrintUsage();
            exit(1);
            break;
        }
  }

      
  /* Check to make sure a pubsub server url was passed,
   * if not print usage message.
   */

  if(routerUrl == NULL) {
        PrintUsage();
        exit(1);
  }


  /* Get hostname from sysinfo and create the tmpTopic string. */

  if((hostRes = sysinfo(SI_HOSTNAME, hostname, count)) != -1) {
        tmpTopic = (char *) malloc(strlen(hostname) + strlen("/what/pocketnoc/"));
        sprintf(tmpTopic, "/what/pocketnoc/%s", hostname);
  } else {
        perror("Can't get hostname.");
        exit(1);
  }


  /* Create the uri, tmpTopic, rate, expires, and knserver using 
   * strings received from the cmd line options.
   */

  sprintf(rateBuf, "%i", updateRate);
  sprintf(expiresBuf, "%i", updateRate * 2);

  uri = knstr_create_with_cstr(routerUrl);
  topic = knstr_create_with_cstr(tmpTopic);
  rate = knstr_create_with_cstr(rateBuf);
  expires = knstr_create_with_cstr(expiresBuf);

  free(tmpTopic);

  knServer = knserv_create(uri, NULL, NULL);

  kn_release(uri);

  knEvent = knevent_mcreate((size_t) 1024);
  
  /* Main while loop, permanently execute until a sigkill
   * or crash occurs.  creates an event, gets sysInfo, 
   * populates event w/ sysInfo, then post.  
   */

  daemon_init();

  while(1) {

    CpuUsage(knEvent);
    MemoryUsage(knEvent);
    SwapUsage(knEvent);
    LoadAvg(knEvent);
    NumUsers(knEvent);

    knevent_set(knEvent, KNSTR("os"), KNSTR("solaris"));
    knevent_set(knEvent, KNSTR("rate"), rate);
    knevent_set(knEvent, KNSTR("kn_expires"), expires);

    kn_publish(knServer, knEvent, topic, NULL, NULL);

    /* Pause for amount of seconds passed as an argument 
     * (5 by default) and then iterate again.
     */
        
    sleep(updateRate);
  }


  /* Release all the other kn_StringRef vars. */

  kn_release(topic);
  kn_release(rate);
  kn_release(expires);
  kn_release(knEvent);
  kn_release(knServer);
}
예제 #3
0
uint32_t DefUseManager::NumUsers(uint32_t id) const {
  return NumUsers(GetDef(id));
}