static void dispatchJob(UA_Server *server, const UA_Job *job) { struct DispatchJob *dj = UA_malloc(sizeof(struct DispatchJob)); dj->job = *job; cds_wfcq_node_init(&dj->node); cds_wfcq_enqueue(&server->dispatchQueue_head, &server->dispatchQueue_tail, &dj->node); }
/** Dispatch jobs to workers. Slices the job array up if it contains more than BATCHSIZE items. The jobs array is freed in the worker threads. */ static void dispatchJobs(UA_Server *server, UA_Job *jobs, size_t jobsSize) { size_t startIndex = jobsSize; // start at the end while(jobsSize > 0) { size_t size = BATCHSIZE; if(size > jobsSize) size = jobsSize; startIndex = startIndex - size; struct DispatchJobsList *wln = UA_malloc(sizeof(struct DispatchJobsList)); if(startIndex > 0) { wln->jobs = UA_malloc(size * sizeof(UA_Job)); memcpy(wln->jobs, &jobs[startIndex], size * sizeof(UA_Job)); wln->jobsSize = size; } else { /* forward the original array */ wln->jobsSize = size; wln->jobs = jobs; } cds_wfcq_node_init(&wln->node); cds_wfcq_enqueue(&server->dispatchQueue_head, &server->dispatchQueue_tail, &wln->node); jobsSize -= size; } }
static int enqueue_values(struct cds_wfcq_head *head, struct cds_wfcq_tail *tail, int *values, size_t nr_values) { int ret = 0; unsigned int i; for (i = 0; i < nr_values; i++) { struct mynode *node; node = malloc(sizeof(*node)); if (!node) { ret = -1; goto end; } cds_wfcq_node_init(&node->node); node->value = values[i]; cds_wfcq_enqueue(head, tail, &node->node); } end: return ret; }