| 339 | enum { HANDLER_COUNT = sizeof(handlers) / sizeof(handlers[0]) }; |
| 340 | |
| 341 | void cbm_progress_sink_fn(const char *line) { |
| 342 | progress_sink_mutex_ensure(); |
| 343 | cbm_mutex_lock(&s_sink_mutex); |
| 344 | if (!line || !s_out) { |
| 345 | cbm_mutex_unlock(&s_sink_mutex); |
| 346 | return; |
| 347 | } |
| 348 | char msg[CBM_SZ_64] = {0}; |
| 349 | if (!extract_kv(line, "msg", msg, (int)sizeof(msg))) { |
| 350 | cbm_mutex_unlock(&s_sink_mutex); |
| 351 | return; |
| 352 | } |
| 353 | for (int i = 0; i < HANDLER_COUNT; i++) { |
| 354 | if (strcmp(msg, handlers[i].msg) == 0) { |
| 355 | handlers[i].handler(line); |
| 356 | cbm_mutex_unlock(&s_sink_mutex); |
| 357 | return; |
| 358 | } |
| 359 | } |
| 360 | cbm_mutex_unlock(&s_sink_mutex); |
| 361 | } |