aboutsummaryrefslogtreecommitdiff
path: root/src/solvers/solutions.h
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-05-23 16:48:58 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2025-05-23 16:54:59 +0200
commitc6a77f30f64be73a5e55e06336975f2ecfbb2324 (patch)
tree3c243fbee268b824f18c5dc4d5bff9a9413b9407 /src/solvers/solutions.h
parent62d87e063318cc4c842b1b2d8c184f48aeaf6659 (diff)
downloadnissy-core-c6a77f30f64be73a5e55e06336975f2ecfbb2324.tar.gz
nissy-core-c6a77f30f64be73a5e55e06336975f2ecfbb2324.zip
Do all loggin in main thread
Before this committ, the solver (via the generic solution-appender routines in src/solve/solutions.h) and the H48 data generator did some logging in the worker threads, without using any locks. This was not nice, but in practice it did not cause any problem, because the log messages were rare. However, this turned out to be a problem when building to WASM, because web workers do not have access to the main JS memory, and therefore they cannot call functions from the main JS. This includes not only the callback functions for logging, but also those for polling the status of the solver (run / pause / stop). This commit fixes this at the cost or being somewhat inelegant: the solutions are not logged as they are found, but only every 500ms.
Diffstat (limited to 'src/solvers/solutions.h')
-rw-r--r--src/solvers/solutions.h24
1 files changed, 3 insertions, 21 deletions
diff --git a/src/solvers/solutions.h b/src/solvers/solutions.h
index 75d0804..182ae18 100644
--- a/src/solvers/solutions.h
+++ b/src/solvers/solutions.h
@@ -12,8 +12,7 @@ STATIC bool appendnormal(
12STATIC bool appendinverse( 12STATIC bool appendinverse(
13 const solution_moves_t [static 1], solution_list_t [static 1]); 13 const solution_moves_t [static 1], solution_list_t [static 1]);
14STATIC int64_t appendsolution(const solution_moves_t [static 1], 14STATIC int64_t appendsolution(const solution_moves_t [static 1],
15 const solution_settings_t [static 1], solution_list_t [static 1], bool, 15 const solution_settings_t [static 1], solution_list_t [static 1]);
16 const char *);
17STATIC bool solutions_done(const solution_list_t [static 1], 16STATIC bool solutions_done(const solution_list_t [static 1],
18 const solution_settings_t [static 1], int8_t depth); 17 const solution_settings_t [static 1], int8_t depth);
19 18
@@ -53,10 +52,8 @@ solution_moves_reorient(solution_moves_t moves[static 1], uint8_t or)
53STATIC bool 52STATIC bool
54solution_list_init(solution_list_t sols[static 1], size_t n, char buf[n]) 53solution_list_init(solution_list_t sols[static 1], size_t n, char buf[n])
55{ 54{
56 if (n == 0) { 55 if (n == 0)
57 LOG("Error: cannot use solution buffer with size 0\n");
58 return false; 56 return false;
59 }
60 57
61 sols->nsols = 0; 58 sols->nsols = 0;
62 sols->shortest_sol = MAXLEN + 1; 59 sols->shortest_sol = MAXLEN + 1;
@@ -158,16 +155,13 @@ STATIC int64_t
158appendsolution( 155appendsolution(
159 const solution_moves_t moves[static 1], 156 const solution_moves_t moves[static 1],
160 const solution_settings_t settings[static 1], 157 const solution_settings_t settings[static 1],
161 solution_list_t list[static 1], 158 solution_list_t list[static 1]
162 bool log,
163 const char *solver_name
164) 159)
165{ 160{
166 int64_t r; 161 int64_t r;
167 int i; 162 int i;
168 uint8_t t; 163 uint8_t t;
169 solution_moves_t tsol[NTRANS]; 164 solution_moves_t tsol[NTRANS];
170 char *last_start;
171 165
172 if (moves->nmoves + moves->npremoves > MAXLEN) 166 if (moves->nmoves + moves->npremoves > MAXLEN)
173 goto appendsolution_error_solution_length; 167 goto appendsolution_error_solution_length;
@@ -210,8 +204,6 @@ appendsolution(
210 if (solution_moves_is_duplicate(r, tsol)) 204 if (solution_moves_is_duplicate(r, tsol))
211 continue; 205 continue;
212 206
213 last_start = list->buf + list->used;
214
215 /* Append first the moves on the side that has more */ 207 /* Append first the moves on the side that has more */
216 /* E.g. write (U L F) B instead of B (U L F) */ 208 /* E.g. write (U L F) B instead of B (U L F) */
217 if (tsol[r].nmoves >= tsol[r].npremoves) { 209 if (tsol[r].nmoves >= tsol[r].npremoves) {
@@ -244,26 +236,16 @@ appendsolution(
244 list->shortest_sol, tsol[r].nmoves + tsol[r].npremoves); 236 list->shortest_sol, tsol[r].nmoves + tsol[r].npremoves);
245 r++; 237 r++;
246 238
247 if (log) {
248 list->buf[list->used-1] = '\0';
249 LOG("[%s solve] Found solution #%" PRIu64 ": %s\n",
250 solver_name, list->nsols, last_start);
251 list->buf[list->used-1] = '\n';
252 }
253 } 239 }
254 240
255 list->buf[list->used] = '\0'; 241 list->buf[list->used] = '\0';
256 return r; 242 return r;
257 243
258appendsolution_error_buffer: 244appendsolution_error_buffer:
259 LOG("[%s solve] Error: buffer too small\n", solver_name);
260 list->buf[0] = '\0'; 245 list->buf[0] = '\0';
261 return NISSY_ERROR_BUFFER_SIZE; 246 return NISSY_ERROR_BUFFER_SIZE;
262 247
263appendsolution_error_solution_length: 248appendsolution_error_solution_length:
264 LOG("[%s solve] Error: solution is too long (%" PRIu8 ").\n"
265 "This is a bug, please report it.\n",
266 solver_name, moves->nmoves + moves->npremoves);
267 list->buf[0] = '\0'; 249 list->buf[0] = '\0';
268 return NISSY_ERROR_UNKNOWN; 250 return NISSY_ERROR_UNKNOWN;
269} 251}

Generated with cgit - Back to sebastiano.tronto.net