]> git.mcshandy.xyz Git - barrow_crawler/commitdiff
HEY WHO THE FUCK DIDN'T TELL ME ABOUT PTHREAD BARRIERS
authorRandy McShandy <randy@mcshandy.xyz>
Wed, 13 Dec 2023 06:06:25 +0000 (00:06 -0600)
committerRandy McShandy <randy@mcshandy.xyz>
Wed, 13 Dec 2023 06:06:25 +0000 (00:06 -0600)
main.c

diff --git a/main.c b/main.c
index 1fc6dcad55049e80a1caafb9a0291708d343651d..d232420fe9aea64a4537038ef984fe81f0f91968 100755 (executable)
--- a/main.c
+++ b/main.c
@@ -8,7 +8,7 @@
 #define STB_IMAGE_WRITE_IMPLEMENTATION
 #include "stb_image_write.h"
 
-#define GRID_X 128
+#define GRID_X 512
 #define GRID_Y GRID_X
 
 #define SHADOW 0
@@ -54,6 +54,7 @@ typedef struct
        pthread_mutex_t         worker_mutex;
        pthread_cond_t*         worker_cond;
        pthread_cond_t*         boss_cond;
+       pthread_barrier_t* barrier;
 
        int* waiting_workers;
        int worker_count;
@@ -186,8 +187,8 @@ void* iterator(void* _arg)
        RD_Opts opts = warg->opts;
        int start_x = warg->start_x;
        int start_y = warg->start_y;
-       int w = warg->width;//(warg->width + start_x >= GRID_X) ? GRID_X-1 - start_x: warg->width;
-       int h = warg->height;//(warg->height + start_y >= GRID_Y) ? GRID_Y-1 - start_y : warg->height;
+       int w = warg->width;
+       int h = warg->height;
 
        for (warg->iterations = 0; warg->iterations < warg->max_iterations; warg->iterations++)
        {
@@ -202,7 +203,34 @@ void* iterator(void* _arg)
                        }
                }
 
-#if 1
+               pthread_mutex_lock(warg->mutex);
+               if (++*warg->waiting_workers == warg->worker_count)
+               {
+                       grid_temp = grid;
+                       grid = grid_prime;
+                       grid_prime = grid_temp;
+                       *warg->waiting_workers = 0;
+                       printf("worker-boss %d: completing report\n", warg->worker_id);
+                       if ((warg->iterations % 100 == 0))
+                       {
+                               char buffer[GRID_X][GRID_Y];
+                               for (int x = 0; x < GRID_X; x++)
+                               {
+                                       for (int y = 0; y < GRID_Y; y++)
+                                       {
+                                               buffer[x][y] = (uint8_t)(255.0f * grid[x][y].a);
+                                       }
+                               }
+                               char name[64] = {0};
+                               sprintf(name, "img/%s/%d.png", opts.name, warg->iterations);
+                               stbi_write_png(name, GRID_X, GRID_Y, 1, buffer, GRID_X * sizeof(uint8_t));
+                       }
+               }
+               pthread_mutex_unlock(warg->mutex);
+
+               pthread_barrier_wait(warg->barrier);
+
+#if 0
                // Last one done should wake up the boss thread
                int last_worker = 0;
                pthread_mutex_lock(warg->mutex);
@@ -223,7 +251,7 @@ void* iterator(void* _arg)
                        grid_prime = grid_temp;
 
                        // segfault somewhere in here lmao
-                       if (1 && (warg->iterations % 100 == 0))
+                       if ((warg->iterations % 100 == 0))
                        {
                                char buffer[GRID_X][GRID_Y];
                                for (int x = 0; x < GRID_X; x++)
@@ -327,20 +355,23 @@ int main(int argc, char** argv)
 
        int waiting_workers = 0;
        worker_arg warg = {
-               opts, grid, grid_prime, 0, 0, (GRID_X), (GRID_Y), .worker_count = 4, .waiting_workers = &waiting_workers, .max_iterations = 1e4
+               opts, grid, grid_prime, 0, 0, (GRID_X), (GRID_Y), .worker_count = 8, .waiting_workers = &waiting_workers, .max_iterations = 1e4,
        };
        pthread_t threads[warg.worker_count];
        pthread_mutex_t mutex;
        pthread_cond_t worker_cond;
        pthread_cond_t boss_cond;
+       pthread_barrier_t barrier;
 
        pthread_mutex_init(&mutex, NULL);
        pthread_cond_init(&worker_cond, NULL);
        pthread_cond_init(&boss_cond, NULL);
+       pthread_barrier_init(&barrier, NULL, warg.worker_count);
 
        warg.worker_cond        = &worker_cond;
        warg.boss_cond          = &boss_cond;
        warg.mutex                              = &mutex;
+       warg.barrier                    = &barrier;
 
        worker_arg wargs[warg.worker_count];