| 1021 | } |
| 1022 | |
| 1023 | void cbm_watcher_touch(cbm_watcher_t *w, const char *project_name) { |
| 1024 | if (!w || !project_name) { |
| 1025 | return; |
| 1026 | } |
| 1027 | cbm_mutex_lock(&w->projects_lock); |
| 1028 | project_state_t *s = cbm_ht_get(w->projects, project_name); |
| 1029 | if (s) { |
| 1030 | /* Reset backoff — poll immediately on next cycle */ |
| 1031 | s->next_poll_ns = 0; |
| 1032 | } |
| 1033 | cbm_mutex_unlock(&w->projects_lock); |
| 1034 | } |
| 1035 | |
| 1036 | int cbm_watcher_watch_count(cbm_watcher_t *w) { |
| 1037 | if (!w) { |
no test coverage detected