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; }
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); }
uint32_t DefUseManager::NumUsers(uint32_t id) const { return NumUsers(GetDef(id)); }