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