aboutsummaryrefslogtreecommitdiff
path: root/src/solvers/h48
diff options
context:
space:
mode:
authorenricotenuti <tenutz_27@outlook.it>2024-09-25 11:00:40 +0200
committerenricotenuti <tenutz_27@outlook.it>2024-09-25 11:00:40 +0200
commit2c109db35b3b30b27e71e7811776edec1af1208e (patch)
tree18a36efd89f39943868ff9e61f18a70dd08e8303 /src/solvers/h48
parentc299466bfa9a9a172e1cc021cf7b9ed6a4093888 (diff)
downloadnissy-core-2c109db35b3b30b27e71e7811776edec1af1208e.tar.gz
nissy-core-2c109db35b3b30b27e71e7811776edec1af1208e.zip
Fixed nsols, added atomic vars where possible
Diffstat (limited to 'src/solvers/h48')
-rw-r--r--src/solvers/h48/thread.h20
1 files changed, 8 insertions, 12 deletions
diff --git a/src/solvers/h48/thread.h b/src/solvers/h48/thread.h
index 155bc6a..d035b52 100644
--- a/src/solvers/h48/thread.h
+++ b/src/solvers/h48/thread.h
@@ -11,11 +11,11 @@ typedef struct
11 int front; 11 int front;
12 int rear; 12 int rear;
13 int tasks_count; 13 int tasks_count;
14 int active; 14 atomic_int active;
15 pthread_mutex_t mutex; 15 pthread_mutex_t mutex;
16 pthread_cond_t cond; 16 pthread_cond_t cond;
17 pthread_cond_t active_cond; 17 pthread_cond_t active_cond;
18 bool terminate; 18 atomic_bool terminate;
19} task_queue_t; 19} task_queue_t;
20 20
21STATIC void solve_h48_appendsolution_thread(dfsarg_solveh48_t *, task_queue_t *); 21STATIC void solve_h48_appendsolution_thread(dfsarg_solveh48_t *, task_queue_t *);
@@ -62,6 +62,7 @@ init_queue(task_queue_t *queue)
62 queue->rear = 0; 62 queue->rear = 0;
63 queue->tasks_count = 0; 63 queue->tasks_count = 0;
64 queue->active = 0; 64 queue->active = 0;
65 queue->terminate = ATOMIC_VAR_INIT(false);
65 pthread_mutex_init(&queue->mutex, NULL); 66 pthread_mutex_init(&queue->mutex, NULL);
66 pthread_cond_init(&queue->cond, NULL); 67 pthread_cond_init(&queue->cond, NULL);
67 pthread_cond_init(&queue->active_cond, NULL); 68 pthread_cond_init(&queue->active_cond, NULL);
@@ -93,7 +94,7 @@ copy_queue(task_queue_t *src, task_queue_t *dest, int depth, int64_t *nsols)
93 dest->front = src->front; 94 dest->front = src->front;
94 dest->rear = src->rear; 95 dest->rear = src->rear;
95 dest->tasks_count = src->tasks_count; 96 dest->tasks_count = src->tasks_count;
96 dest->active = src->active; 97 // atomic_init(&dest->active, &src->active);
97 pthread_cond_broadcast(&dest->cond); 98 pthread_cond_broadcast(&dest->cond);
98 pthread_mutex_unlock(&dest->mutex); 99 pthread_mutex_unlock(&dest->mutex);
99} 100}
@@ -121,14 +122,12 @@ start_thread(void *arg)
121 pthread_mutex_unlock(&queue->mutex); 122 pthread_mutex_unlock(&queue->mutex);
122 123
123 solve_h48_single(task, queue); 124 solve_h48_single(task, queue);
124 125
125 pthread_mutex_lock(&queue->mutex); 126 atomic_fetch_sub(&queue->active, 1);
126 queue->active--;
127 127
128 if(queue->tasks_count == 0 && queue->active == 0) 128 if(queue->tasks_count == 0 && queue->active == 0)
129 pthread_cond_signal(&queue->active_cond); 129 pthread_cond_signal(&queue->active_cond);
130 } 130 }
131 pthread_mutex_unlock(&queue->mutex);
132 } 131 }
133 return NULL; 132 return NULL;
134} 133}
@@ -247,7 +246,7 @@ solve_h48_parent(
247 const void *data, 246 const void *data,
248 char *solutions) 247 char *solutions)
249{ 248{
250 int64_t nsols; 249 int64_t nsols = 0;
251 int p_depth = 0; 250 int p_depth = 0;
252 dfsarg_solveh48_t bfs_arg; 251 dfsarg_solveh48_t bfs_arg;
253 tableinfo_t info; 252 tableinfo_t info;
@@ -296,14 +295,11 @@ solve_h48_parent(
296 pthread_mutex_unlock(&nq.mutex); 295 pthread_mutex_unlock(&nq.mutex);
297 } 296 }
298 297
299 pthread_mutex_lock(&nq.mutex); 298 atomic_store(&nq.terminate, true);
300 nq.terminate = true;
301 pthread_cond_broadcast(&nq.cond); 299 pthread_cond_broadcast(&nq.cond);
302 pthread_mutex_unlock(&nq.mutex);
303 300
304 for (int i = 0; i < THREADS; i++){ 301 for (int i = 0; i < THREADS; i++){
305 pthread_join(threads[i], NULL); 302 pthread_join(threads[i], NULL);
306 } 303 }
307 // fix memory release for multiple scrambles.
308 return nsols; 304 return nsols;
309} 305}

Generated with cgit - Back to sebastiano.tronto.net