Changeset: 9cb438b13592 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9cb438b13592
Modified Files:
monetdb5/extras/crackers/crackers_holistic.c
monetdb5/extras/crackers/crackers_holistic.h
monetdb5/extras/crackers/crackers_selectholpl_ops.mx
Branch: holindex
Log Message:
Check if lowNode is Null before trying to get a write lock.
diffs (105 lines):
diff --git a/monetdb5/extras/crackers/crackers_holistic.c
b/monetdb5/extras/crackers/crackers_holistic.c
--- a/monetdb5/extras/crackers/crackers_holistic.c
+++ b/monetdb5/extras/crackers/crackers_holistic.c
@@ -29,6 +29,7 @@ static FrequencyNode *_InternalFrequency
static MT_Lock frequencylock;
static MT_Id idletime_thread;
MT_Lock CRKIndexLock;
+pthread_rwlock_t CRKFirstPieceRWLock;
int isIdleQuery = 0;
diff --git a/monetdb5/extras/crackers/crackers_holistic.h
b/monetdb5/extras/crackers/crackers_holistic.h
--- a/monetdb5/extras/crackers/crackers_holistic.h
+++ b/monetdb5/extras/crackers/crackers_holistic.h
@@ -38,6 +38,7 @@ typedef struct frequency{
typedef str (*IdleFuncPtr)(int *);
crackers_export int isIdleQuery;
crackers_export MT_Lock CRKIndexLock;
+crackers_export pthread_rwlock_t CRKFirstPieceRWLock;
crackers_export FrequencyNode *getFrequencyStruct(char which);
crackers_export void push(int bat_id,FrequencyNode* head);
diff --git a/monetdb5/extras/crackers/crackers_selectholpl_ops.mx
b/monetdb5/extras/crackers/crackers_selectholpl_ops.mx
--- a/monetdb5/extras/crackers/crackers_selectholpl_ops.mx
+++ b/monetdb5/extras/crackers/crackers_selectholpl_ops.mx
@@ -277,6 +277,7 @@ createView:
int m;
int *t;
int createIndex=0;
+ pthread_rwlock_t *plock=0;
oid vl=0, vh=0, posl, posh;
/* vl and vh are the low and high index values to create the view with
the result */
oid cl1=0, ch1=0, cl2=0, ch2=0;
@@ -419,7 +420,7 @@ createView:
BBPincref(b->batCacheid,TRUE);
BBPunfix(bo->batCacheid);
- goto createView;
+ goto tempcreateView;
}
}
@@ -457,7 +458,7 @@ createView:
posh = BUNlast(b)-1;
@:crkThreeTree@5(@1,posl,posh,@5)@
- goto createView;
+ goto tempcreateView;
}
/* Take the index of the bat */
@@ -581,10 +582,11 @@ createView:
if (foundLow == 0) {
pthread_rwlock_rdlock(&CrackerIndex[m].columnRWLock);
lowNode = findNodeL_@1(*low, TRUE,
CrackerIndex[m].Tree, c, idxFirst, NULL);
- if (pthread_rwlock_trywrlock(&lowNode->pieceLock)){
+ plock = (lowNode == NULL)? &CRKFirstPieceRWLock :
&lowNode->pieceLock;
+ if (pthread_rwlock_trywrlock(plock)){
pthread_rwlock_unlock(&CrackerIndex[m].columnRWLock);
- pthread_rwlock_wrlock(&lowNode->pieceLock);
- pthread_rwlock_unlock(&lowNode->pieceLock);
+ pthread_rwlock_wrlock(plock);
+ pthread_rwlock_unlock(plock);
goto retry; // some other thread might
already crack on low, try to find it again
}
pthread_rwlock_unlock(&CrackerIndex[m].columnRWLock);
@@ -606,15 +608,16 @@ createView:
}
vh = ch2;
pthread_rwlock_unlock(&CrackerIndex[m].columnRWLock);
- pthread_rwlock_unlock(&lowNode->pieceLock);
+ pthread_rwlock_unlock(plock);
}
if (foundHgh == 0) {
pthread_rwlock_rdlock(&CrackerIndex[m].columnRWLock);
lowNode = findNodeL_@1(*hgh, TRUE,
CrackerIndex[m].Tree, c, idxFirst, NULL);
- if (pthread_rwlock_trywrlock(&lowNode->pieceLock)){
+ plock = (lowNode == NULL)? &CRKFirstPieceRWLock :
&lowNode->pieceLock;
+ if (pthread_rwlock_trywrlock(plock)){
pthread_rwlock_unlock(&CrackerIndex[m].columnRWLock);
- pthread_rwlock_wrlock(&lowNode->pieceLock);
- pthread_rwlock_unlock(&lowNode->pieceLock);
+ pthread_rwlock_wrlock(plock);
+ pthread_rwlock_unlock(plock);
goto retry; // some other thread might
already crack on low, try to find it again
}
pthread_rwlock_unlock(&CrackerIndex[m].columnRWLock);
@@ -631,7 +634,7 @@ createView:
if ((vl == 0) && (*t < *low) && (*inclusiveLow == TRUE))
vl = vl + 1;
pthread_rwlock_unlock(&CrackerIndex[m].columnRWLock);
- pthread_rwlock_unlock(&lowNode->pieceLock);
+ pthread_rwlock_unlock(plock);
}
} else {
t = (int *) Tloc(b, BUNfirst(b));
@@ -659,7 +662,7 @@ createView:
/*fprintf(ofp,"%d\n",FN->c);
fclose(ofp);*/
-// @:CreateResult()@
+ /*@:CreateResult()@*/
tempcreateView:;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list