From 52ea538bc1c6cc7933c29dec4e1df396bcaebf74 Mon Sep 17 00:00:00 2001
From: Ralph Castain <rhc@open-mpi.org>
Date: Mon, 9 Nov 2015 09:00:59 -0800
Subject: [PATCH] Per fix from Nysal: set the listener_active flag before
 starting the progress thread, and declare the flag to be volatile

---
 .../pmix/src/server/pmix_server_listener.c       |  3 ++-
 .../pmix1xx/pmix/src/server/pmix_server_ops.h    | 16 ++++++++--------
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/opal/mca/pmix/pmix1xx/pmix/src/server/pmix_server_listener.c b/opal/mca/pmix/pmix1xx/pmix/src/server/pmix_server_listener.c
index 7c5b16f4e2..4fe76cfb9c 100644
--- a/opal/mca/pmix/pmix1xx/pmix/src/server/pmix_server_listener.c
+++ b/opal/mca/pmix/pmix1xx/pmix/src/server/pmix_server_listener.c
@@ -145,10 +145,11 @@ pmix_status_t pmix_start_listening(struct sockaddr_un *address)
             return PMIX_ERR_OUT_OF_RESOURCE;
         }
         /* fork off the listener thread */
+        pmix_server_globals.listen_thread_active = true;
         if (0 > pthread_create(&engine, NULL, listen_thread, NULL)) {
+            pmix_server_globals.listen_thread_active = false;
             return PMIX_ERROR;
         }
-        pmix_server_globals.listen_thread_active = true;
     }
 
     return PMIX_SUCCESS;
diff --git a/opal/mca/pmix/pmix1xx/pmix/src/server/pmix_server_ops.h b/opal/mca/pmix/pmix1xx/pmix/src/server/pmix_server_ops.h
index 9861178759..cfaa949d73 100644
--- a/opal/mca/pmix/pmix1xx/pmix/src/server/pmix_server_ops.h
+++ b/opal/mca/pmix/pmix1xx/pmix/src/server/pmix_server_ops.h
@@ -138,14 +138,14 @@ typedef struct {
 PMIX_CLASS_DECLARATION(pmix_pending_connection_t);
 
 typedef struct {
-    pmix_pointer_array_t clients;  // array of pmix_peer_t local clients
-    pmix_list_t collectives;       // list of active pmix_server_trkr_t
-    pmix_list_t remote_pnd;        // list of pmix_dmdx_remote_t awaiting arrival of data fror servicing remote req's
-    pmix_list_t local_reqs;        // list of pmix_dmdx_local_t awaiting arrival of data from local neighbours
-    bool listen_thread_active;     // listen thread is running
-    int listen_socket;             // socket listener is watching
-    int stop_thread[2];            // pipe used to stop listener thread
-    pmix_buffer_t gdata;           // cache of data given to me for passing to all clients
+    pmix_pointer_array_t clients;           // array of pmix_peer_t local clients
+    pmix_list_t collectives;                // list of active pmix_server_trkr_t
+    pmix_list_t remote_pnd;                 // list of pmix_dmdx_remote_t awaiting arrival of data fror servicing remote req's
+    pmix_list_t local_reqs;                 // list of pmix_dmdx_local_t awaiting arrival of data from local neighbours
+    volatile bool listen_thread_active;     // listen thread is running
+    int listen_socket;                      // socket listener is watching
+    int stop_thread[2];                     // pipe used to stop listener thread
+    pmix_buffer_t gdata;                    // cache of data given to me for passing to all clients
 } pmix_server_globals_t;
 
 #define PMIX_PEER_CADDY(c, p, t)                \