/* our main stub */ int main(int argc, char **argv) { int i = 0, p_tmp = 0; const char *res = NULL, *strdat[] = { "T1", "T2", "T3", "T5", "T6", "T3" }; int strprio[] = { 2, 10, 3, 9, 9, 2 }; pq_ptr pq = NULL; pq = pq_create(2*PQ_MIN_SZ); /* push all 5 tasks into q */ for (i = 0; i < 6; i++) pq_push(pq, (char *)strdat[i], strprio[i], FALSE); pq_decrease_priority(pq, (char *)strdat[2], 0); /* pop them and print them */ for(i = 0; i < 6; i++) { res = pq_pop(pq, &p_tmp); printf("Element: %s with priority: %d\n", res, p_tmp); } /* clear the queue */ pq_destroy(pq); return(EXIT_SUCCESS); }
void pq_out_clear(PktOutQueue *pq) { PktOut *pkt; pq->pqb.ic = NULL; while ((pkt = pq_pop(pq)) != NULL) ssh_free_pktout(pkt); }
int main() { // memset(pqueue, 0LL, sizeof(pqueue)); for (int i = 0; i < 3; ++i) { pqueue[i] = 0; } pq_push(0); pq_push(1); printf("popped %4d\n", pq_pop()); printf("popped %4d\n", pq_pop()); printf("popped %4d\n", pq_pop()); pq_print(); // // test for __builtin_ctzll // printf("%d\n", __builtin_ctzll(0LL)); // 64 // printf("%d\n", __builtin_ctzll(1LL)); // 0 // printf("%d\n", __builtin_ctzll(8LL)); // 3 }
void pq_in_clear(PktInQueue *pq) { PktIn *pkt; pq->pqb.ic = NULL; while ((pkt = pq_pop(pq)) != NULL) { /* No need to actually free these packets: pq_pop on a * PktInQueue will automatically move them to the free * queue. */ } }
int find_closest_on_hm_with_path(struct t_map* map, uint8_t sx, uint8_t sy, uint8_t* heatmap, uint8_t* viewarr, uint8_t* o_x, uint8_t* o_y) { uint16_t temp_patharr [ HEATMAP_SIZE ]; memset(temp_patharr, 255, sizeof temp_patharr); temp_patharr [sy * MAP_WIDTH + sx] = 0; struct pqueue_t* pq = pq_create(); pq_push(pq, (void*)((size_t)sy * MAP_WIDTH + sx + 1),0); // create a queue, set the source area to zero. //assumes the rest is already filled with 0xFFFF while (pq_size(pq)) { // while not empty int yx = (int)(size_t)(pq_pop(pq,NULL)) - 1; int x = (yx % MAP_WIDTH); int y = (yx / MAP_WIDTH); if (heatmap[yx]) { pq_destroy(pq); *o_y = y; *o_x = x; return 0; } int dir=0; //x and y now contain element with lowest priority for (dir=0; dir < MD_COUNT; dir++) { // for all neighbors int nx = x + movediff[dir][0]; int ny = y + movediff[dir][1]; if (!vtile(nx,ny)) continue; //this should be a valid tile! int cost = getcost(map,NULL,nx,ny,viewarr); if (cost == -1) continue; if (dir % 2) { cost = (cost * 3) / 2; } int alt = temp_patharr[y * MAP_WIDTH + x] + cost; if (alt < temp_patharr[ny * MAP_WIDTH + nx]) { temp_patharr[ny * MAP_WIDTH + nx] = alt; pq_push (pq, (void*) (ny * MAP_WIDTH + nx + 1), alt); } } } pq_destroy(pq); *o_x = 255; *o_y = 255; return 0; }
/** * lists processes in the form [Q ... ] * dirty function */ void list_proc(priority_queue pq) { printf("[Q"); int i, sz = pq_size(pq); process *procs[sz]; int pris[sz]; for(i = 0; i < sz; ++i) { procs[i] = pq_pop(pq, &pris[i]); printf(" %c", procs[i]->num); } for(i = 0; i < sz; ++i) pq_push(pq, procs[i], pris[i]); printf("]\n"); }
// run the simulation void run_sim() { if (FEL == NULL) return; // as long as the priority queue is not empty // remove its top element, and execute its callback // on the event data while (simtime <= 365) { SimEvent *se = (SimEvent *) pq_pop(FEL); simtime = se->timestamp; callback(se->data); free(se); } // free the pq pq_free(FEL); FEL = NULL; }
/************************************************************* * Support Functionality *************************************************************/ static int compute_shortest_path_dijkstra(netloc_data_collection_handle_t *handle, netloc_node_t *src_node, netloc_node_t *dest_node, int *num_edges, netloc_edge_t ***edges) { int exit_status = NETLOC_SUCCESS; int i; pq_queue_t *queue = NULL; int *distance = NULL; bool *not_seen = NULL; netloc_node_t *node_u = NULL; netloc_node_t *node_v = NULL; netloc_node_t **prev_node = NULL; netloc_edge_t **prev_edge = NULL; int alt; int idx_u, idx_v; int num_rev_edges; netloc_edge_t **rev_edges = NULL; struct netloc_dt_lookup_table_iterator *hti = NULL; netloc_node_t *cur_node = NULL; unsigned long key_int; // Just in case things go poorly below (*num_edges) = 0; (*edges) = NULL; /* * Allocate some data structures */ queue = pq_queue_t_construct(); if( NULL == queue ) { fprintf(stderr, "Error: Failed to allocate the queue\n"); exit_status = NETLOC_ERROR; goto cleanup; } distance = (int*)malloc(sizeof(int) * netloc_lookup_table_size(handle->node_list)); if( NULL == distance ) { fprintf(stderr, "Error: Failed to allocate the distance array\n"); exit_status = NETLOC_ERROR; goto cleanup; } not_seen = (bool*)malloc(sizeof(bool) * netloc_lookup_table_size(handle->node_list)); if( NULL == not_seen ) { fprintf(stderr, "Error: Failed to allocate the 'not_seen' array\n"); exit_status = NETLOC_ERROR; goto cleanup; } prev_node = (netloc_node_t**)malloc(sizeof(netloc_node_t*) * netloc_lookup_table_size(handle->node_list)); if( NULL == prev_node ) { fprintf(stderr, "Error: Failed to allocate the 'prev_node' array\n"); exit_status = NETLOC_ERROR; goto cleanup; } prev_edge = (netloc_edge_t**)malloc(sizeof(netloc_edge_t*) * netloc_lookup_table_size(handle->node_list)); if( NULL == prev_edge ) { fprintf(stderr, "Error: Failed to allocate the 'prev_edge' array\n"); exit_status = NETLOC_ERROR; goto cleanup; } /* * Initialize the data structures */ // Make sure to initialize the arrays for( i = 0; i < netloc_lookup_table_size(handle->node_list); ++i){ distance[i] = INT_MAX; not_seen[i] = true; prev_node[i] = NULL; prev_edge[i] = NULL; } i = 0; hti = netloc_dt_lookup_table_iterator_t_construct(handle->node_list); while( !netloc_lookup_table_iterator_at_end(hti) ) { cur_node = (netloc_node_t*)netloc_lookup_table_iterator_next_entry(hti); if( NULL == cur_node ) { break; } if( cur_node == src_node ) { pq_push(queue, 0, cur_node); distance[i] = 0; } else { pq_push(queue, INT_MAX, cur_node); distance[i] = INT_MAX; } not_seen[i] = true; prev_node[i] = NULL; prev_edge[i] = NULL; cur_node->__uid__ = i; ++i; } /* * Search */ while( !pq_is_empty(queue) ) { //pq_dump(queue); // Grab the next hop node_u = pq_pop(queue); // Mark as seen idx_u = -1; i = 0; idx_u = node_u->__uid__; not_seen[idx_u] = false; // For all the edges from this node for(i = 0; i < node_u->num_edges; ++i ) { node_v = NULL; idx_v = -1; // Lookup the "dest" node node_v = node_u->edges[i]->dest_node; idx_v = node_v->__uid__; // If the node has been seen, skip if( !not_seen[idx_v] ) { continue; } // Otherwise check to see if we found a shorter path // Future Work: Add a weight factor other than 1. // Maybe calculated based on speed/width alt = distance[idx_u] + 1; if( alt < distance[idx_v] ) { distance[idx_v] = alt; prev_node[idx_v] = node_u; prev_edge[idx_v] = node_u->edges[i]; // Adjust the priority queue as needed pq_reorder(queue, alt, node_v); } } } /* * Reconstruct the path by picking up the edges * The edges will be in reverse order (dest to source). */ num_rev_edges = 0; rev_edges = NULL; // Find last hop SUPPORT_CONVERT_ADDR_TO_INT(dest_node->physical_id, handle->network->network_type, key_int); node_u = netloc_lookup_table_access_with_int( handle->node_list, dest_node->physical_id, key_int); idx_u = node_u->__uid__; node_v = NULL; idx_v = -1; while( prev_node[idx_u] != NULL ) { // Find the linking edge if( node_u != dest_node) { for(i = 0; i < node_u->num_edges; ++i ) { if( node_v->physical_id_int == node_u->edges[i]->dest_node->physical_id_int ) { ++num_rev_edges; rev_edges = (netloc_edge_t**)realloc(rev_edges, sizeof(netloc_edge_t*) * num_rev_edges); if( NULL == rev_edges ) { fprintf(stderr, "Error: Failed to re-allocate the 'rev_edges' array with %d elements\n", num_rev_edges); exit_status = NETLOC_ERROR; goto cleanup; } rev_edges[num_rev_edges-1] = node_u->edges[i]; break; } } } node_v = node_u; idx_v = idx_u; // Find the next node SUPPORT_CONVERT_ADDR_TO_INT(prev_node[idx_u]->physical_id, handle->network->network_type, key_int); node_u = netloc_lookup_table_access_with_int( handle->node_list, prev_node[idx_u]->physical_id, key_int); idx_u = node_u->__uid__; } for(i = 0; i < src_node->num_edges; ++i ) { if( NULL == node_v ) { fprintf(stderr, "Error: This should never happen, but node_v is NULL at line %d in file %s\n", __LINE__, __FILE__); exit_status = NETLOC_ERROR; goto cleanup; } if( node_v->physical_id_int == src_node->edges[i]->dest_node->physical_id_int ) { ++num_rev_edges; rev_edges = (netloc_edge_t**)realloc(rev_edges, sizeof(netloc_edge_t*) * num_rev_edges); if( NULL == rev_edges ) { fprintf(stderr, "Error: Failed to re-allocate the 'rev_edges' array with %d elements\n", num_rev_edges); exit_status = NETLOC_ERROR; goto cleanup; } rev_edges[num_rev_edges-1] = node_u->edges[i]; break; } } /* * Copy the edges back in correct order */ (*num_edges) = num_rev_edges; (*edges) = (netloc_edge_t**)malloc(sizeof(netloc_edge_t*) * (*num_edges)); if( NULL == (*edges) ) { fprintf(stderr, "Error: Failed to allocate the edges array\n"); exit_status = NETLOC_ERROR; goto cleanup; } for( i = 0; i < num_rev_edges; ++i ) { (*edges)[i] = rev_edges[num_rev_edges-1-i]; //printf("DEBUG: \t Edge: %s\n", netloc_pretty_print_edge_t( (*edges)[i] ) ); } /* * Cleanup */ cleanup: if( NULL != queue ) { pq_queue_t_destruct(queue); queue = NULL; } if( NULL != rev_edges ) { free(rev_edges); rev_edges = NULL; } if( NULL != distance ) { free(distance); distance = NULL; } if( NULL != not_seen ) { free(not_seen); not_seen = NULL; } if( NULL != prev_node ) { free(prev_node); prev_node = NULL; } if( NULL != prev_edge ) { free(prev_edge); prev_edge = NULL; } netloc_dt_lookup_table_iterator_t_destruct(hti); return exit_status; }
/* @function main */ int main(int argc, char** argv) { /*test pq*/ struct tnode* p = NULL; struct tnode* lc, *rc; int NCHAR = 256; /*number of characters*/ int i = 0; unsigned char c = 0; int usedAsciiKind = 0; float totalCount = 0.f; int count[256] = { 0 }; float freq[256] = { 0.f }; char INPUT_FILE[256]; char CODE_FILE[256]; char OUTPUT_FILE[256]; FILE* fin = NULL; FILE* fout = NULL; FILE* fcode = NULL; /*zero out code*/ memset(code, 0, sizeof(code)); if (argc == 1) { printf("USAGE : %s file_to_compress", argv[0]); return 0; } else { strcpy_s(INPUT_FILE, _countof(INPUT_FILE), argv[1]); strcpy_s(OUTPUT_FILE, _countof(OUTPUT_FILE), argv[1]); strcat_s(OUTPUT_FILE, _countof(OUTPUT_FILE), ".huff"); strcpy_s(CODE_FILE, _countof(CODE_FILE), argv[1]); strcat_s(CODE_FILE, _countof(CODE_FILE), ".code"); } fopen_s(&fin, INPUT_FILE, "rb"); fseek(fin, 0, SEEK_END); streamLength = ftell(fin); rewind(fin); //일단 빈도 통계를 내야 하므로 처음부터 끝까지 읽어가며 각 아스키 캐릭터들의 수를 센다 //streamLength = 0; while (1) { if (feof(fin)) break; fread_s(&c, sizeof(unsigned char), sizeof(unsigned char), 1, fin); totalCount += 1.; count[c]++; //streamLength++; } fclose(fin); qhead = NULL; /*initialize with freq*/ for (i = 0; i<NCHAR; i++) { if (count[i] > 0) { pq_insert(talloc(i, count[i])); usedAsciiKind++; } } /*build tree*/ for (i = 0; i < (usedAsciiKind - 1); i++) { lc = pq_pop(); rc = pq_pop(); /*create parent*/ p = talloc(0, lc->appear + rc->appear); /*set parent link*/ lc->parent = rc->parent = p; /*set child link*/ p->right = rc; p->left = lc; /*make it non-leaf*/ p->isleaf = 0; /*add the new node to the queue*/ pq_insert(p); } /*get root*/ root = pq_pop(); /*build code*/ generate_code(root, 0); /*output code*/ fopen_s(&fout, CODE_FILE, "wb"); //dump_code(fout); dump_code_bin(fout); fclose(fout); /*encode a sample string*/ fopen_s(&fin, INPUT_FILE, "rb"); fopen_s(&fout, OUTPUT_FILE, "wb"); encodeBin(fin, fout); fclose(fin); fclose(fout); /*TODO: clear resources*/ freetree(root); freequeue(qhead); return 0; }
/** * rr simulation */ void s_rr(priority_queue q, v_memory vm, int num, int cs_t, float *a_wait_t, int *total_cs, int *total_t, int *total_d, int t_memmove, int t_slice) { int cur_t = 0; // current time int cur_cs_t = cs_t + 1; // current context switch time (-1 when not switching) int cur_s_t = 0; // current time-slice time int in_use = 0; // boolean for processor usage int procs_t[num]; // processor countdowns process *procs[num]; // processes in use process *tmp; // process to pop from waiting queue int active; // active processor in use int pri = 0; // rr priority (fcfs) char *algo; // fitting algorithm priority_queue pq; // processes queue // zero arrays int i; for(i = 0; i < num; ++i) { procs_t[i] = 0; procs[i] = 0; } // initialize stuff pq = pq_new(0); // print vm algorithm switch(vm.algo) { case 'f': algo = "First-Fit"; break; case 'n': algo = "Next-Fit"; break; case 'b': algo = "Best-Fit"; break; default: break; } printf("time 0ms: Simulator started for RR (t_slice %d) and %s\n", t_slice, algo); while(1) { // check process arrival times tmp = NULL; while(tmp == NULL) { tmp = pq_peek(q, NULL); if(tmp && tmp->a_t == cur_t) { int rc; // add process to system tmp = pq_pop(q, NULL); pq_push(pq, tmp, ++pri); rc = vm_add(&vm, *tmp); if(rc != 1) { // (defrag) event_call("", cur_t, tmp->num, 'a', NULL); event_call("", cur_t, 0, 'b', NULL); event_call("", cur_t, 0, '9', NULL); vm_print(vm); *total_d += vm_defrag(&vm, 10); event_call("", cur_t, 0, 'c', NULL); event_call("", cur_t, 0, '9', NULL); vm_print(vm); vm_add(&vm, *tmp); } // print event_call("", cur_t, tmp->num, '8', pq); event_call("", cur_t, 0, '9', NULL); vm_print(vm); tmp = NULL; } else { tmp = NULL; break; } } // switching context if(cur_cs_t > 0) --cur_cs_t; // switched context if(cur_cs_t == 0) { --cur_cs_t; // check if open process available and run it if possible if((pq_size(pq) != 0) && !in_use) { int procs_u = 0; while(procs[procs_u] != 0) ++procs_u; // get next open index in_use = 1; procs[procs_u] = pq_pop(pq, NULL); // pop the next open process change_status(procs[procs_u], 1); // set status to using cpu procs_t[procs_u] = procs[procs_u]->b_t + 1; // start process timer cur_s_t = t_slice + 1; // start t_slice timer if(procs[procs_u]->cur_t > 0) procs_t[procs_u] = procs[procs_u]->cur_t; active = procs_u; --procs[procs_u]->b_n; event_call("", cur_t, procs[procs_u]->num, '1', pq); } } // process timers for(i = 0; i < num; ++i) { if(procs[i] != 0) { // check timers if(procs_t[i] > 0) { --procs_t[i]; if(cur_s_t > 0) --cur_s_t; // handle timers if(procs_t[i] == 0) { // completed cpu burst if(procs[i]->status == 1) { change_status(procs[i], 2); procs_t[i] = procs[i]->io_t; if(procs[i]->cur_t > 0) procs[i]->cur_t = 0; // reset cur_t in_use = 0; cur_cs_t = cs_t; ++*total_cs; // if process does not require i/o if(procs_t[i] == 0) { if(procs[i]->b_n <= 0) { vm_del(&vm, procs[i]->num); event_call("", cur_t, procs[i]->num, '5', pq); event_call("", cur_t, procs[i]->num, 'd', NULL); event_call("", cur_t, procs[i]->num, '9', NULL); vm_print(vm); change_status(procs[i], 3); // terminate } else { change_status(procs[i], 0); pq_push(pq, procs[i], ++pri); event_call("", cur_t, procs[i]->num, '2', pq); procs[i] = 0; } } else { if(procs[i]->b_n != 0) { event_call("", cur_t, procs[i]->num, '2', pq); event_call("", cur_t, procs[i]->num, '3', pq); } // terminate process else { procs_t[i] = 0; change_status(procs[i], 3); vm_del(&vm, procs[i]->num); event_call("", cur_t, procs[i]->num, '5', pq); event_call("", cur_t, procs[i]->num, 'd', NULL); event_call("", cur_t, procs[i]->num, '9', NULL); vm_print(vm); } } } // completed i/o else if(procs[i]->status == 2) { change_status(procs[i], 0); if(!in_use) cur_cs_t = cs_t; // finished burst if(procs[i]->b_n <= 0) { // terminate on last burst if(pq_size(pq) != 0) { vm_del(&vm, procs[i]->num); event_call("", cur_t, procs[i]->num, '5', pq); event_call("", cur_t, procs[i]->num, 'd', NULL); event_call("", cur_t, procs[i]->num, '9', NULL); vm_print(vm); } change_status(procs[i], 3); } else { pq_push(pq, procs[i], ++pri); event_call("", cur_t, procs[i]->num, '4', pq); procs[i] = 0; } } } // check time slice expiration else if(cur_s_t == 0 && procs[i]->status == 1) { if(pq_size(pq) != 0) { procs[active]->cur_t = procs_t[active]; // store the current processing time ++procs[active]->b_n; // restore burst number since it hasnt finished change_status(procs[active], 0); // reset status pq_push(pq, procs[active], ++pri); // push back into queue preempt_call(cur_t, procs[active]->num, '0', pq); // print cur_cs_t = cs_t; // switch contexts ++*total_cs; // void existing processors procs_t[active] = 0; procs[active] = 0; in_use = 0; cur_s_t = -1; } } } } } // get statistics from all processes for(i = 1; i <= pq_size(pq); ++i) { if(((process*)(pq->buf[i].data))->status == 0) { ++*a_wait_t; } } if(pq_size(pq) == 0 && !in_use && done(procs_t, sizeof(procs_t) / sizeof(int))) { *total_t = cur_t; event_call("RR", cur_t, 0, '7', pq); return; } ++cur_t; } }
/* @function main */ int main() { /*test pq*/ struct tnode* p=NULL; struct tnode* lc,*rc; float freq[]={0.01,0.04,0.05,0.11,0.19,0.20,0.4}; int NCHAR=7; /*number of characters*/ int i=0; const char *CODE_FILE="code.txt"; const char *OUT_FILE="encoded.txt"; FILE* fout=NULL; /*zero out code*/ memset(code,0,sizeof(code)); /*testing queue*/ pq_insert(talloc('a', 0.1)); pq_insert(talloc('b', 0.2)); pq_insert(talloc('c', 0.15)); pq_insert(talloc('g', 0.3)); pq_insert(talloc('x', 0.002)); /*making sure it pops in the right order*/ puts("making sure it pops in the right order"); while((p=pq_pop())) { printf("iam free \n"); if(p != NULL) { free(p); } } qhead=NULL; /*initialize with freq*/ for(i=0;i<NCHAR;i++) { pq_insert(talloc('a'+i,freq[i])); } /*build tree*/ for(i=0;i<NCHAR-1;i++) { lc=pq_pop(); rc=pq_pop(); /*create parent*/ p=talloc(0,lc->freq+rc->freq); /*set parent link*/ lc->parent=rc->parent=p; /*set child link*/ p->right=rc; p->left=lc; /*make it non-leaf*/ p->isleaf=0; /*add the new node to the queue*/ pq_insert(p); } /*get root*/ root=pq_pop(); /*build code*/ generate_code(root,0); /*output code*/ puts("code:"); fout=fopen(CODE_FILE,"w"); dump_code(stdout); dump_code(fout); fclose(fout); /*encode a sample string*/ puts("orginal:abba cafe bad"); fout=fopen(OUT_FILE,"w"); encode("abba cafe bad",stdout); encode("abba cafe bad",fout); fclose(fout); free(root); free(lc); free(rc); return 0; }
PCB *scheduler(void) { PCB *ret; ret = pq_pop(ready_queue); return ret; }