[ 
https://issues.apache.org/jira/browse/DISPATCH-2238?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17404431#comment-17404431
 ] 

ASF GitHub Bot commented on DISPATCH-2238:
------------------------------------------

ChugR commented on a change in pull request #1349:
URL: https://github.com/apache/qpid-dispatch/pull/1349#discussion_r695728502



##########
File path: src/router_core/router_core_thread.c
##########
@@ -174,37 +174,11 @@ void qdr_adaptors_finalize(qdr_core_t *core)
 }
 
 
-/*
- * router_core_process_background_action_LH
- *
- * Process up to one available background action.
- * Return true iff an action was processed.
- */
-static bool router_core_process_background_action_LH(qdr_core_t *core)
-{
-    qdr_action_t *action = DEQ_HEAD(core->action_list_background);
-
-    if (!!action) {
-        DEQ_REMOVE_HEAD(core->action_list_background);
-        sys_mutex_unlock(core->action_lock);
-        if (action->label)
-            qd_log(core->log, QD_LOG_TRACE, "Core background action '%s'%s", 
action->label, core->running ? "" : " (discard)");
-        action->action_handler(core, action, !core->running);
-        sys_mutex_lock(core->action_lock);
-
-        free_qdr_action_t(action);
-        return true;
-    }
-
-    return false;
-}
-
-
 void *router_core_thread(void *arg)
 {
     qdr_core_t        *core = (qdr_core_t*) arg;
     qdr_action_list_t  action_list;

Review comment:
       Where is action list initialized?

##########
File path: src/router_core/router_core_thread.c
##########
@@ -213,25 +187,48 @@ void *router_core_thread(void *arg)
         //
         sys_mutex_lock(core->action_lock);
 
-        //
-        // Block on the condition variable when there is no action to do
-        //
-        while (core->running && DEQ_IS_EMPTY(core->action_list)) {
-            if (!router_core_process_background_action_LH(core))
-                sys_cond_wait(core->action_cond, core->action_lock);
+        for (;;) {
+            if (!DEQ_IS_EMPTY(core->action_list)) {

Review comment:
       This loop could initialize local action list with:
       DEQ_MOVE(core->action_list, action_list);
       if (!DEQ_IS_EMPTY(action_list) {
           break;
       }




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


> Avoid holding the core action lock when waking the core thread
> --------------------------------------------------------------
>
>                 Key: DISPATCH-2238
>                 URL: https://issues.apache.org/jira/browse/DISPATCH-2238
>             Project: Qpid Dispatch
>          Issue Type: Improvement
>          Components: Router Node
>    Affects Versions: 1.17.0
>            Reporter: Ken Giusti
>            Assignee: Ken Giusti
>            Priority: Minor
>             Fix For: 1.18.0
>
>
> Currently when an action is queued for the core to process, the queuing code 
> calls pthread_cond_signal() while holding the associated mutex.  This can 
> cause the core thread to be woken then immediately put sleep while taking the 
> mutex.
>  
> It is legal to call pthread_cond_signal() without holding the lock. Doing 
> this will avoid contention on the associated mutex.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to