static void signal_handler(int sig) { if (sig == SIGALRM) { #if VERBOSE fprintf(FP, "just got SIGALRM for %d => ", child); #endif if (limit > 0) { gettimeofday(&end, (struct timezone *) 0); #if VERBOSE fprintf(FP, "SIGALRM: comparing limit %d s vs. elapsed %d s\n", limit, end.tv_sec - start.tv_sec); #endif /* for limit, ignore fractions of second */ if (end.tv_sec - start.tv_sec > limit) { /* could use SIGTERM, but on win32 cygwin need SIGKILL */ kill(child, SIGKILL); fprintf(FP, "Timeout after %d seconds\n", limit); exit(-1); } } get_mem_stats(child); } else if (sig == SIGCHLD) { #if VERBOSE fprintf(FP, "just got SIGCHLD for %d\n", child); #endif } }
// the test program with defined testing paramaters int main(int argc, char** argv){ clock_t start, stop; double cpu_time; start = clock(); time_t t; FILE* f = fopen("log","w"); int paramaters[6] = {ntrials, pctget, pctlarge, small_limit, large_limit, -1}; setup(paramaters, argc, argv); if(paramaters[5] < 0) srand((unsigned)time(&t)); else srand((unsigned)paramaters[5]); int i; for(i=0; i<paramaters[0]; i++){ int function_choice = makechoice(paramaters[1]); int size_choice = makechoice(paramaters[2]); int small = paramaters[3]; int large = paramaters[4]; if(function_choice){ int size = gen_size(size_choice, small, large); getmem(size); }else{ random_free(); } } print_heap(f); uintptr_t *total_size = (uintptr_t *)malloc(sizeof(uintptr_t)); uintptr_t *total_free = (uintptr_t *)malloc(sizeof(uintptr_t)); uintptr_t *n_free_blocks = (uintptr_t *)malloc(sizeof(uintptr_t)); // get and print the mem stats to file get_mem_stats(total_size, total_free, n_free_blocks); stop = clock(); cpu_time = ((double) (stop - start)) / CLOCKS_PER_SEC; fprintf(f,"cpu_time: %f seconds\n",cpu_time); fprintf(f,"total_size: %lu bytes\n",*total_size); // printf("n_free_blocks: %lu blocks\n",*n_free_blocks); fprintf(f,"n_free_blocks: %lu blocks\n",*n_free_blocks); fprintf(f,"total_free size :%lu bytes\n",*total_free); fclose(f); free(total_size); free(total_free); free(n_free_blocks); return 0; }
static int fillMemoryInfo(Digikam::KMemoryInfo::KMemoryInfoData* const data) { int ret = get_mem_stats(data); if (ret < 1) { data->valid = ret; return ret; } ret = get_swap_stats(data); if (ret < 1) { data->valid = ret; return ret; } data->valid = 1; return 1; }
int main(int argc, char *argv[]) { int rc; struct itimerval t; struct rusage ru; int arg_offs = 1; if (argc < 2) { return usage(argv[0]); } while (argv[arg_offs][0] == '-') { if (strcmp(argv[arg_offs], "-s") == 0) { if (argc <= arg_offs+1) return usage(argv[0]); limit = atoi(argv[arg_offs+1]); arg_offs += 2; } else if (strcmp(argv[arg_offs], "-m") == 0) { if (argc <= arg_offs+1) return usage(argv[0]); limit = atoi(argv[arg_offs+1])*60; arg_offs += 2; } else if (strcmp(argv[arg_offs], "-h") == 0) { if (argc <= arg_offs+1) return usage(argv[0]); limit = atoi(argv[arg_offs+1])*3600; arg_offs += 2; } else if (strcmp(argv[arg_offs], "-v") == 0) { /* just ignore -v, only here for compatibility with texec */ arg_offs += 1; } else if (strcmp(argv[arg_offs], "-silent") == 0) { silent = 1; arg_offs += 1; } else if (strcmp(argv[arg_offs], "-env") == 0) { if (argc <= arg_offs+2) return usage(argv[0]); #if VERBOSE fprintf(FP, "setting env var \"%s\" to \"%s\"\n", argv[arg_offs+1], argv[arg_offs+2]); #endif rc = setenv(argv[arg_offs+1], argv[arg_offs+2], 1/*overwrite*/); if (rc != 0 || strcmp(getenv(argv[arg_offs+1]), argv[arg_offs+2]) != 0) { fprintf(FP, "error in setenv of \"%s\" to \"%s\"\n", argv[arg_offs+1], argv[arg_offs+2]); fprintf(FP, "setenv returned %d\n", rc); fprintf(FP, "env var \"%s\" is now \"%s\"\n", argv[arg_offs+1], getenv(argv[arg_offs+1])); exit(-1); } arg_offs += 3; } else { return usage(argv[0]); } if (limit < 0) { return usage(argv[0]); } if (argc - arg_offs < 1) return usage(argv[0]); } gettimeofday(&start, (struct timezone *) 0); child = fork(); if (child < 0) { perror("ERROR on fork"); return 1; } else if (child > 0) { pid_t result; int status; get_mem_stats(child); intercept_signal(SIGALRM, (handler_t) signal_handler); intercept_signal(SIGCHLD, (handler_t) signal_handler); t.it_interval.tv_sec = 0; t.it_interval.tv_usec = 500000; t.it_value.tv_sec = 0; t.it_value.tv_usec = 500000; /* must use real timer so timer decrements while process suspended */ rc = setitimer(ITIMER_REAL, &t, NULL); assert(rc == 0); #if VERBOSE fprintf(FP, "parent waiting for child\n"); #endif /* need loop since SIGALRM will interrupt us */ do { result = wait3(&status, 0, &ru); } while (result != child); gettimeofday(&end, (struct timezone *) 0); #if VERBOSE fprintf(FP, "child has exited\n"); #endif /* turn off timer */ t.it_interval.tv_usec = 0; t.it_value.tv_usec = 0; rc = setitimer(ITIMER_REAL, &t, NULL); assert(rc == 0); if (!silent) print_stats(&start, &end, &ru, status); return (status == 0 ? 0 : 1); } else { int result; result = execvp(argv[arg_offs], argv+arg_offs); if (result < 0) { perror("ERROR in execvp"); fprintf(FP, " trying to run %s\n", argv[arg_offs]); return 1; } } return 0; }
int main(int argc, char *argv[]) { int rc; struct itimerval t; struct rusage ru; int arg_offs = 1; FP = stderr; /* default */ if (argc < 2) { return usage(argv[0]); } while (argv[arg_offs][0] == '-') { if (strcmp(argv[arg_offs], "-s") == 0) { if (argc <= arg_offs+1) return usage(argv[0]); limit = atoi(argv[arg_offs+1]); arg_offs += 2; } else if (strcmp(argv[arg_offs], "-m") == 0) { if (argc <= arg_offs+1) return usage(argv[0]); limit = atoi(argv[arg_offs+1])*60; arg_offs += 2; } else if (strcmp(argv[arg_offs], "-h") == 0) { if (argc <= arg_offs+1) return usage(argv[0]); limit = atoi(argv[arg_offs+1])*3600; arg_offs += 2; } else if (strcmp(argv[arg_offs], "-v") == 0) { /* just ignore -v, only here for compatibility with texec */ arg_offs += 1; } else if (strcmp(argv[arg_offs], "-silent") == 0) { silent = 1; arg_offs += 1; } else if (strcmp(argv[arg_offs], "-killpg") == 0) { kill_group = 1; arg_offs += 1; } else if (strcmp(argv[arg_offs], "-f") == 0) { char fname[32]; int len = snprintf(fname, sizeof(fname)/sizeof(fname[0]), "runstats-%d", getpid()); if (len <= 0) return 1; FP = fopen(fname, "w"); arg_offs += 1; } else if (strcmp(argv[arg_offs], "-env") == 0) { if (argc <= arg_offs+2) return usage(argv[0]); #if VERBOSE fprintf(FP, "setting env var \"%s\" to \"%s\"\n", argv[arg_offs+1], argv[arg_offs+2]); #endif rc = setenv(argv[arg_offs+1], argv[arg_offs+2], 1/*overwrite*/); if (rc != 0 || strcmp(getenv(argv[arg_offs+1]), argv[arg_offs+2]) != 0) { fprintf(FP, "error in setenv of \"%s\" to \"%s\"\n", argv[arg_offs+1], argv[arg_offs+2]); fprintf(FP, "setenv returned %d\n", rc); fprintf(FP, "env var \"%s\" is now \"%s\"\n", argv[arg_offs+1], getenv(argv[arg_offs+1])); exit(-1); } arg_offs += 3; } else { return usage(argv[0]); } if (limit < 0) { return usage(argv[0]); } if (argc - arg_offs < 1) return usage(argv[0]); } gettimeofday(&start, (struct timezone *) 0); child = fork(); if (child < 0) { perror("ERROR on fork"); return 1; } else if (child > 0) { pid_t result; int status; get_mem_stats(child); intercept_signal(SIGALRM, (handler_t) signal_handler); intercept_signal(SIGCHLD, (handler_t) signal_handler); t.it_interval.tv_sec = 0; t.it_interval.tv_usec = 500000; t.it_value.tv_sec = 0; t.it_value.tv_usec = 500000; /* must use real timer so timer decrements while process suspended */ rc = setitimer(ITIMER_REAL, &t, NULL); assert(rc == 0); #if VERBOSE fprintf(FP, "parent waiting for child\n"); #endif /* need loop since SIGALRM will interrupt us */ do { result = wait3(&status, 0, &ru); } while (result != child); gettimeofday(&end, (struct timezone *) 0); #if VERBOSE fprintf(FP, "child has exited\n"); #endif /* turn off timer */ t.it_interval.tv_usec = 0; t.it_value.tv_usec = 0; rc = setitimer(ITIMER_REAL, &t, NULL); assert(rc == 0); if (!silent) print_stats(&start, &end, &ru, status); return (status == 0 ? 0 : 1); } else { int result; if (kill_group) { /* Change the process group so we can relibably kill all children. * This assumes that no child will change the process group or * invoke sub-commands via bash. */ result = setpgid(0 /* my pid */, 0 /* set pgid to my pid */); if (result < 0) { perror("ERROR in setpgid"); fprintf(FP, " trying to run %s\n", argv[arg_offs]); return 1; } } result = execvp(argv[arg_offs], argv+arg_offs); if (result < 0) { perror("ERROR in execvp"); fprintf(FP, " trying to run %s\n", argv[arg_offs]); return 1; } } return 0; }