* Fetch a finished job number from the signal pipe
*/
-int pthreadpool_finished_job(struct pthreadpool *pool)
+int pthreadpool_finished_job(struct pthreadpool *pool, int *jobid)
{
- int result;
+ int ret_jobid;
ssize_t nread;
nread = -1;
errno = EINTR;
while ((nread == -1) && (errno == EINTR)) {
- nread = read(pool->sig_pipe[0], &result, sizeof(int));
+ nread = read(pool->sig_pipe[0], &ret_jobid, sizeof(int));
}
if (nread == -1) {
return errno;
if (nread != sizeof(int)) {
return EINVAL;
}
- return result;
+ *jobid = ret_jobid;
+ return 0;
}
/*
* pthreadpool_signal_fd() is readable.
*
* @param[in] pool The pool to query for finished jobs
- * @return The job_id of the finished job
+ * @param[out] pjobid The job_id of the finished job
+ * @return success: 0, failure: errno
*/
-int pthreadpool_finished_job(struct pthreadpool *pool);
+int pthreadpool_finished_job(struct pthreadpool *pool, int *jobid);
#endif
}
for (i=0; i<num_jobs; i++) {
- ret = pthreadpool_finished_job(p);
- if ((ret < 0) || (ret >= num_jobs)) {
- fprintf(stderr, "invalid job number %d\n", ret);
+ int jobid = -1;
+ ret = pthreadpool_finished_job(p, &jobid);
+ if ((ret != 0) || (jobid >= num_jobs)) {
+ fprintf(stderr, "invalid job number %d\n", jobid);
return -1;
}
- finished[ret] += 1;
+ finished[jobid] += 1;
}
for (i=0; i<num_jobs; i++) {
}
for (j=0; j<num_pools; j++) {
+ int jobid = -1;
if ((pfds[j].revents & (POLLIN|POLLHUP)) == 0) {
continue;
}
- ret = pthreadpool_finished_job(pools[j]);
- if ((ret < 0) || (ret >= num_jobs * num_threads)) {
+ ret = pthreadpool_finished_job(pools[j], &jobid);
+ if ((ret != 0) || (jobid >= num_jobs * num_threads)) {
fprintf(stderr, "invalid job number %d\n",
- ret);
+ jobid);
return -1;
}
- finished[ret] += 1;
+ finished[jobid] += 1;
received += 1;
}
}