void prior_elem( sq_list list, ElemType *cur_elem, ElemType *prior_elem ){ Loc cur_elem_loc = locate_elem( list, cur_elem ); if( cur_elem_loc != list->length ){ get_elem( list, cur_elem_loc-1, prior_elem ); } }
void next_elem( sq_list list, ElemType *cur_elem, ElemType *next_elem ){ Loc cur_elem_loc = locate_elem( list, cur_elem ); if( cur_elem_loc <= list->length - 1 ){ get_elem( list, cur_elem_loc+1, next_elem ); } }
void update_process_group(struct process_group *pgroup) { struct process_iterator it; struct process tmp_process; struct process_filter filter; struct timeval now; gettimeofday(&now, NULL); //time elapsed from previous sample (in ms) long dt = timediff(&now, &pgroup->last_update) / 1000; filter.pid = pgroup->target_pid; filter.include_children = pgroup->include_children; init_process_iterator(&it, &filter); clear_list(pgroup->proclist); init_list(pgroup->proclist, 4); while (get_next_process(&it, &tmp_process) != -1) { // struct timeval t; // gettimeofday(&t, NULL); // printf("T=%ld.%ld PID=%d PPID=%d START=%d CPUTIME=%d\n", t.tv_sec, t.tv_usec, tmp_process.pid, tmp_process.ppid, tmp_process.starttime, tmp_process.cputime); int hashkey = pid_hashfn(tmp_process.pid); if (pgroup->proctable[hashkey] == NULL) { //empty bucket pgroup->proctable[hashkey] = malloc(sizeof(struct list)); struct process *new_process = malloc(sizeof(struct process)); tmp_process.cpu_usage = -1; memcpy(new_process, &tmp_process, sizeof(struct process)); init_list(pgroup->proctable[hashkey], 4); add_elem(pgroup->proctable[hashkey], new_process); add_elem(pgroup->proclist, new_process); } else { //existing bucket struct process *p = (struct process*)locate_elem(pgroup->proctable[hashkey], &tmp_process); if (p == NULL) { //process is new. add it struct process *new_process = malloc(sizeof(struct process)); tmp_process.cpu_usage = -1; memcpy(new_process, &tmp_process, sizeof(struct process)); add_elem(pgroup->proctable[hashkey], new_process); add_elem(pgroup->proclist, new_process); } else { assert(tmp_process.pid == p->pid); assert(tmp_process.ppid == p->ppid); assert(tmp_process.starttime == p->starttime); add_elem(pgroup->proclist, p); if (dt < MIN_DT) continue; //process exists. update CPU usage double sample = 1.0 * (tmp_process.cputime - p->cputime) / dt; if (p->cpu_usage == -1) { //initialization p->cpu_usage = sample; } else { //usage adjustment p->cpu_usage = (1.0-ALFA) * p->cpu_usage + ALFA * sample; } p->cputime = tmp_process.cputime; } } } close_process_iterator(&it); if (dt < MIN_DT) return; pgroup->last_update = now; }