⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utdatabaseu.c

📁 DataDraw is an ultra-fast persistent database for high performance programs written in C. It s so fa
💻 C
📖 第 1 页 / 共 4 页
字号:
----------------------------------------------------------------------------------------*/void utCompactDynarrayValues(void){    uint32 elementSize = sizeof(uint8);    uint32 usedHeaderSize = (sizeof(utDynarray) + elementSize - 1)/elementSize;    uint32 freeHeaderSize = (sizeof(utDynarray) + sizeof(uint32) + elementSize - 1)/elementSize;    uint8 *toPtr = utDynarrays.Value;    uint8 *fromPtr = toPtr;    utDynarray Dynarray;    uint32 size;    while(fromPtr < utDynarrays.Value + utUsedDynarrayValue()) {        Dynarray = *(utDynarray *)(void *)fromPtr;        if(Dynarray != utDynarrayNull) {            /* Need to move it to toPtr */            size = utMax(utDynarrayGetNumValue(Dynarray) + usedHeaderSize, freeHeaderSize);            memmove((void *)toPtr, (void *)fromPtr, size*elementSize);            utDynarraySetValueIndex(Dynarray, toPtr - utDynarrays.Value + usedHeaderSize);            toPtr += size;        } else {            /* Just skip it */            size = *(uint32 *)(void *)(((utDynarray *)(void *)fromPtr) + 1);        }        fromPtr += size;    }    utSetUsedDynarrayValue(toPtr - utDynarrays.Value);    utSetFreeDynarrayValue(0);}/*----------------------------------------------------------------------------------------  Allocate more memory for the Dynarray.Value heap.----------------------------------------------------------------------------------------*/static void allocMoreDynarrayValues(    uint32 spaceNeeded){    uint32 freeSpace = utAllocatedDynarrayValue() - utUsedDynarrayValue();    if((utFreeDynarrayValue() << 2) > utUsedDynarrayValue()) {        utCompactDynarrayValues();        freeSpace = utAllocatedDynarrayValue() - utUsedDynarrayValue();    }    if(freeSpace < spaceNeeded) {        utRecordResize(utModuleID, 12, utAllocatedDynarrayValue(), true);        utSetAllocatedDynarrayValue(utAllocatedDynarrayValue() + spaceNeeded - freeSpace +            (utAllocatedDynarrayValue() >> 2));        utResizeArray(utDynarrays.Value, utAllocatedDynarrayValue());        utRecordResize(utModuleID, 12, utAllocatedDynarrayValue(), false);    }}/*----------------------------------------------------------------------------------------  Allocate memory for a new Dynarray.Value array.----------------------------------------------------------------------------------------*/void utDynarrayAllocValues(    utDynarray Dynarray,    uint32 numValues){    uint32 freeSpace = utAllocatedDynarrayValue() - utUsedDynarrayValue();    uint32 elementSize = sizeof(uint8);    uint32 usedHeaderSize = (sizeof(utDynarray) + elementSize - 1)/elementSize;    uint32 freeHeaderSize = (sizeof(utDynarray) + sizeof(uint32) + elementSize - 1)/elementSize;    uint32 spaceNeeded = utMax(numValues + usedHeaderSize, freeHeaderSize);#if defined(DD_DEBUG)    utAssert(utDynarrayGetNumValue(Dynarray) == 0);#endif    if(numValues == 0) {        return;    }    if(freeSpace < spaceNeeded) {        allocMoreDynarrayValues(spaceNeeded);    }    utDynarraySetValueIndex(Dynarray, utUsedDynarrayValue() + usedHeaderSize);    utDynarraySetNumValue(Dynarray, numValues);    utRecordField(utModuleID, 12, utUsedDynarrayValue(), true);    utRecordArray(utModuleID, 12, utDynarrayGetValueIndex(Dynarray), numValues, true);    *(utDynarray *)(void *)(utDynarrays.Value + utUsedDynarrayValue()) = Dynarray;    memset(utDynarrayGetValues(Dynarray), 0, numValues*elementSize);    utRecordField(utModuleID, 12, utUsedDynarrayValue(), false);    utRecordArray(utModuleID, 12, utDynarrayGetValueIndex(Dynarray), numValues, false);    utSetUsedDynarrayValue(utUsedDynarrayValue() + spaceNeeded);}/*----------------------------------------------------------------------------------------  Wrapper around utDynarrayGetValues for the database manager.----------------------------------------------------------------------------------------*/static void *getDynarrayValues(    uint64 objectNumber,    uint32 *numValues){    utDynarray Dynarray = utIndex2Dynarray(objectNumber);    *numValues = utDynarrayGetNumValue(Dynarray);    return utDynarrayGetValues(Dynarray);}/*----------------------------------------------------------------------------------------  Wrapper around utDynarrayAllocValues for the database manager.----------------------------------------------------------------------------------------*/static void *allocDynarrayValues(    uint64 objectNumber,    uint32 numValues){    utDynarray Dynarray = utIndex2Dynarray(objectNumber);    utDynarraySetValueIndex(Dynarray, 0);    utDynarraySetNumValue(Dynarray, 0);    if(numValues == 0) {        return NULL;    }    utDynarrayAllocValues(Dynarray, numValues);    return utDynarrayGetValues(Dynarray);}/*----------------------------------------------------------------------------------------  Free memory used by the Dynarray.Value array.----------------------------------------------------------------------------------------*/void utDynarrayFreeValues(    utDynarray Dynarray){    uint32 elementSize = sizeof(uint8);    uint32 usedHeaderSize = (sizeof(utDynarray) + elementSize - 1)/elementSize;    uint32 freeHeaderSize = (sizeof(utDynarray) + sizeof(uint32) + elementSize - 1)/elementSize;    uint32 size = utMax(utDynarrayGetNumValue(Dynarray) + usedHeaderSize, freeHeaderSize);    uint8 *dataPtr = utDynarrayGetValues(Dynarray) - usedHeaderSize;    if(utDynarrayGetNumValue(Dynarray) == 0) {        return;    }    *(utDynarray *)(void *)(dataPtr) = utDynarrayNull;    *(uint32 *)(void *)(((utDynarray *)(void *)dataPtr) + 1) = size;    utDynarraySetNumValue(Dynarray, 0);    utSetFreeDynarrayValue(utFreeDynarrayValue() + size);}/*----------------------------------------------------------------------------------------  Resize the Dynarray.Value array.----------------------------------------------------------------------------------------*/void utDynarrayResizeValues(    utDynarray Dynarray,    uint32 numValues){    uint32 freeSpace = utAllocatedDynarrayValue() - utUsedDynarrayValue();    uint32 elementSize = sizeof(uint8);    uint32 usedHeaderSize = (sizeof(utDynarray) + elementSize - 1)/elementSize;    uint32 freeHeaderSize = (sizeof(utDynarray) + sizeof(uint32) + elementSize - 1)/elementSize;    uint32 newSize = utMax(numValues + usedHeaderSize, freeHeaderSize);    uint32 oldSize = utMax(utDynarrayGetNumValue(Dynarray) + usedHeaderSize, freeHeaderSize);    uint8 *dataPtr;    if(numValues == 0) {        if(utDynarrayGetNumValue(Dynarray) != 0) {            utDynarrayFreeValues(Dynarray);        };        return;    }    if(utDynarrayGetNumValue(Dynarray) == 0) {        utDynarrayAllocValues(Dynarray, newSize);        return;    };    if(freeSpace < newSize) {        allocMoreDynarrayValues(newSize);    }    dataPtr = utDynarrayGetValues(Dynarray) - usedHeaderSize;    utRecordArray(utModuleID, 12, utUsedDynarrayValue(), newSize, true);    utRecordArray(utModuleID, 12, dataPtr - utDynarrays.Value, freeHeaderSize, true);    memcpy((void *)(utDynarrays.Value + utUsedDynarrayValue()), dataPtr,        elementSize*utMin(oldSize, newSize));    if(newSize > oldSize) {        memset(utDynarrays.Value + utUsedDynarrayValue() + oldSize, 0,            elementSize*(newSize - oldSize));    }    *(utDynarray *)(void *)dataPtr = utDynarrayNull;    *(uint32 *)(void *)(((utDynarray *)(void *)dataPtr) + 1) = oldSize;    utRecordArray(utModuleID, 12, utUsedDynarrayValue(), newSize, false);    utRecordArray(utModuleID, 12, dataPtr - utDynarrays.Value, freeHeaderSize, false);    utSetFreeDynarrayValue(utFreeDynarrayValue() + oldSize);    utDynarraySetValueIndex(Dynarray, utUsedDynarrayValue() + usedHeaderSize);    utDynarraySetNumValue(Dynarray, numValues);    utSetUsedDynarrayValue(utUsedDynarrayValue() + newSize);}#if defined(DD_DEBUG)/*----------------------------------------------------------------------------------------  Write out all the fields of an object.----------------------------------------------------------------------------------------*/void utShowDynarray(    utDynarray Dynarray){    utDatabaseShowObject("ut", "Dynarray", utDynarray2Index(Dynarray));}#endif/*----------------------------------------------------------------------------------------  Destroy SymArray including everything in it. Remove from parents.----------------------------------------------------------------------------------------*/void utSymArrayDestroy(    utSymArray SymArray){    if(utSymArrayDestructorCallback != NULL) {        utSymArrayDestructorCallback(SymArray);    }    utSymArrayFree(SymArray);}/*----------------------------------------------------------------------------------------  Default constructor wrapper for the database manager.----------------------------------------------------------------------------------------*/static uint64 allocSymArray(void){    utSymArray SymArray = utSymArrayAlloc();    return utSymArray2Index(SymArray);}/*----------------------------------------------------------------------------------------  Destructor wrapper for the database manager.----------------------------------------------------------------------------------------*/static void destroySymArray(    uint64 objectIndex){    utSymArrayDestroy(utIndex2SymArray(objectIndex));}/*----------------------------------------------------------------------------------------  Allocate the field arrays of SymArray.----------------------------------------------------------------------------------------*/static void allocSymArrays(void){    utSetAllocatedSymArray(2);    utSetUsedSymArray(0);    utSetFirstFreeSymArray(utSymArrayNull);    utSymArrays.SymIndex = utNewA(uint32, (utAllocatedSymArray()));    utSymArrays.NumSym = utNewA(uint32, (utAllocatedSymArray()));    utSetUsedSymArraySym(0);    utSetAllocatedSymArraySym(2);    utSetFreeSymArraySym(0);    utSymArrays.Sym = utNewA(utSym, utAllocatedSymArraySym());    utSymArrays.UsedSym = utNewA(uint32, (utAllocatedSymArray()));}/*----------------------------------------------------------------------------------------  Realloc the arrays of properties for class SymArray.----------------------------------------------------------------------------------------*/static void reallocSymArrays(    uint32 newSize){    utRecordResize(utModuleID, 16, (utAllocatedSymArray()), true);    utResizeArray(utSymArrays.SymIndex, (newSize));    utRecordResize(utModuleID, 16, (newSize), false);    utRecordResize(utModuleID, 17, (utAllocatedSymArray()), true);    utResizeArray(utSymArrays.NumSym, (newSize));    utRecordResize(utModuleID, 17, (newSize), false);    utRecordResize(utModuleID, 19, (utAllocatedSymArray()), true);    utResizeArray(utSymArrays.UsedSym, (newSize));    utRecordResize(utModuleID, 19, (newSize), false);    utSetAllocatedSymArray(newSize);}/*----------------------------------------------------------------------------------------  Allocate more SymArrays.----------------------------------------------------------------------------------------*/void utSymArrayAllocMore(void){    reallocSymArrays(utAllocatedSymArray() + (utAllocatedSymArray() >> 1));}/*----------------------------------------------------------------------------------------  Compact the SymArray.Sym heap to free memory.----------------------------------------------------------------------------------------*/void utCompactSymArraySyms(void){    uint32 elementSize = sizeof(utSym);    uint32 usedHeaderSize = (sizeof(utSymArray) + elementSize - 1)/elementSize;    uint32 freeHeaderSize = (sizeof(utSymArray) + sizeof(uint32) + elementSize - 1)/elementSize;    utSym *toPtr = utSymArrays.Sym;    utSym *fromPtr = toPtr;    utSymArray SymArray;    uint32 size;    while(fromPtr < utSymArrays.Sym + utUsedSymArraySym()) {        SymArray = *(utSymArray *)(void *)fromPtr;        if(SymArray != utSymArrayNull) {            /* Need to move it to toPtr */            size = utMax(utSymArrayGetNumSym(SymArray) + usedHeaderSize, freeHeaderSize);            memmove((void *)toPtr, (void *)fromPtr, size*elementSize);            utSymArraySetSymIndex(SymArray, toPtr - utSymArrays.Sym + usedHeaderSize);            toPtr += size;        } else {            /* Just skip it */            size = *(uint32 *)(void *)(((utSymArray *)(void *)fromPtr) + 1);        }        fromPtr += size;    }    utSetUsedSymArraySym(toPtr - utSymArrays.Sym);    utSetFreeSymArraySym(0);}/*----------------------------------------------------------------------------------------  Allocate more memory for the SymArray.Sym heap.----------------------------------------------------------------------------------------*/static void allocMoreSymArraySyms(    uint32 spaceNeeded){    uint32 freeSpace = utAllocatedSymArraySym() - utUsedSymArraySym();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -