--- joko/Uni/BSArch/04/bmp_fractal.c 2006/07/02 11:44:57 1.14 +++ joko/Uni/BSArch/04/bmp_fractal.c 2006/07/02 12:21:01 1.16 @@ -5,7 +5,7 @@ * Uebung 4.4 */ -// $Id: bmp_fractal.c,v 1.14 2006/07/02 11:44:57 joko Exp $ +// $Id: bmp_fractal.c,v 1.16 2006/07/02 12:21:01 joko Exp $ #include #include @@ -49,12 +49,12 @@ 0, NULL )) { - fprintf(stdout, "%s: %s\n", msg, lpMsgBuf); + fprintf(stderr, "%s: %s\n", msg, lpMsgBuf); LocalFree(lpMsgBuf); } else { - fprintf(stdout, "Error at FormatMesage: %d\n",err=GetLastError()); + fprintf(stderr, "Error at FormatMesage: %d\n",err=GetLastError()); } exit(err); } @@ -68,7 +68,7 @@ // open file handle fd = fopen(filename, "wb+"); if (NULL == fd) { - perror("open"); + perror("Error while opening file for writing"); exit(1); } @@ -77,7 +77,7 @@ // error checking if (-1 == len || len != sizeof(header)) { - perror("write"); + perror("Error while writing header to file"); exit(2); } @@ -86,7 +86,7 @@ for (i = 0; i < img_size; i++) { len = fwrite("\0\0\0", 1, 3, fd); if (-1 == len || len != 3) { - perror("write"); + perror("Error while writing data to file"); exit(4); } } @@ -156,7 +156,6 @@ } -//BOOL scan_argv(int argc, char *argv[], char opt_name[], char *opt_value[]) { BOOL scan_argv(int argc, char *argv[], char opt_name[], char *opt_value) { int i; char * opt_current_name; @@ -187,10 +186,11 @@ unsigned char *pDataBitmap; // workers - int workers = 5; + int workers; int worker_index, worker_rows, worker_startrow; HANDLE *worker_handles; PWORKERARGS worker_args; + int worker_count; // threads or processes? BOOL use_processes = FALSE; @@ -315,7 +315,7 @@ // allocate memory for one worker's arguments if ((worker_args = malloc(sizeof(worker_args[0]))) == NULL) - perror("malloc"), exit(1); + perror("Error while allocating memory for worker arguments via malloc"), exit(1); // assign worker's arguments worker_args[0].start_row = worker_startrow; @@ -348,11 +348,11 @@ // allocate memory for table of all worker handles if ((worker_handles = malloc(workers * sizeof(worker_handles[0]))) == NULL) - perror("malloc"), exit(1); + perror("Error while allocating memory for worker handles via malloc"), exit(1); // allocate memory for table of all worker arguments if ((worker_args = malloc(workers * sizeof(worker_args[0]))) == NULL) - perror("malloc"), exit(1); + perror("Error while allocating memory for worker arguments via malloc"), exit(1); // calculate bitmap segment length for workers @@ -427,11 +427,15 @@ } - // wait for all threads if (VERBOSE) fprintf(stdout, "waiting for workers to finish...\n"); - if (WaitForMultipleObjects(workers, worker_handles, TRUE, INFINITE) == WAIT_FAILED) - perror("WaitForMultipleObjects"); + + // wait for all workers + for (worker_index = 0; worker_index < workers; worker_index += MAXIMUM_WAIT_OBJECTS) { + worker_count = ((workers - worker_index) > MAXIMUM_WAIT_OBJECTS) ? MAXIMUM_WAIT_OBJECTS : (workers - worker_index); + if (WaitForMultipleObjects(worker_count, &worker_handles[worker_index], TRUE, INFINITE) == WAIT_FAILED) + printErrorAndExit("Error at WaitForMultipleObjects", GetLastError()); + } // debugging: just run single thread //if (WaitForSingleObject(worker_handles[0], INFINITE) == WAIT_FAILED)