Modify argument to worker thread functions
Instead of only supplying the index, the pointer to the threadInfo structure is passed.
This commit is contained in:
parent
ba685cc0ca
commit
4b150c8097
1 changed files with 11 additions and 10 deletions
21
visor.c
21
visor.c
|
@ -109,11 +109,11 @@ void color_from_iteration(int *r, int *g, int *b, double x0, double y0)
|
||||||
#undef MAX_ITERATION
|
#undef MAX_ITERATION
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_mandelbrot(int32_t threadIndex)
|
void draw_mandelbrot(struct threadInfo *info)
|
||||||
{
|
{
|
||||||
int h = mandelbrot.height;
|
int h = mandelbrot.height;
|
||||||
int w = mandelbrot.width;
|
int w = mandelbrot.width;
|
||||||
int p = threadIndex, c = thread_count;
|
int p = info->index, c = thread_count;
|
||||||
int mod = h % c, div = h / c;
|
int mod = h % c, div = h / c;
|
||||||
int a = MIN(p, mod)*(div+1) + (MAX(p, mod)-mod)*div,
|
int a = MIN(p, mod)*(div+1) + (MAX(p, mod)-mod)*div,
|
||||||
b = p < mod ? a + div + 1 : a + div;
|
b = p < mod ? a + div + 1 : a + div;
|
||||||
|
@ -147,21 +147,22 @@ void draw_mandelbrot(int32_t threadIndex)
|
||||||
pixmap[4*(i*w + j) + 0] = b;
|
pixmap[4*(i*w + j) + 0] = b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
threads[threadIndex].complete = true;
|
info->complete = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *writer_thread(void *index_ptr)
|
void *writer_thread(void *arg)
|
||||||
{
|
{
|
||||||
int32_t index = *(int32_t *)index_ptr;
|
struct threadInfo *info = arg;
|
||||||
|
int32_t index = info->index;
|
||||||
while (true) {
|
while (true) {
|
||||||
pthread_mutex_lock(&pixmapMutex);
|
pthread_mutex_lock(&pixmapMutex);
|
||||||
while(!pixmapAvailable || threads[index].complete) {
|
while(!pixmapAvailable || info->complete) {
|
||||||
pthread_cond_wait(&pixmapCond, &pixmapMutex);
|
pthread_cond_wait(&pixmapCond, &pixmapMutex);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&pixmapMutex);
|
pthread_mutex_unlock(&pixmapMutex);
|
||||||
threads[index].drawing = true;
|
info->drawing = true;
|
||||||
draw_mandelbrot(index);
|
draw_mandelbrot(info);
|
||||||
threads[index].drawing = false;
|
info->drawing = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -323,7 +324,7 @@ int main(int argc, char **argv)
|
||||||
// integer, if the thread fails to start, it will simply be
|
// integer, if the thread fails to start, it will simply be
|
||||||
// overwritten by the same value in the next run of the loop
|
// overwritten by the same value in the next run of the loop
|
||||||
pthread_t id;
|
pthread_t id;
|
||||||
if (pthread_create(&id, NULL, &writer_thread, &threads[count].index)) {
|
if (pthread_create(&id, NULL, &writer_thread, &threads[count])) {
|
||||||
pthread_detach(id);
|
pthread_detach(id);
|
||||||
fprintf(stderr, "Failed to create thread %d\n", i);
|
fprintf(stderr, "Failed to create thread %d\n", i);
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Add table
Reference in a new issue