X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=urcu%2Fworkqueue-fifo.h;h=6918a8217bdb3e289404ca3983540073d9234fd8;hb=refs%2Fheads%2Furcu%2Fworkqueue-wakeup;hp=ff0c650571a175ae6c809eee41d9f3135131ce36;hpb=f00ae1883551dd4150891251559c3d9a4a57eebe;p=urcu.git diff --git a/urcu/workqueue-fifo.h b/urcu/workqueue-fifo.h index ff0c650..6918a82 100644 --- a/urcu/workqueue-fifo.h +++ b/urcu/workqueue-fifo.h @@ -69,7 +69,7 @@ struct urcu_workqueue { unsigned long nr_work; /* Current number of work items */ int worker_flags; /* Worker flags */ - bool shutdown; /* Shutdown performed */ + int shutdown; /* Shutdown performed */ }; struct urcu_worker { @@ -195,7 +195,7 @@ void urcu_worker_unregister(struct urcu_workqueue *queue, /* * Make sure we are removed from waitqueue. */ - if (CMM_LOAD_SHARED(worker->wait_node.node.next)) + if (urcu_in_waitqueue(&worker->wait_node)) __urcu_workqueue_wakeup_all(queue); /* @@ -404,14 +404,9 @@ enum urcu_accept_ret urcu_accept_work(struct urcu_worker *worker) return URCU_ACCEPT_SHUTDOWN; urcu_wait_set_state(&worker->wait_node, URCU_WAIT_WAITING); - if (!CMM_LOAD_SHARED(worker->wait_node.node.next)) { + if (!urcu_in_waitqueue(&worker->wait_node)) { int was_empty; - /* - * NULL next pointer. We are therefore not in - * the queue. - */ - cds_lfs_node_init(&worker->wait_node.node); /* Protect stack dequeue against ABA */ synchronize_rcu(); was_empty = !urcu_wait_add(&queue->waitqueue, @@ -433,13 +428,11 @@ enum urcu_accept_ret urcu_accept_work(struct urcu_worker *worker) } } else { /* - * Non-NULL next pointer. We are therefore in - * the queue, or the dispatcher just removed us - * from it (after we read the next pointer), and - * is therefore awakening us. The state will - * therefore have been changed from WAITING to - * some other state, which will let the busy - * wait pass through. + * We are in the queue, or the dispatcher just removed + * us from it (after we read the next pointer), and is + * therefore awakening us. The state will therefore have + * been changed from WAITING to some other state, which + * will let the busy wait pass through. */ } urcu_adaptative_busy_wait(&worker->wait_node); @@ -514,13 +507,15 @@ bool urcu_workqueue_steal_all(struct urcu_workqueue *queue, struct urcu_worker *sibling; bool has_work = false; - rcu_read_lock(); - /* Steal from each worker */ - cds_list_for_each_entry_rcu(sibling, &queue->sibling_head, - sibling_node) - has_work |= ___urcu_grab_work(worker, &sibling->head, - &sibling->tail, 1); - rcu_read_unlock(); + if (worker->flags & URCU_WORKER_STEAL) { + rcu_read_lock(); + /* Steal from each worker */ + cds_list_for_each_entry_rcu(sibling, &queue->sibling_head, + sibling_node) + has_work |= ___urcu_grab_work(worker, &sibling->head, + &sibling->tail, 1); + rcu_read_unlock(); + } /* Steal from global workqueue */ has_work |= ___urcu_grab_work(worker, &queue->head, &queue->tail, 0);