/* Test the specified memory. The number of bytes must be multiple of 4096. * If interactive is true the program exists with an error and prints * ASCII arts to show progresses. Instead when interactive is 0, it can * be used as an API call, and returns 1 if memory errors were found or * 0 if there were no errors detected. */ int memtest_test(unsigned long *m, size_t bytes, int passes, int interactive) { int pass = 0; int errors = 0; while (pass != passes) { pass++; if (interactive) memtest_progress_start("Addressing test",pass); errors += memtest_addressing(m,bytes,interactive); if (interactive) memtest_progress_end(); if (interactive) memtest_progress_start("Random fill",pass); memtest_fill_random(m,bytes,interactive); if (interactive) memtest_progress_end(); errors += memtest_compare_times(m,bytes,pass,4,interactive); if (interactive) memtest_progress_start("Solid fill",pass); memtest_fill_value(m,bytes,0,(unsigned long)-1,'S',interactive); if (interactive) memtest_progress_end(); errors += memtest_compare_times(m,bytes,pass,4,interactive); if (interactive) memtest_progress_start("Checkerboard fill",pass); memtest_fill_value(m,bytes,ULONG_ONEZERO,ULONG_ZEROONE,'C',interactive); if (interactive) memtest_progress_end(); errors += memtest_compare_times(m,bytes,pass,4,interactive); } return errors; }
void memtest_test(size_t megabytes, int passes) { size_t bytes = megabytes*1024*1024; unsigned long *m = malloc(bytes); int pass = 0; if (m == NULL) { fprintf(stderr,"Unable to allocate %zu megabytes: %s", megabytes, strerror(errno)); exit(1); } while (pass != passes) { pass++; memtest_progress_start("Addressing test",pass); memtest_addressing(m,bytes); memtest_progress_end(); memtest_progress_start("Random fill",pass); memtest_fill_random(m,bytes); memtest_progress_end(); memtest_compare_times(m,bytes,pass,4); memtest_progress_start("Solid fill",pass); memtest_fill_value(m,bytes,0,(unsigned long)-1,'S'); memtest_progress_end(); memtest_compare_times(m,bytes,pass,4); memtest_progress_start("Checkerboard fill",pass); memtest_fill_value(m,bytes,ULONG_ONEZERO,ULONG_ZEROONE,'C'); memtest_progress_end(); memtest_compare_times(m,bytes,pass,4); } free(m); }
void memtest_test(void *buffer, size_t megabytes, int passes) { size_t bytes = megabytes*1024*1024; unsigned long *m = buffer; int pass = 0; while (pass != passes) { pass++; memtest_progress_start("Addressing test",pass); memtest_addressing(m,bytes); memtest_progress_end(); memtest_progress_start("Random fill",pass); memtest_fill_random(m,bytes); memtest_progress_end(); memtest_compare_times(m,bytes,pass,4); memtest_progress_start("Solid fill",pass); memtest_fill_value(m,bytes,0,(unsigned long)-1,'S'); memtest_progress_end(); memtest_compare_times(m,bytes,pass,4); memtest_progress_start("Checkerboard fill",pass); memtest_fill_value(m,bytes,ULONG_ONEZERO,ULONG_ZEROONE,'C'); memtest_progress_end(); memtest_compare_times(m,bytes,pass,4); } }
void memtest_compare_times(unsigned long *m, size_t bytes, int pass, int times) { int j; for (j = 0; j < times; j++) { memtest_progress_start("Compare",pass); memtest_compare(m,bytes); memtest_progress_end(); } }
int memtest_compare_times(unsigned long *m, size_t bytes, int pass, int times, int interactive) { int j; int errors = 0; for (j = 0; j < times; j++) { if (interactive) memtest_progress_start("Compare",pass); errors += memtest_compare(m,bytes,interactive); if (interactive) memtest_progress_end(); } return errors; }