示例#1
0
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
    }
}
示例#2
0
// 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;
}
示例#4
0
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;
}
示例#5
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;
}