102 task->
done = ( (initstat == -1)? -1 : 0);
104 pthread_mutex_init(&task->
mutex, NULL);
105 pthread_cond_init(&task->
cond, NULL);
113 pthread_mutex_destroy(&task->
mutex);
114 pthread_cond_destroy(&task->
cond);
125 pthread_mutex_lock(&task->
mutex);
127 pthread_cond_wait(&task->
cond, &task->
mutex);
128 pthread_mutex_unlock(&task->
mutex);
133 unsigned int que_len = 0;
162 if (task->
done == -1)
165 pthread_mutex_lock(&task->
mutex);
167 printf(
"worker %d on task %d\n", wid, task->
id);
173 pthread_cond_signal(&task->
cond);
174 pthread_mutex_unlock(&task->
mutex);
178 printf(
"worker %d is leaving\n", wid);
197 size_t stacksize = 2*1024*1024;
199 pthread_attr_init(&attr);
200 pthread_attr_setstacksize(&attr, stacksize);
201 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
204 for (i = 0; i < n; i++)
206 id = (
int*) malloc(
sizeof(
int));
208 thread = (pthread_t*) malloc(
sizeof(pthread_t));
220 pthread_detach(*thread);
223 pthread_attr_destroy(&attr);
244 for (i = 0; i < n; i++)
void XrdFfsQueue_free_task(struct XrdFfsQueueTasks *task)
struct XrdFfsQueueTasks * XrdFfsQueueTaskque_head
int XrdFfsQueue_remove_workers(int n)
pthread_mutex_t XrdFfsQueueWorker_mutex
unsigned int XrdFfsQueueWorker_id
unsigned int XrdFfsQueueNext_task_id
struct XrdFfsQueueTasks * XrdFfsQueue_dequeue()
struct XrdFfsQueueTasks * XrdFfsQueue_create_task(void *(*func)(void *), void **args, short initstat)
pthread_mutex_t XrdFfsQueueTaskque_mutex
void XrdFfsQueue_enqueue(struct XrdFfsQueueTasks *task)
int XrdFfsQueue_count_workers()
int XrdFfsQueue_create_workers(int n)
struct XrdFfsQueueTasks * XrdFfsQueueTaskque_tail
pthread_cond_t XrdFfsQueueTaskque_cond
unsigned short XrdFfsQueueNworkers
unsigned int XrdFfsQueue_count_tasks()
void * XrdFfsQueue_worker(void *x)
void XrdFfsQueue_wait_task(struct XrdFfsQueueTasks *task)
struct XrdFfsQueueTasks * prev
struct XrdFfsQueueTasks * next