| 150 | } |
| 151 | |
| 152 | void * |
| 153 | thread_loop(void *arg ATS_UNUSED) |
| 154 | { |
| 155 | /* Infinite loop */ |
| 156 | for (;;) { |
| 157 | /* returns a job or null if no jobs to do */ |
| 158 | auto job_todo = static_cast<Job *>(remove_from_queue(&job_queue)); |
| 159 | |
| 160 | if (job_todo != nullptr) { |
| 161 | TSAssert(job_todo->magic == MAGIC_ALIVE); |
| 162 | |
| 163 | /* Simply execute the job function */ |
| 164 | job_todo->func(job_todo->cont, job_todo->data); |
| 165 | |
| 166 | /* Destroy this job */ |
| 167 | job_delete(job_todo); |
| 168 | } else { |
| 169 | /* Sleep until we get awake (probably some work to do) */ |
| 170 | pthread_mutex_lock(&cond_mutex); |
| 171 | pthread_cond_wait(&cond, &cond_mutex); |
| 172 | pthread_mutex_unlock(&cond_mutex); |
| 173 | } |
| 174 | } |
| 175 | return nullptr; |
| 176 | } |
nothing calls this directly
no test coverage detected