Changeset: 70ff34dcd93c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=70ff34dcd93c
Modified Files:
sql/storage/bat/bat_storage.c
Branch: default
Log Message:
small cleanup and initial atomics
diffs (282 lines):
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -11,6 +11,8 @@
#include "bat_utils.h"
#include "sql_string.h"
#include "gdk_atoms.h"
+#include "gdk_atoms.h"
+#include "matomic.h"
/*
* The sql data is stored using 2 structure
@@ -96,17 +98,6 @@ temp_delta(sql_delta *d, ulng tid)
return d;
}
-static sql_delta *
-get_delta(sql_delta *d, ulng tid, int type, int is_temp)
-{
- if (is_temp) {
- d = temp_delta(d, tid);
- if (!d)
- return temp_dup_delta(tid, type);
- }
- return d;
-}
-
static sql_dbat *
temp_dup_dbat(ulng tid)
{
@@ -129,85 +120,87 @@ temp_dbat(sql_dbat *d, ulng tid)
return d;
}
-static sql_dbat *
-get_dbat(sql_dbat *d, ulng tid, int is_temp)
+static sql_delta *
+timestamp_delta( sql_trans *tr, sql_delta *d)
{
- if (is_temp) {
- d = temp_dbat(d, tid);
- if (!d)
- return temp_dup_dbat(tid);
- }
+ while (d->next && d->ts != tr->tid && (!tr->parent ||
!tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts)
+ d = d->next;
return d;
}
static sql_delta *
-timestamp_delta( sql_trans *tr, sql_delta *d, int type, int is_temp)
+temp_col_timestamp_delta( sql_trans *tr, sql_column *c)
{
- assert(!is_temp);
- if (is_temp)
- return get_delta(d, tr->tid, type, is_temp);
- while (d->next && d->ts != tr->tid && (!tr->parent ||
!tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts)
- d = d->next;
+ assert(isTempTable(c->t));
+ sql_delta *d = temp_delta(c->data, tr->tid);
+ if (!d) {
+ d = temp_dup_delta(tr->tid, c->type.type->localtype);
+ do {
+ d->next = c->data;
+ } while(!ATOMIC_PTR_CAS(&c->data, &d->next, d)); /* set c->data
= d, when c->data == d->next else d->next = c->data */
+ }
return d;
}
sql_delta *
col_timestamp_delta( sql_trans *tr, sql_column *c)
{
- int is_temp = isTempTable(c->t);
- if (is_temp) {
- sql_delta *d = temp_delta(c->data, tr->tid);
- if (!d) {
- d = temp_dup_delta(tr->tid, c->type.type->localtype);
- d->next = c->data;
- c->data = d;
- }
- return d;
+ if (isTempTable(c->t))
+ return temp_col_timestamp_delta(tr, c);
+ return timestamp_delta( tr, c->data);
+}
+
+static sql_delta *
+temp_idx_timestamp_delta( sql_trans *tr, sql_idx *i)
+{
+ assert(isTempTable(i->t));
+ sql_delta *d = temp_delta(i->data, tr->tid);
+ if (!d) {
+ int type = oid_index(i->type)?TYPE_oid:TYPE_lng;
+ d = temp_dup_delta(tr->tid, type);
+ do {
+ d->next = i->data;
+ } while(!ATOMIC_PTR_CAS(&i->data, &d->next, d)); /* set i->data
= d, when i->data == d->next else d->next = i->data */
}
- return timestamp_delta( tr, c->data, c->type.type->localtype, is_temp);
+ return d;
}
static sql_delta *
idx_timestamp_delta( sql_trans *tr, sql_idx *i)
{
- int type = oid_index(i->type)?TYPE_oid:TYPE_lng;
- int is_temp = isTempTable(i->t);
- if (is_temp) {
- sql_delta *d = temp_delta(i->data, tr->tid);
- if (!d) {
- d = temp_dup_delta(tr->tid, type);
- d->next = i->data;
- i->data = d;
- }
- return d;
- }
- return timestamp_delta( tr, i->data, type, is_temp);
+ if (isTempTable(i->t))
+ return temp_idx_timestamp_delta(tr, i);
+ return timestamp_delta( tr, i->data);
}
static sql_dbat *
-timestamp_dbat( sql_trans *tr, sql_dbat *d, int is_temp)
+timestamp_dbat( sql_trans *tr, sql_dbat *d)
{
- if (is_temp)
- return get_dbat(d, tr->tid, is_temp);
while (d->next && d->ts != tr->tid && (!tr->parent ||
!tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts)
d = d->next;
return d;
}
static sql_dbat *
+temp_tab_timestamp_dbat( sql_trans *tr, sql_table *t)
+{
+ assert(isTempTable(t));
+ sql_dbat *d = temp_dbat(t->data, tr->tid);
+ if (!d) {
+ d = temp_dup_dbat(tr->tid);
+ do {
+ d->next = t->data;
+ } while(!ATOMIC_PTR_CAS(&t->data, &d->next, d)); /* set t->data
= d, when t->data == d->next else d->next = t->data */
+ }
+ return d;
+}
+
+static sql_dbat *
tab_timestamp_dbat( sql_trans *tr, sql_table *t)
{
- int is_temp = isTempTable(t);
- if (is_temp) {
- sql_dbat *d = temp_dbat(t->data, tr->tid);
- if (!d) {
- d = temp_dup_dbat(tr->tid);
- d->next = t->data;
- t->data = d;
- }
- return d;
- }
- return timestamp_dbat( tr, t->data, is_temp);
+ if (isTempTable(t))
+ return temp_tab_timestamp_dbat(tr, t);
+ return timestamp_dbat( tr, t->data);
}
static sql_delta*
@@ -751,28 +744,28 @@ dup_bat(sql_trans *tr, sql_table *t, sql
static sql_delta *
bind_col_data(sql_trans *tr, sql_column *c)
{
- int type = c->type.type->localtype;
- sql_delta *obat = get_delta(c->data, tr->tid, type, isTempTable(c->t));
+ sql_delta *obat = c->data;
- if (obat && obat != c->data) {
- obat->next = c->data;
- c->data = obat;
- }
+ if (isTempTable(c->t))
+ obat = temp_col_timestamp_delta(tr, c);
+
if (obat->ts == tr->tid)
return obat;
if ((!tr->parent || !tr_version_of_parent(tr, obat->ts)) && obat->ts >=
TRANSACTION_ID_BASE && !isTempTable(c->t))
/* abort */
return NULL;
- obat = timestamp_delta(tr, c->data, type, isTempTable(c->t));
+ assert(!isTempTable(c->t));
+ obat = timestamp_delta(tr, c->data);
sql_delta* bat = ZNEW(sql_delta);
if(!bat)
return NULL;
bat->refcnt = 1;
- if(dup_bat(tr, c->t, obat, bat, type, isNew(c)) == LOG_ERR)
+ if(dup_bat(tr, c->t, obat, bat, c->type.type->localtype, isNew(c)) ==
LOG_ERR)
return NULL;
bat->ts = tr->tid;
- bat->next = obat;
- c->data = bat;
+ do {
+ bat->next = obat;
+ } while(!ATOMIC_PTR_CAS(&c->data, &bat->next, bat));
return bat;
}
@@ -821,29 +814,28 @@ update_col(sql_trans *tr, sql_column *c,
static sql_delta *
bind_idx_data(sql_trans *tr, sql_idx *i)
{
- int type = (oid_index(i->type))?TYPE_oid:TYPE_lng;
- sql_delta *obat = get_delta(i->data, tr->tid, type, isTempTable(i->t));
+ sql_delta *obat = i->data;
- if (obat && obat != i->data) {
- obat->next = i->data;
- i->data = obat;
- }
+ if (isTempTable(i->t))
+ obat = temp_idx_timestamp_delta(tr, i);
+
if (obat->ts == tr->tid)
return obat;
if ((!tr->parent || !tr_version_of_parent(tr, obat->ts)) && obat->ts >=
TRANSACTION_ID_BASE && !isTempTable(i->t))
/* abort */
return NULL;
-
- obat = timestamp_delta(tr, i->data, type, isTempTable(i->t));
+ assert(!isTempTable(i->t));
+ obat = timestamp_delta(tr, i->data);
sql_delta* bat = ZNEW(sql_delta);
if(!bat)
return NULL;
bat->refcnt = 1;
- if(dup_bat(tr, i->t, obat, bat, type, isNew(i)) == LOG_ERR)
+ if(dup_bat(tr, i->t, obat, bat, (oid_index(i->type))?TYPE_oid:TYPE_lng,
isNew(i)) == LOG_ERR)
return NULL;
bat->ts = tr->tid;
- bat->next = obat;
- i->data = bat;
+ do {
+ bat->next = obat;
+ } while(!ATOMIC_PTR_CAS(&i->data, &bat->next, bat));
return bat;
}
@@ -1152,27 +1144,27 @@ destroy_dbat(sql_dbat *bat)
static sql_dbat *
bind_del_data(sql_trans *tr, sql_table *t)
{
- sql_dbat *obat = get_dbat(t->data, tr->tid, isTempTable(t));
+ sql_dbat *obat = t->data;
- if (obat && obat != t->data) {
- obat->next = t->data;
- t->data = obat;
- }
+ if (isTempTable(t))
+ obat = temp_tab_timestamp_dbat(tr, t);
if (obat->ts == tr->tid)
return obat;
if ((!tr->parent || !tr_version_of_parent(tr, obat->ts)) && obat->ts >=
TRANSACTION_ID_BASE && !isTempTable(t))
/* abort */
return NULL;
- obat = timestamp_dbat(tr, t->data, isTempTable(t));
+ assert(!isTempTable(t));
+ obat = timestamp_dbat(tr, t->data);
sql_dbat *bat = ZNEW(sql_dbat);
if(!bat)
return NULL;
bat->refcnt = 1;
dup_dbat(tr, obat, bat, isNew(t), isTempTable(t));
bat->ts = tr->tid;
- bat->next = obat;
- t->data = bat;
+ do {
+ bat->next = obat;
+ } while(!ATOMIC_PTR_CAS(&t->data, &bat->next, bat));
return bat;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list