| 1 | #include <stdio.h>
|
|---|
| 2 | #include <stdlib.h>
|
|---|
| 3 | #include <string.h>
|
|---|
| 4 | #include "adc.h"
|
|---|
| 5 | #include "macrodef.h"
|
|---|
| 6 |
|
|---|
| 7 | int32 KeyComp( const uint32 *a, const uint32 *b, uint32 n ) {
|
|---|
| 8 | uint32 i;
|
|---|
| 9 | for ( i = 0; i < n; i++ ) {
|
|---|
| 10 | if (a[i] < b[i]) return(-1);
|
|---|
| 11 | else if (a[i] > b[i]) return(1);
|
|---|
| 12 | }
|
|---|
| 13 | return(0);
|
|---|
| 14 | }
|
|---|
| 15 | int32 TreeInsert(RBTree *tree, uint32 *attrs){
|
|---|
| 16 | uint32 sl = 1;
|
|---|
| 17 | uint32 *attrsP;
|
|---|
| 18 | int32 cmpres;
|
|---|
| 19 | treeNode *xNd, *yNd, *tmp;
|
|---|
| 20 |
|
|---|
| 21 | tmp = &tree->root;
|
|---|
| 22 | xNd = tmp->left;
|
|---|
| 23 |
|
|---|
| 24 | if (xNd == NULL){
|
|---|
| 25 | tree->count++;
|
|---|
| 26 | NEW_TREE_NODE(tree->mp,tree->memPool,
|
|---|
| 27 | tree->memaddr,tree->treeNodeSize,
|
|---|
| 28 | tree->freeNodeCounter,tree->memoryIsFull)
|
|---|
| 29 | xNd = tmp->left = tree->mp;
|
|---|
| 30 | memcpy(&(xNd->nodeMemPool[0]), &attrs[0], tree->nodeDataSize);
|
|---|
| 31 | xNd->left = xNd->right = NULL;
|
|---|
| 32 | xNd->clr = BLACK;
|
|---|
| 33 | return 0;
|
|---|
| 34 | }
|
|---|
| 35 |
|
|---|
| 36 | tree->drcts[0] = 0;
|
|---|
| 37 | tree->nodes[0] = &tree->root;
|
|---|
| 38 |
|
|---|
| 39 | while(1){
|
|---|
| 40 | attrsP = (uint32*) &(xNd->nodeMemPool[tree->nm]);
|
|---|
| 41 | cmpres = KeyComp( &attrs[tree->nm<<1], attrsP, tree->nd );
|
|---|
| 42 |
|
|---|
| 43 | if (cmpres < 0){
|
|---|
| 44 | tree->nodes[sl] = xNd;
|
|---|
| 45 | tree->drcts[sl++] = 0;
|
|---|
| 46 | yNd = xNd->left;
|
|---|
| 47 |
|
|---|
| 48 | if(yNd == NULL){
|
|---|
| 49 | NEW_TREE_NODE(tree->mp,tree->memPool,
|
|---|
| 50 | tree->memaddr,tree->treeNodeSize,
|
|---|
| 51 | tree->freeNodeCounter,tree->memoryIsFull)
|
|---|
| 52 | xNd = xNd->left = tree->mp;
|
|---|
| 53 | break;
|
|---|
| 54 | }
|
|---|
| 55 | }else if (cmpres > 0){
|
|---|
| 56 | tree->nodes[sl] = xNd;
|
|---|
| 57 | tree->drcts[sl++] = 1;
|
|---|
| 58 | yNd = xNd->right;
|
|---|
| 59 | if(yNd == NULL){
|
|---|
| 60 | NEW_TREE_NODE(tree->mp,tree->memPool,
|
|---|
| 61 | tree->memaddr,tree->treeNodeSize,
|
|---|
| 62 | tree->freeNodeCounter,tree->memoryIsFull)
|
|---|
| 63 | xNd = xNd->right = tree->mp;
|
|---|
| 64 | break;
|
|---|
| 65 | }
|
|---|
| 66 | }else{
|
|---|
| 67 | uint64 ii;
|
|---|
| 68 | int64 *mx;
|
|---|
| 69 | mx = (int64*) &attrs[0];
|
|---|
| 70 | for ( ii = 0; ii < tree->nm; ii++ ) xNd->nodeMemPool[ii] += mx[ii];
|
|---|
| 71 | return 0;
|
|---|
| 72 | }
|
|---|
| 73 | xNd = yNd;
|
|---|
| 74 | }
|
|---|
| 75 | tree->count++;
|
|---|
| 76 | memcpy(&(xNd->nodeMemPool[0]), &attrs[0], tree->nodeDataSize);
|
|---|
| 77 | xNd->left = xNd->right = NULL;
|
|---|
| 78 | xNd->clr = RED;
|
|---|
| 79 |
|
|---|
| 80 | while(1){
|
|---|
| 81 | if ( tree->nodes[sl-1]->clr != RED || sl<3 ) break;
|
|---|
| 82 |
|
|---|
| 83 | if (tree->drcts[sl-2] == 0){
|
|---|
| 84 | yNd = tree->nodes[sl-2]->right;
|
|---|
| 85 | if (yNd != NULL && yNd->clr == RED){
|
|---|
| 86 | tree->nodes[sl-1]->clr = BLACK;
|
|---|
| 87 | yNd->clr = BLACK;
|
|---|
| 88 | tree->nodes[sl-2]->clr = RED;
|
|---|
| 89 | sl -= 2;
|
|---|
| 90 | }else{
|
|---|
| 91 | if (tree->drcts[sl-1] == 1){
|
|---|
| 92 | xNd = tree->nodes[sl-1];
|
|---|
| 93 | yNd = xNd->right;
|
|---|
| 94 | xNd->right = yNd->left;
|
|---|
| 95 | yNd->left = xNd;
|
|---|
| 96 | tree->nodes[sl-2]->left = yNd;
|
|---|
| 97 | }else
|
|---|
| 98 | yNd = tree->nodes[sl-1];
|
|---|
| 99 |
|
|---|
| 100 | xNd = tree->nodes[sl-2];
|
|---|
| 101 | xNd->clr = RED;
|
|---|
| 102 | yNd->clr = BLACK;
|
|---|
| 103 |
|
|---|
| 104 | xNd->left = yNd->right;
|
|---|
| 105 | yNd->right = xNd;
|
|---|
| 106 |
|
|---|
| 107 | if(tree->drcts[sl-3])
|
|---|
| 108 | tree->nodes[sl-3]->right = yNd;
|
|---|
| 109 | else
|
|---|
| 110 | tree->nodes[sl-3]->left = yNd;
|
|---|
| 111 | break;
|
|---|
| 112 | }
|
|---|
| 113 | }else{
|
|---|
| 114 | yNd = tree->nodes[sl-2]->left;
|
|---|
| 115 | if (yNd != NULL && yNd->clr == RED){
|
|---|
| 116 | tree->nodes[sl-1]->clr = BLACK;
|
|---|
| 117 | yNd->clr = BLACK;
|
|---|
| 118 | tree->nodes[sl-2]->clr = RED;
|
|---|
| 119 | sl -= 2;
|
|---|
| 120 | }else{
|
|---|
| 121 | if(tree->drcts[sl-1] == 0){
|
|---|
| 122 | xNd = tree->nodes[sl-1];
|
|---|
| 123 | yNd = xNd->left;
|
|---|
| 124 | xNd->left = yNd->right;
|
|---|
| 125 | yNd->right = xNd;
|
|---|
| 126 | tree->nodes[sl-2]->right = yNd;
|
|---|
| 127 | }else
|
|---|
| 128 | yNd = tree->nodes[sl-1];
|
|---|
| 129 |
|
|---|
| 130 | xNd = tree->nodes[sl-2];
|
|---|
| 131 | xNd->clr = RED;
|
|---|
| 132 | yNd->clr = BLACK;
|
|---|
| 133 |
|
|---|
| 134 | xNd->right = yNd->left;
|
|---|
| 135 | yNd->left = xNd;
|
|---|
| 136 |
|
|---|
| 137 | if (tree->drcts[sl-3])
|
|---|
| 138 | tree->nodes[sl-3]->right = yNd;
|
|---|
| 139 | else
|
|---|
| 140 | tree->nodes[sl-3]->left = yNd;
|
|---|
| 141 | break;
|
|---|
| 142 | }
|
|---|
| 143 | }
|
|---|
| 144 | }
|
|---|
| 145 | tree->root.left->clr = BLACK;
|
|---|
| 146 | return 0;
|
|---|
| 147 | }
|
|---|
| 148 | int32 WriteViewToDisk(ADC_VIEW_CNTL *avp, treeNode *t){
|
|---|
| 149 | uint32 i;
|
|---|
| 150 | if(!t) return ADC_OK;
|
|---|
| 151 | if(WriteViewToDisk( avp, t->left)) return ADC_WRITE_FAILED;
|
|---|
| 152 | for(i=0;i<avp->nm;i++){
|
|---|
| 153 | avp->mSums[i] += t->nodeMemPool[i];
|
|---|
| 154 | }
|
|---|
| 155 | WriteToFile(t->nodeMemPool,avp->outRecSize,1,avp->viewFile,avp->logf);
|
|---|
| 156 | if(WriteViewToDisk( avp, t->right)) return ADC_WRITE_FAILED;
|
|---|
| 157 | return ADC_OK;
|
|---|
| 158 | }
|
|---|
| 159 | int32 WriteViewToDiskCS(ADC_VIEW_CNTL *avp, treeNode *t,uint64 *ordern){
|
|---|
| 160 | uint32 i;
|
|---|
| 161 | if(!t) return ADC_OK;
|
|---|
| 162 | if(WriteViewToDiskCS( avp, t->left,ordern)) return ADC_WRITE_FAILED;
|
|---|
| 163 | for(i=0;i<avp->nm;i++){
|
|---|
| 164 | avp->mSums[i] += t->nodeMemPool[i];
|
|---|
| 165 | avp->checksums[i] += (++(*ordern))*t->nodeMemPool[i]%measbound;
|
|---|
| 166 | }
|
|---|
| 167 | WriteToFile(t->nodeMemPool,avp->outRecSize,1,avp->viewFile,avp->logf);
|
|---|
| 168 | if(WriteViewToDiskCS( avp, t->right,ordern)) return ADC_WRITE_FAILED;
|
|---|
| 169 | return ADC_OK;
|
|---|
| 170 | }
|
|---|
| 171 | int32 computeChecksum(ADC_VIEW_CNTL *avp, treeNode *t,uint64 *ordern){
|
|---|
| 172 | uint32 i;
|
|---|
| 173 | if(!t) return ADC_OK;
|
|---|
| 174 | if(computeChecksum(avp,t->left,ordern)) return ADC_WRITE_FAILED;
|
|---|
| 175 | for(i=0;i<avp->nm;i++){
|
|---|
| 176 | avp->checksums[i] += (++(*ordern))*t->nodeMemPool[i]%measbound;
|
|---|
| 177 | }
|
|---|
| 178 | if(computeChecksum(avp,t->right,ordern)) return ADC_WRITE_FAILED;
|
|---|
| 179 | return ADC_OK;
|
|---|
| 180 | }
|
|---|
| 181 | int32 WriteChunkToDisk(uint32 recordSize,FILE *fileOfChunks,
|
|---|
| 182 | treeNode *t, FILE *logFile){
|
|---|
| 183 | if(!t) return ADC_OK;
|
|---|
| 184 | if(WriteChunkToDisk( recordSize, fileOfChunks, t->left, logFile))
|
|---|
| 185 | return ADC_WRITE_FAILED;
|
|---|
| 186 | WriteToFile( t->nodeMemPool, recordSize, 1, fileOfChunks, logFile);
|
|---|
| 187 | if(WriteChunkToDisk( recordSize, fileOfChunks, t->right, logFile))
|
|---|
| 188 | return ADC_WRITE_FAILED;
|
|---|
| 189 | return ADC_OK;
|
|---|
| 190 | }
|
|---|
| 191 | RBTree * CreateEmptyTree(uint32 nd, uint32 nm,
|
|---|
| 192 | uint32 memoryLimit, unsigned char * memPool){
|
|---|
| 193 | RBTree *tree = (RBTree*) malloc(sizeof(RBTree));
|
|---|
| 194 | if (!tree) return NULL;
|
|---|
| 195 |
|
|---|
| 196 | tree->root.left = NULL;
|
|---|
| 197 | tree->root.right = NULL;
|
|---|
| 198 | tree->count = 0;
|
|---|
| 199 | tree->memaddr = 0;
|
|---|
| 200 | tree->treeNodeSize = sizeof(struct treeNode) + DIM_FSZ*(nd-1)+MSR_FSZ*nm;
|
|---|
| 201 | if (tree->treeNodeSize%8 != 0) tree->treeNodeSize += 4;
|
|---|
| 202 | tree->memoryLimit = memoryLimit;
|
|---|
| 203 | tree->memoryIsFull = 0;
|
|---|
| 204 | tree->nodeDataSize = DIM_FSZ*nd + MSR_FSZ*nm;
|
|---|
| 205 | tree->mp = NULL;
|
|---|
| 206 | tree->nNodesLimit = tree->memoryLimit/tree->treeNodeSize;
|
|---|
| 207 | tree->freeNodeCounter = tree->nNodesLimit;
|
|---|
| 208 | tree->nd = nd;
|
|---|
| 209 | tree->nm = nm;
|
|---|
| 210 | tree->memPool = memPool;
|
|---|
| 211 | tree->nodes = (treeNode**) malloc(sizeof(treeNode*)*MAX_TREE_HEIGHT);
|
|---|
| 212 | if (!(tree->nodes)) return NULL;
|
|---|
| 213 | tree->drcts = (uint32*) malloc( sizeof(uint32)*MAX_TREE_HEIGHT);
|
|---|
| 214 | if (!(tree->drcts)) return NULL;
|
|---|
| 215 | return tree;
|
|---|
| 216 | }
|
|---|
| 217 | void InitializeTree(RBTree *tree, uint32 nd, uint32 nm){
|
|---|
| 218 | tree->root.left = NULL;
|
|---|
| 219 | tree->root.right = NULL;
|
|---|
| 220 | tree->count = 0;
|
|---|
| 221 | tree->memaddr = 0;
|
|---|
| 222 | tree->treeNodeSize = sizeof(struct treeNode) + DIM_FSZ*(nd-1)+MSR_FSZ*nm;
|
|---|
| 223 | if (tree->treeNodeSize%8 != 0) tree->treeNodeSize += 4;
|
|---|
| 224 | tree->memoryIsFull = 0;
|
|---|
| 225 | tree->nodeDataSize = DIM_FSZ*nd + MSR_FSZ*nm;
|
|---|
| 226 | tree->mp = NULL;
|
|---|
| 227 | tree->nNodesLimit = tree->memoryLimit/tree->treeNodeSize;
|
|---|
| 228 | tree->freeNodeCounter = tree->nNodesLimit;
|
|---|
| 229 | tree->nd = nd;
|
|---|
| 230 | tree->nm = nm;
|
|---|
| 231 | }
|
|---|
| 232 | int32 DestroyTree(RBTree *tree) {
|
|---|
| 233 | if (tree==NULL) return ADC_TREE_DESTROY_FAILURE;
|
|---|
| 234 | if (tree->memPool!=NULL) free(tree->memPool);
|
|---|
| 235 | if (tree->nodes) free(tree->nodes);
|
|---|
| 236 | if (tree->drcts) free(tree->drcts);
|
|---|
| 237 | free(tree);
|
|---|
| 238 | return ADC_OK;
|
|---|
| 239 | }
|
|---|
| 240 |
|
|---|