Changeset: e79c35f39f10 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e79c35f39f10
Modified Files:
        common/utils/matomic.h
        monetdb5/mal/mal_dataflow.c
Branch: default
Log Message:

Destructor for atomic pointer variables.


diffs (101 lines):

diff --git a/common/utils/matomic.h b/common/utils/matomic.h
--- a/common/utils/matomic.h
+++ b/common/utils/matomic.h
@@ -34,6 +34,7 @@
  *
  * Some of these are also available for pointers:
  * ATOMIC_PTR_INIT
+ * ATOMIC_PTR_DESTROY
  * ATOMIC_PTR_GET
  * ATOMIC_PTR_SET
  * ATOMIC_PTR_XCG
@@ -100,6 +101,7 @@ typedef volatile atomic_address ATOMIC_P
 typedef void *_Atomic volatile ATOMIC_PTR_TYPE;
 #endif
 #define ATOMIC_PTR_INIT(var, val)      atomic_init(var, val)
+#define ATOMIC_PTR_DESTROY(var)                ((void) 0)
 #define ATOMIC_PTR_VAR_INIT(val)       ATOMIC_VAR_INIT(val)
 #define ATOMIC_PTR_GET(var)            atomic_load(var)
 #define ATOMIC_PTR_SET(var, val)       atomic_store(var, (void *) (val))
@@ -211,6 +213,7 @@ ATOMIC_CAS(ATOMIC_TYPE *var, ATOMIC_BASE
 
 typedef PVOID volatile ATOMIC_PTR_TYPE;
 #define ATOMIC_PTR_INIT(var, val)      (*(var) = (val))
+#define ATOMIC_PTR_DESTROY(var)                ((void) 0)
 #define ATOMIC_PTR_VAR_INIT(val)       (val)
 #define ATOMIC_PTR_GET(var)            (*(var))
 #define ATOMIC_PTR_SET(var, val)       _InterlockedExchangePointer(var, 
(PVOID) (val))
@@ -260,6 +263,7 @@ typedef volatile int ATOMIC_TYPE;
 
 typedef void *volatile ATOMIC_PTR_TYPE;
 #define ATOMIC_PTR_INIT(var, val)      (*(var) = (val))
+#define ATOMIC_PTR_DESTROY(var)                ((void) 0)
 #define ATOMIC_PTR_GET(var)            __atomic_load_n(var, __ATOMIC_SEQ_CST)
 #define ATOMIC_PTR_SET(var, val)       __atomic_store_n(var, (val), 
__ATOMIC_SEQ_CST)
 #define ATOMIC_PTR_XCG(var, val)       __atomic_exchange_n(var, (val), 
__ATOMIC_SEQ_CST)
@@ -395,6 +399,8 @@ ATOMIC_PTR_INIT(ATOMIC_PTR_TYPE *var, vo
        var->val = val;
 }
 
+#define ATOMIC_PTR_DESTROY(var)        pthread_mutex_destroy(&(var)->lck)
+
 static inline void *
 ATOMIC_PTR_GET(ATOMIC_PTR_TYPE *var)
 {
diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c
--- a/monetdb5/mal/mal_dataflow.c
+++ b/monetdb5/mal/mal_dataflow.c
@@ -905,16 +905,13 @@ runMALdataflow(Client cntxt, MalBlkPtr m
        flow->cntxt = cntxt;
        flow->mb = mb;
        flow->stk = stk;
-       ATOMIC_PTR_INIT(&flow->error, NULL);
 
        /* keep real block count, exclude brackets */
        flow->start = startpc + 1;
        flow->stop = stoppc;
 
-       MT_lock_init(&flow->flowlock, "flow->flowlock");
        flow->done = q_create(stoppc- startpc+1, "flow->done");
        if (flow->done == NULL) {
-               MT_lock_destroy(&flow->flowlock);
                GDKfree(flow);
                throw(MAL, "dataflow", "runMALdataflow(): Failed to create 
flow->done queue");
        }
@@ -922,7 +919,6 @@ runMALdataflow(Client cntxt, MalBlkPtr m
        flow->status = (FlowEvent)GDKzalloc((stoppc - startpc + 1) * 
sizeof(FlowEventRec));
        if (flow->status == NULL) {
                q_destroy(flow->done);
-               MT_lock_destroy(&flow->flowlock);
                GDKfree(flow);
                throw(MAL, "dataflow", SQLSTATE(HY001) MAL_MALLOC_FAIL);
        }
@@ -932,7 +928,6 @@ runMALdataflow(Client cntxt, MalBlkPtr m
        if (flow->nodes == NULL) {
                GDKfree(flow->status);
                q_destroy(flow->done);
-               MT_lock_destroy(&flow->flowlock);
                GDKfree(flow);
                throw(MAL, "dataflow", SQLSTATE(HY001) MAL_MALLOC_FAIL);
        }
@@ -941,10 +936,11 @@ runMALdataflow(Client cntxt, MalBlkPtr m
                GDKfree(flow->nodes);
                GDKfree(flow->status);
                q_destroy(flow->done);
-               MT_lock_destroy(&flow->flowlock);
                GDKfree(flow);
                throw(MAL, "dataflow", SQLSTATE(HY001) MAL_MALLOC_FAIL);
        }
+       MT_lock_init(&flow->flowlock, "flow->flowlock");
+       ATOMIC_PTR_INIT(&flow->error, NULL);
        msg = DFLOWinitBlk(flow, mb, size);
 
        if (msg == MAL_SUCCEED)
@@ -955,6 +951,7 @@ runMALdataflow(Client cntxt, MalBlkPtr m
        GDKfree(flow->nodes);
        q_destroy(flow->done);
        MT_lock_destroy(&flow->flowlock);
+       ATOMIC_PTR_DESTROY(&flow->error);
        GDKfree(flow);
 
        /* we created one worker, now tell one worker to exit again */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to