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

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

commit c47b976df339ea896b2ba5cf535b9bc07c13534c
Author: Ted Ross <tr...@redhat.com>
AuthorDate: Thu Mar 21 12:53:50 2019 -0400

    DISPATCH-1299 - Added safe-reference feature to the alloc-pool module.
    Note: alloc-malloc also has the same interface (will build), but does not 
provide the same safety.
---
 include/qpid/dispatch/alloc_malloc.h               | 17 +++++++++++++---
 include/qpid/dispatch/alloc_pool.h                 | 12 ++++++++++-
 include/qpid/dispatch/container.h                  |  2 ++
 src/container.c                                    |  1 -
 src/router_core/core_client_api.c                  |  2 ++
 src/router_core/core_timer.c                       |  1 -
 .../address_lookup_server/address_lookup_server.c  |  1 +
 src/router_core/modules/edge_router/edge_mgmt.c    |  1 +
 .../modules/edge_router/link_route_proxy.c         |  1 +
 tests/alloc_test.c                                 | 23 ++++++++++++++++++++++
 10 files changed, 55 insertions(+), 6 deletions(-)

diff --git a/include/qpid/dispatch/alloc_malloc.h 
b/include/qpid/dispatch/alloc_malloc.h
index 12d683e..d89ed28 100644
--- a/include/qpid/dispatch/alloc_malloc.h
+++ b/include/qpid/dispatch/alloc_malloc.h
@@ -21,6 +21,7 @@
 
 #include <stdint.h>
 #include <string.h>
+#include <qpid/dispatch/ctools.h>
 
 /**
  *@file
@@ -29,9 +30,17 @@
  * Useful for debugging with tools like valgrind.
  */
 
-#define ALLOC_DECLARE(T)                        \
-    T *new_##T(void);                           \
-    void free_##T(T *p)
+typedef struct {
+    void     *ptr;
+    uint32_t  seq;
+} qd_alloc_safe_ptr_t;
+
+#define ALLOC_DECLARE(T)                \
+    T *new_##T(void);                   \
+    void free_##T(T *p);                \
+    typedef qd_alloc_safe_ptr_t T##_sp; \
+    void set_safe_ptr_##T(T *p, T##_sp *sp); \
+    T *safe_deref_##T(T##_sp sp)
 
 #define ALLOC_DEFINE_CONFIG(T,S,A,C)                \
     T *new_##T(void) { size_t *a = (A);             \
@@ -41,6 +50,8 @@
     void free_##T(T *p) { size_t *a = (A);          \
         QD_MEMORY_FILL(p, QD_MEMORY_FREE, (S) + (a ? *a : 0)); \
         free(p); }                                  \
+    void set_safe_ptr_##T(T *p, T##_sp *sp) { sp->ptr = (void*) p; sp->seq = 
qd_alloc_sequence((void*) p); } \
+    T *safe_deref_##T(T##_sp sp) { return sp.seq == qd_alloc_sequence((void*) 
sp.ptr) ? (T*) sp.ptr : (T*) 0; } \
     void *unused##T
 
 #define ALLOC_DEFINE(T) ALLOC_DEFINE_CONFIG(T, sizeof(T), 0, 0)
diff --git a/include/qpid/dispatch/alloc_pool.h 
b/include/qpid/dispatch/alloc_pool.h
index 6b66e88..4f6931c 100644
--- a/include/qpid/dispatch/alloc_pool.h
+++ b/include/qpid/dispatch/alloc_pool.h
@@ -69,6 +69,11 @@ typedef struct {
     uint32_t              trailer;
 } qd_alloc_type_desc_t;
 
+typedef struct {
+    void     *ptr;
+    uint32_t  seq;
+} qd_alloc_safe_ptr_t;
+
 /** Allocate in a thread pool. Use via ALLOC_DECLARE */
 void *qd_alloc(qd_alloc_type_desc_t *desc, qd_alloc_pool_t **tpool);
 /** De-allocate from a thread pool. Use via ALLOC_DECLARE */
@@ -81,7 +86,10 @@ uint32_t qd_alloc_sequence(void *p);
 #define ALLOC_DECLARE(T) \
     extern __thread qd_alloc_pool_t *__local_pool_##T; \
     T *new_##T(void);    \
-    void free_##T(T *p)
+    void free_##T(T *p); \
+    typedef qd_alloc_safe_ptr_t T##_sp; \
+    void set_safe_ptr_##T(T *p, T##_sp *sp); \
+    T *safe_deref_##T(T##_sp sp)
 
 /**
  * Define allocator configuration.
@@ -92,6 +100,8 @@ uint32_t qd_alloc_sequence(void *p);
     __thread qd_alloc_pool_t *__local_pool_##T = 0;                     \
     T *new_##T(void) { return (T*) qd_alloc(&__desc_##T, &__local_pool_##T); } 
 \
     void free_##T(T *p) { qd_dealloc(&__desc_##T, &__local_pool_##T, (char*) 
p); } \
+    void set_safe_ptr_##T(T *p, T##_sp *sp) { sp->ptr = (void*) p; sp->seq = 
qd_alloc_sequence((void*) p); } \
+    T *safe_deref_##T(T##_sp sp) { return sp.seq == qd_alloc_sequence((void*) 
sp.ptr) ? (T*) sp.ptr : (T*) 0; } \
     qd_alloc_stats_t *alloc_stats_##T(void) { return __desc_##T.stats; } \
     void *unused##T
 
diff --git a/include/qpid/dispatch/container.h 
b/include/qpid/dispatch/container.h
index 047ac6e..fd35a48 100644
--- a/include/qpid/dispatch/container.h
+++ b/include/qpid/dispatch/container.h
@@ -71,6 +71,8 @@ typedef enum {
 typedef struct qd_node_t     qd_node_t;
 typedef struct qd_link_t     qd_link_t;
 
+ALLOC_DECLARE(qd_link_t);
+
 typedef bool (*qd_container_delivery_handler_t)    (void *node_context, 
qd_link_t *link);
 typedef void (*qd_container_disposition_handler_t) (void *node_context, 
qd_link_t *link, pn_delivery_t *pnd);
 typedef int  (*qd_container_link_handler_t)        (void *node_context, 
qd_link_t *link);
diff --git a/src/container.c b/src/container.c
index 2e9bace..12e6930 100644
--- a/src/container.c
+++ b/src/container.c
@@ -66,7 +66,6 @@ struct qd_link_t {
 
 DEQ_DECLARE(qd_link_t, qd_link_list_t);
 
-ALLOC_DECLARE(qd_link_t);
 ALLOC_DEFINE(qd_link_t);
 ALLOC_DEFINE(qd_link_ref_t);
 
diff --git a/src/router_core/core_client_api.c 
b/src/router_core/core_client_api.c
index 3b32b31..5810207 100644
--- a/src/router_core/core_client_api.c
+++ b/src/router_core/core_client_api.c
@@ -55,6 +55,7 @@ struct qdrc_client_request_t {
     qdrc_client_request_done_CT_t    done_cb;
 };
 DEQ_DECLARE(qdrc_client_request_t, qdrc_client_request_list_t);
+ALLOC_DECLARE(qdrc_client_request_t);
 ALLOC_DEFINE(qdrc_client_request_t);
 
 
@@ -83,6 +84,7 @@ struct qdrc_client_t {
     qdrc_client_on_flow_CT_t    on_flow_cb;
 
 };
+ALLOC_DECLARE(qdrc_client_t);
 ALLOC_DEFINE(qdrc_client_t);
 
 
diff --git a/src/router_core/core_timer.c b/src/router_core/core_timer.c
index d34beb1..7766488 100644
--- a/src/router_core/core_timer.c
+++ b/src/router_core/core_timer.c
@@ -21,7 +21,6 @@
 #include <qpid/dispatch/ctools.h>
 #include "router_core_private.h"
 
-ALLOC_DECLARE(qdr_core_timer_t);
 ALLOC_DEFINE(qdr_core_timer_t);
 
 void qdr_process_tick_CT(qdr_core_t *core, qdr_action_t *action, bool discard);
diff --git 
a/src/router_core/modules/address_lookup_server/address_lookup_server.c 
b/src/router_core/modules/address_lookup_server/address_lookup_server.c
index 7067aa7..278c675 100644
--- a/src/router_core/modules/address_lookup_server/address_lookup_server.c
+++ b/src/router_core/modules/address_lookup_server/address_lookup_server.c
@@ -31,6 +31,7 @@ typedef struct _endpoint_ref {
     const char *container_id;
 } _endpoint_ref_t;
 DEQ_DECLARE(_endpoint_ref_t, _endpoint_ref_list_t);
+ALLOC_DECLARE(_endpoint_ref_t);
 ALLOC_DEFINE(_endpoint_ref_t);
 
 
diff --git a/src/router_core/modules/edge_router/edge_mgmt.c 
b/src/router_core/modules/edge_router/edge_mgmt.c
index e3f8532..beee1c5 100644
--- a/src/router_core/modules/edge_router/edge_mgmt.c
+++ b/src/router_core/modules/edge_router/edge_mgmt.c
@@ -84,6 +84,7 @@ struct qcm_edge_mgmt_request_t {
     qcm_edge_mgmt_reply_CT_t  reply_callback;
     qcm_edge_mgmt_error_CT_t  error_callback;
 };
+ALLOC_DECLARE(qcm_edge_mgmt_request_t);
 ALLOC_DEFINE(qcm_edge_mgmt_request_t);
 
 
diff --git a/src/router_core/modules/edge_router/link_route_proxy.c 
b/src/router_core/modules/edge_router/link_route_proxy.c
index 44e164b..0e8cb7e 100644
--- a/src/router_core/modules/edge_router/link_route_proxy.c
+++ b/src/router_core/modules/edge_router/link_route_proxy.c
@@ -46,6 +46,7 @@ struct link_route_proxy_t {
     link_route_proxy_state_t  proxy_state;
     qd_direction_t            direction;
 };
+ALLOC_DECLARE(link_route_proxy_t);
 ALLOC_DEFINE(link_route_proxy_t);
 DEQ_DECLARE(link_route_proxy_t, link_route_proxy_list_t);
 
diff --git a/tests/alloc_test.c b/tests/alloc_test.c
index 2f05f0c..6b1262c 100644
--- a/tests/alloc_test.c
+++ b/tests/alloc_test.c
@@ -72,12 +72,35 @@ static char* test_alloc_basic(void *context)
     return 0;
 }
 
+
+static char *test_safe_references(void *context)
+{
+    object_t    *obj = new_object_t();
+    object_t_sp  safe_obj;
+
+    set_safe_ptr_object_t(obj, &safe_obj);
+    object_t *alias = safe_deref_object_t(safe_obj);
+
+    if (obj != alias)
+        return "Safe alias was not equal to the original pointer";
+
+    free_object_t(obj);
+    alias = safe_deref_object_t(safe_obj);
+
+    if (alias != 0)
+        return "Safe dereference of a freed object was not null";
+
+    return 0;
+}
+
+
 int alloc_tests(void)
 {
     int result = 0;
     char *test_group = "alloc_tests";
 
     TEST_CASE(test_alloc_basic, 0);
+    TEST_CASE(test_safe_references, 0);
 
     return result;
 }


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

Reply via email to