diff --git a/main.c b/main.c index 1e484b8..273ce8c 100644 --- a/main.c +++ b/main.c @@ -54,24 +54,30 @@ unsigned long int get_mem_available_mb() { return (available - available/100*10)*1024; } -int parse_t_flag(int argc, char *argv[]) { - for (int i = 1; i < argc; ++i) { - // Вариант -t4 - if (strncmp(argv[i], "-t", 2) == 0) { - // Если есть еще что-то после -t, например -t4 - if (strlen(argv[i]) > 2) { - char *num_str = argv[i] + 2; - if (isdigit(num_str[0])) { - return atoi(num_str); - } +int parse_ti_flags(int argc, char *argv[], int *t, int *i) { + *t = -1; + *i = 1; + for (int idx = 1; idx < argc; ++idx) { + // -tN или -t N + if (strncmp(argv[idx], "-t", 2) == 0) { + if (strlen(argv[idx]) > 2 && isdigit(argv[idx][2])) { + *t = atoi(argv[idx] + 2); + } else if (idx + 1 < argc && isdigit(argv[idx + 1][0])) { + *t = atoi(argv[idx + 1]); + idx++; // пропускаем это число } - // Вариант -t 4 - else if (i + 1 < argc && isdigit(argv[i + 1][0])) { - return atoi(argv[i + 1]); + } + // -iN или -i N + else if (strncmp(argv[idx], "-i", 2) == 0) { + if (strlen(argv[idx]) > 2 && isdigit(argv[idx][2])) { + *i = atoi(argv[idx] + 2); + } else if (idx + 1 < argc && isdigit(argv[idx + 1][0])) { + *i = atoi(argv[idx + 1]); + idx++; // пропускаем это число } } } - return -1; // -1 если флаг не найден + return (*t != -1 || *i != -1) ? 0 : -1; } @@ -91,62 +97,71 @@ int main(int argc, char *argv[]) { } //struct tred_pizdec* meta[]; //pthread_t thread[]; + int err = 0; struct tred_pizdec** meta = malloc(sizeof(struct tred_pizdec) * 4); pthread_t *thread = malloc(sizeof(pthread_t) * 4); - int tred = parse_t_flag(argc, argv); - if (tred != -1){ - // Основные паттерны 0x00000000, 0xFFFFFFFF, 0xAAAAAAAA, 0x55555555 - for (size_t p = 0; p < sizeof(test_patterns)/sizeof(test_patterns[0]); ++p){ - printf("Запушен патерн 0x%08X\n", test_patterns[p]); - for (bool i = 0;(i != 4); i++){ - meta[i] = malloc(sizeof(struct tred_pizdec)); - meta[i]->id = p; - meta[i]->mem = mem; - meta[i]->words_stop = words/4*(i+1); - meta[i]->words_start = i * words/4; - DEBUG_PRINT("words_stop: %zu\n",meta[i]->words_stop); - DEBUG_PRINT("words_start:%zu\n",meta[i]->words_start); - pthread_create(&thread[i], NULL, fill_pattern_multi_tred, (void*)meta[i]); - //pthread_join(thread[i], NULL); + int tred, iterations; + parse_ti_flags(argc, argv, &tred, &iterations); + printf("iterations: %i\n", iterations); + for (;iterations != 0; iterations--){ + if (tred != -1){ + // Основные паттерны 0x00000000, 0xFFFFFFFF, 0xAAAAAAAA, 0x55555555 + for (size_t p = 0; p < sizeof(test_patterns)/sizeof(test_patterns[0]); ++p){ + printf("\rЗапушен патерн 0x%08X", test_patterns[p]); + fflush(stdout); + for (bool i = 0;(i != 4); i++){ + meta[i] = malloc(sizeof(struct tred_pizdec)); + meta[i]->id = p; + meta[i]->mem = mem; + meta[i]->words_stop = words/4*(i+1); + meta[i]->words_start = i * words/4; + DEBUG_PRINT("words_stop: %zu\n",meta[i]->words_stop); + DEBUG_PRINT("words_start:%zu\n",meta[i]->words_start); + pthread_create(&thread[i], NULL, fill_pattern_multi_tred, (void*)meta[i]); + //pthread_join(thread[i], NULL); + } + for (bool i = 0;(i != 4); i++) + pthread_join(thread[i], NULL); + //fill_pattern(mem, words, test_patterns[p]); + //printf("Жду\n"); + //usleep(10000000); + printf("\r-- Проверяю "); + fflush(stdout); + //int err = check_pattern(mem, words, test_patterns[p]); + + for (bool i = 0;(i != 4); i++){ + meta[i] = malloc(sizeof(struct tred_pizdec)); + meta[i]->id = p; + meta[i]->mem = mem; + meta[i]->words_stop = words/4*(i+1); + meta[i]->words_start = i * words/4; + DEBUG_PRINT("words_stop: %zu\n",meta[i]->words_stop); + DEBUG_PRINT("words_start:%zu\n",meta[i]->words_start); + pthread_create(&thread[i], NULL, fill_increment_multi_tred, (void*)meta[i]); + //pthread_join(thread[i], NULL); + } + for (bool i = 0;(i != 4); i++){ + pthread_join(thread[i], NULL); + err += meta[i]->return_error; + free(meta[i]); + } + if (err == 0){ + printf("\rOK\n"); + fflush(stdout); + } + else printf("Errors: %d\n", err); } - for (bool i = 0;(i != 4); i++) - pthread_join(thread[i], NULL); - //fill_pattern(mem, words, test_patterns[p]); - printf("Жду\n"); - //usleep(10000000); - printf("Проверяю\n"); - //int err = check_pattern(mem, words, test_patterns[p]); - - for (bool i = 0;(i != 4); i++){ - meta[i] = malloc(sizeof(struct tred_pizdec)); - meta[i]->id = p; - meta[i]->mem = mem; - meta[i]->words_stop = words/4*(i+1); - meta[i]->words_start = i * words/4; - DEBUG_PRINT("words_stop: %zu\n",meta[i]->words_stop); - DEBUG_PRINT("words_start:%zu\n",meta[i]->words_start); - pthread_create(&thread[i], NULL, fill_increment_multi_tred, (void*)meta[i]); - //pthread_join(thread[i], NULL); - } - int err=0; - for (bool i = 0;(i != 4); i++){ - pthread_join(thread[i], NULL); - err += meta[i]->return_error; - free(meta[i]); - } - if (err == 0) printf("OK\n"); - else printf("Errors: %d\n", err); } - } - else{ - // Основные паттерны 0x00000000, 0xFFFFFFFF, 0xAAAAAAAA, 0x55555555 - for (size_t p = 0; p < sizeof(test_patterns)/sizeof(test_patterns[0]); ++p){ - printf("Запушен патерн 0x%08X\n", test_patterns[p]); - fill_pattern(mem, words, test_patterns[p]); - printf("Жду\n"); - int err = check_pattern(mem, words, test_patterns[p]); - if (err == 0) printf("OK\n"); - else printf("Errors: %d\n", err); + else{ + // Основные паттерны 0x00000000, 0xFFFFFFFF, 0xAAAAAAAA, 0x55555555 + for (size_t p = 0; p < sizeof(test_patterns)/sizeof(test_patterns[0]); ++p){ + printf("Запушен патерн 0x%08X", test_patterns[p]); + fill_pattern(mem, words, test_patterns[p]); + printf("Жду\n"); + err += check_pattern(mem, words, test_patterns[p]); + if (err == 0) printf("OK\n"); + else printf("Errors: %d\n", err); + } } } @@ -154,7 +169,6 @@ int main(int argc, char *argv[]) { printf("Запушен патерн инкрементации\n"); fill_increment(mem, words); //usleep(10000000); - int err = 0; for (size_t i = 0; i < words; i++) { if (mem[i] != (uint32_t)i) { printf("Ошибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, (uint32_t)i, mem[i]);