You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2019/04/09 13:04:35 UTC

[qpid-dispatch] 04/04: DISPATCH-1316: atomic checking for deletability

This is an automated email from the ASF dual-hosted git repository.

gsim pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git

commit 2f91e200a1cf5739e0163709cbb1fa14f8302d1c
Author: Gordon Sim <gs...@redhat.com>
AuthorDate: Mon Apr 8 22:20:16 2019 +0100

    DISPATCH-1316: atomic checking for deletability
---
 src/remote_sasl.c | 53 +++++++++++++++++++++++++++++++++++------------------
 1 file changed, 35 insertions(+), 18 deletions(-)

diff --git a/src/remote_sasl.c b/src/remote_sasl.c
index 6d79191..82b7887 100644
--- a/src/remote_sasl.c
+++ b/src/remote_sasl.c
@@ -46,7 +46,6 @@ const int8_t DOWNSTREAM_MECHANISMS_RECEIVED = 3;
 const int8_t DOWNSTREAM_CHALLENGE_RECEIVED = 4;
 const int8_t DOWNSTREAM_OUTCOME_RECEIVED = 5;
 const int8_t DOWNSTREAM_CLOSED = 6;
-const int8_t UPSTREAM_CLOSED = 7;
 
 typedef struct {
     size_t used;
@@ -110,6 +109,8 @@ typedef struct
     char* username;
     permissions_t permissions;
     pn_sasl_outcome_t outcome;
+
+    sys_mutex_t *lock;
 } qdr_sasl_relay_t;
 
 static void copy_bytes(const pn_bytes_t* from, qdr_owned_bytes_t* to)
@@ -132,6 +133,7 @@ static qdr_sasl_relay_t* new_qdr_sasl_relay_t(const char* address, const char* s
     }
     instance->proactor = proactor;
     init_permissions(&instance->permissions);
+    instance->lock = sys_mutex();
     return instance;
 }
 
@@ -147,6 +149,7 @@ static void delete_qdr_sasl_relay_t(qdr_sasl_relay_t* instance)
     if (instance->username) free(instance->username);
     free_buffer(&(instance->permissions.targets));
     free_buffer(&(instance->permissions.sources));
+    sys_mutex_free(instance->lock);
     free(instance);
 }
 
@@ -266,23 +269,40 @@ static bool notify_downstream(qdr_sasl_relay_t* impl, uint8_t state)
     }
 }
 
+static bool delete_on_downstream_freed(qdr_sasl_relay_t* impl)
+{
+    bool result;
+    sys_mutex_lock(impl->lock);
+    impl->downstream_released = true;
+    result = impl->upstream_released;
+    sys_mutex_unlock(impl->lock);
+    return result;
+}
+
+static bool delete_on_upstream_freed(qdr_sasl_relay_t* impl)
+{
+    bool result;
+    sys_mutex_lock(impl->lock);
+    impl->upstream_released = true;
+    result = impl->downstream_released || impl->downstream == 0;
+    sys_mutex_unlock(impl->lock);
+    return result;
+}
+
+static bool can_delete(pn_transport_t *transport, qdr_sasl_relay_t* impl)
+{
+    if (pnx_sasl_is_client(transport)) {
+        return delete_on_downstream_freed(impl);
+    } else {
+        return delete_on_upstream_freed(impl);
+    }
+}
+
 static void remote_sasl_free(pn_transport_t *transport)
 {
     qdr_sasl_relay_t* impl = (qdr_sasl_relay_t*) pnx_sasl_get_context(transport);
-    if (impl) {
-        if (pnx_sasl_is_client(transport)) {
-            impl->downstream_released = true;
-            if (impl->upstream_released) {
-                delete_qdr_sasl_relay_t(impl);
-            }
-        } else {
-            impl->upstream_released = true;
-            if (impl->downstream_released || impl->downstream == 0) {
-                delete_qdr_sasl_relay_t(impl);
-            } else {
-                notify_downstream(impl, UPSTREAM_CLOSED);
-            }
-        }
+    if (impl && can_delete(transport, impl)) {
+        delete_qdr_sasl_relay_t(impl);
     }
 }
 
@@ -317,9 +337,6 @@ static void remote_sasl_prepare(pn_transport_t *transport)
         } else if (impl->downstream_state == UPSTREAM_RESPONSE_RECEIVED) {
             pnx_sasl_set_bytes_out(transport, pn_bytes(impl->response.size, impl->response.start));
             pnx_sasl_set_desired_state(transport, SASL_POSTED_RESPONSE);
-        } else if (impl->downstream_state == UPSTREAM_CLOSED) {
-            impl->downstream_state = 0;
-            pn_transport_close_head(transport);
         }
         impl->downstream_state = 0;
     } else {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org