struct asys_job *job;
int ret, jobid;
- ret = pthreadpool_finished_job(ctx->pool, &jobid);
- if (ret != 0) {
- return ret;
+ ret = pthreadpool_finished_jobs(ctx->pool, &jobid, 1);
+ if (ret < 0) {
+ return -ret;
}
if ((jobid < 0) || (jobid >= ctx->num_jobs)) {
return EIO;
int i, num_pending;
int job_id;
- if (pthreadpool_finished_job(ctx->pool, &job_id) != 0) {
+ if (pthreadpool_finished_jobs(ctx->pool, &job_id, 1) < 0) {
return;
}
* Fetch a finished job number from the signal pipe
*/
-int pthreadpool_finished_job(struct pthreadpool *pool, int *jobid)
+int pthreadpool_finished_jobs(struct pthreadpool *pool, int *jobids,
+ unsigned num_jobids)
{
- int ret_jobid;
- ssize_t nread;
+ ssize_t to_read, nread;
nread = -1;
errno = EINTR;
+ to_read = sizeof(int) * num_jobids;
+
while ((nread == -1) && (errno == EINTR)) {
- nread = read(pool->sig_pipe[0], &ret_jobid, sizeof(int));
+ nread = read(pool->sig_pipe[0], jobids, to_read);
}
if (nread == -1) {
- return errno;
+ return -errno;
}
- if (nread != sizeof(int)) {
- return EINVAL;
+ if ((nread % sizeof(int)) != 0) {
+ return -EINVAL;
}
- *jobid = ret_jobid;
- return 0;
+ return nread / sizeof(int);
}
/*
*
* This adds a job to a pthreadpool. The job can be identified by
* job_id. This integer will be returned from
- * pthreadpool_finished_job() then the job is completed.
+ * pthreadpool_finished_jobs() then the job is completed.
*
* @param[in] pool The pool to run the job on
* @param[in] job_id A custom identifier
int pthreadpool_signal_fd(struct pthreadpool *pool);
/**
- * @brief Get the job_id of a finished job
+ * @brief Get the job_ids of finished jobs
*
* This blocks until a job has finished unless the fd returned by
* pthreadpool_signal_fd() is readable.
*
* @param[in] pool The pool to query for finished jobs
- * @param[out] pjobid The job_id of the finished job
- * @return success: 0, failure: errno
+ * @param[out] jobids The job_ids of the finished job
+ * @param[int] num_jobids The job_ids array size
+ * @return success: >=0, number of finished jobs
+ * failure: -errno
*/
-int pthreadpool_finished_job(struct pthreadpool *pool, int *jobid);
+int pthreadpool_finished_jobs(struct pthreadpool *pool, int *jobids,
+ unsigned num_jobids);
#endif
}
-int pthreadpool_finished_job(struct pthreadpool *pool, int *jobid)
+int pthreadpool_finished_jobs(struct pthreadpool *pool, int *jobids,
+ unsigned num_jobids)
{
- int ret_jobid;
- ssize_t nread;
+ ssize_t to_read, nread;
+ int ret;
nread = -1;
errno = EINTR;
+ to_read = sizeof(int) * num_jobids;
+
while ((nread == -1) && (errno == EINTR)) {
- nread = read(pool->sig_pipe[0], &ret_jobid, sizeof(int));
+ nread = read(pool->sig_pipe[0], jobids, to_read);
}
if (nread == -1) {
- return errno;
+ return -errno;
}
- if (nread != sizeof(int)) {
- return EINVAL;
+ if ((nread % sizeof(int)) != 0) {
+ return -EINVAL;
}
- *jobid = ret_jobid;
pool->pipe_busy = 0;
- return pthreadpool_write_to_pipe(pool);
+
+ ret = pthreadpool_write_to_pipe(pool);
+ if (ret != 0) {
+ return -ret;
+ }
+
+ return nread / sizeof(int);
}
int pthreadpool_destroy(struct pthreadpool *pool)
for (i=0; i<num_jobs; i++) {
int jobid = -1;
- ret = pthreadpool_finished_job(p, &jobid);
- if ((ret != 0) || (jobid >= num_jobs)) {
+ ret = pthreadpool_finished_jobs(p, &jobid, 1);
+ if ((ret != 1) || (jobid >= num_jobs)) {
fprintf(stderr, "invalid job number %d\n", jobid);
return -1;
}
continue;
}
- ret = pthreadpool_finished_job(pools[j], &jobid);
- if ((ret != 0) || (jobid >= num_jobs * num_threads)) {
+ ret = pthreadpool_finished_jobs(pools[j], &jobid, 1);
+ if ((ret != 1) || (jobid >= num_jobs * num_threads)) {
fprintf(stderr, "invalid job number %d\n",
jobid);
return -1;
return;
}
- ret = pthreadpool_finished_job(open_pool, &jobid);
- if (ret) {
+ ret = pthreadpool_finished_jobs(open_pool, &jobid, 1);
+ if (ret != 1) {
smb_panic("aio_open_handle_completion");
/* notreached. */
return;
strerror(ret));
break;
}
- ret = pthreadpool_finished_job(pool, &jobid);
- if (ret != 0) {
+ ret = pthreadpool_finished_jobs(pool, &jobid, 1);
+ if (ret < 0) {
d_fprintf(stderr, "pthreadpool_finished_job failed: %s\n",
- strerror(ret));
+ strerror(-ret));
break;
}
}
pthreadpool_destroy(pool);
- return (ret == 0);
+ return (ret == 1);
}