From 38abb379979ed12a8a529c50ea230eb807aa7628 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 13 Feb 2022 17:32:16 +0100 Subject: [PATCH] Update meshgen threads to use queue waiting --- deps/dragonstd | 2 +- src/client/blockmesh.c | 10 ++++++++-- src/client/client_map.c | 11 ++++------- src/client/client_map.h | 2 +- src/server/server.c | 4 ++-- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/deps/dragonstd b/deps/dragonstd index 4e1758f..04c9384 160000 --- a/deps/dragonstd +++ b/deps/dragonstd @@ -1 +1 @@ -Subproject commit 4e1758fbf2261950df0d323460e7fbf35d402dd5 +Subproject commit 04c93844e4e4185d91950f0f5473bc88a84b5461 diff --git a/src/client/blockmesh.c b/src/client/blockmesh.c index 59b60c2..8af0151 100644 --- a/src/client/blockmesh.c +++ b/src/client/blockmesh.c @@ -102,7 +102,7 @@ void blockmesh_make(MapBlock *block) Object *obj = object_create(); obj->pos = (v3f32) {block->pos.x * MAPBLOCK_SIZE + half_block_size + 0.5f, block->pos.y * MAPBLOCK_SIZE + half_block_size + 0.5f, block->pos.z * MAPBLOCK_SIZE + half_block_size + 0.5f}; - obj->scale = extra->obj ? extra->obj->scale : (v3f32) {0.1f, 0.1f, 0.1f}; + obj->scale = (v3f32) {0.1f, 0.1f, 0.1f}; obj->frustum_culling = true; obj->box = (aabb3f32) {{-half_block_size - 1.0f, -half_block_size - 1.0f, -half_block_size - 1.0f}, {half_block_size + 1.0f, half_block_size + 1.0f, half_block_size + 1.0f}}; obj->on_render = (obj->scale.x == 1.0f) ? NULL : &animate_mapblock_mesh; @@ -115,8 +115,14 @@ void blockmesh_make(MapBlock *block) obj = NULL; } - if (extra->obj) + pthread_mutex_lock(&block->mtx); + if (extra->obj) { extra->obj->remove = true; + obj->scale = extra->obj->scale; + object_transform(obj); + } + extra->obj = obj; + pthread_mutex_unlock(&block->mtx); } diff --git a/src/client/client_map.c b/src/client/client_map.c index 23952a1..12a7a94 100644 --- a/src/client/client_map.c +++ b/src/client/client_map.c @@ -13,10 +13,8 @@ struct ClientMap client_map; // meshgen functions // dequeue callback to thread-safely update -static void set_dequeued(void *arg) +static void set_dequeued(MapBlock *block) { - MapBlock *block = arg; - pthread_mutex_lock(&block->mtx); ((MapBlockExtraData *) block->extra)->queue = false; pthread_mutex_unlock(&block->mtx); @@ -25,12 +23,10 @@ static void set_dequeued(void *arg) // mesh generator step static void meshgen_step() { - MapBlock *block; + MapBlock *block = queue_dequeue_callback(client_map.queue, (void *) &set_dequeued); - if ((block = queue_dequeue_callback(client_map.queue, &set_dequeued))) + if (block) blockmesh_make(block); - else - sched_yield(); } // pthread start routine for meshgen thread @@ -193,6 +189,7 @@ void client_map_start() void client_map_stop() { client_map.cancel = true; + queue_cancel(client_map.queue); for (int i = 0; i < NUM_MESHGEN_THREADS; i++) if (client_map.meshgen_threads[i]) diff --git a/src/client/client_map.h b/src/client/client_map.h index b9e0616..34998b5 100644 --- a/src/client/client_map.h +++ b/src/client/client_map.h @@ -27,7 +27,7 @@ extern struct ClientMap { Map *map; // map object Queue *queue; // MapBlock * queue (thread safe) - bool cancel; // used to notify meshgen and sync thread about quit + atomic_bool cancel; // used to notify meshgen and sync thread about quit pthread_t meshgen_threads[NUM_MESHGEN_THREADS]; // consumer threads for meshgen queue pthread_t sync_thread; // this thread requests new / changed blocks from server u32 simulation_distance; // simulation distance sent by server diff --git a/src/server/server.c b/src/server/server.c index 37974fb..22308de 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -70,9 +70,9 @@ int main(int argc, char **argv) server->on_recv_type[DRAGONNET_TYPE_ToServerRequestBlock] = (void *) &on_ToServerRequestBlock; interrupt_init(); - server_player_init(); database_init(); server_map_init(); + server_player_init(); server_map_prepare_spawn(); dragonnet_listener_run(server); @@ -82,9 +82,9 @@ int main(int argc, char **argv) printf("Shutting down\n"); dragonnet_listener_close(server); + server_player_deinit(); server_map_deinit(); database_deinit(); - server_player_deinit(); interrupt_deinit(); dragonnet_listener_delete(server); -- 2.44.0