*/}}
소스 검색

New memleave

Yiming Wu 2 년 전
부모
커밋
13d2ce2145
5개의 변경된 파일23개의 추가작업 그리고 3개의 파일을 삭제
  1. 2 0
      source/lagui/la_data.c
  2. 1 0
      source/lagui/la_interface.h
  3. 2 0
      source/lagui/la_kernel.c
  4. 14 0
      source/lagui/la_util.c
  5. 4 3
      source/lagui/la_util.h

+ 2 - 0
source/lagui/la_data.c

@@ -3683,6 +3683,7 @@ void la_ClearUDFRegistryAndFolders(){
 //==========================================================================[undo]
 
 void laPushDifferences(char* Description, u64bit hint){
+    memFreeRemainingLeftNodes();
     laDiff* d=memAcquire(sizeof(laDiff));
     lstAppendItem(&MAIN.Differences, d);
     if(MAIN.HeadDifference && Description) strSafeSet(&MAIN.HeadDifference->Description,Description);
@@ -3954,6 +3955,7 @@ int la_GenerateListDifferences(laDBInst* dbi, laDBSubProp* dbp, laPropPack* pp,
     
     for(laDiffTemp* lip=NewDeleted.pFirst;lip;lip=lip->Item.pNext){
         laDBInst* dbi=lip->p; lstAppendItem(&dc->RemovedInst, la_NewDiffCommandInst(dbi, lip->tPrev, lip->tNext));printf("deleted %x %x\n", dbi, dbi->OriginalInstance);
+        memTake(dbi->OriginalInstance);
         //if(!dbi->Item.pPrev){dbp->Instances.pFirst=dbi->Item.pNext;}
         //if(!dbi->Item.pNext){dbp->Instances.pLast=dbi->Item.pPrev;}
         dbi->Item.pPrev=dbi->Item.pNext=0; //lstRemoveItem(&dbp->Instances, dbi);

+ 1 - 0
source/lagui/la_interface.h

@@ -293,6 +293,7 @@ STRUCTURE(LA){
     int ByteCount;
     int TotalByteCount;
 
+    laHash65536* DBInstMemLeft;// list item pointers
     laHash16M DBInst2;
     laHash16M DBInst1;
     laHash16M PtrSync;

+ 2 - 0
source/lagui/la_kernel.c

@@ -390,6 +390,7 @@ int laGetReady(){
 
     laSetRootInstance(&MAIN);
 
+    if(!MAIN.DBInstMemLeft){ hsh65536Init(&MAIN.DBInstMemLeft); }
     laPushDifferences(0, 0);
     la_MakeDummyManagedUDF();
 
@@ -431,6 +432,7 @@ void laShutoff(){
 
     strSafeDump();
 
+    hshFree(&MAIN.DBInstMemLeft);
     memNoLonger();
 
     glXDestroyContext(MAIN.dpy,MAIN.glc);

+ 14 - 0
source/lagui/la_util.c

@@ -1105,6 +1105,20 @@ void memDestroyPool(laMemoryPool *mph){
     FreeMem(mph);
 }
 
+// Leave memory in an temporary place and if when push difference these are still not acquired, free them.
+void memLeave(void *Data){
+    laListHandle* l=hsh65536DoHashLongPtr(MAIN.DBInstMemLeft,Data); lstAppendPointer(l,Data);
+}
+void memTake(void *Data){
+    laListHandle* l=hsh65536DoHashLongPtr(MAIN.DBInstMemLeft,Data); lstRemovePointer(l,Data);
+}
+void memFreeRemainingLeftNodes(){
+    laListHandle* l; void* m;
+    for(int i=0;i<65536;i++){
+        l=&MAIN.DBInstMemLeft->Entries[i]; while(m=lstPopPointer(l)){ memFree(m); /* printf("left freed %x\n",m); */ }
+    }
+}
+
 void memNoLonger(){
     for(int i=0;i<256;i++){
         laMemoryPool* mp; while(mp=lstPopItem(&MAIN.GlobalMemPool.Entries[i])){ memDestroyPool(mp); }

+ 4 - 3
source/lagui/la_util.h

@@ -507,9 +507,6 @@ laListHandle* hsh16MDoHashNUID(laHash16M* hash, char * NUID);
 laListItem* hsh256FindItemSTR(laHash256* hash, laCompareFunc func, char * buckle);
 unsigned char hsh256DoHashSTR(char * buckle);
 
-// Leave memory to undo system to free later.
-#define memLeave(data) (data)
-
 void memResetByteCount();
 int memGetByteCount();
 void* memGetHead(void* UserMem, int* HyperLevel);
@@ -528,6 +525,10 @@ void memDestroyPool(laMemoryPool* Handle);
 void memNoLonger();
 void memMarkClean(void* HyperUserMem);
 
+void memLeave(void *Data);
+void memTake(void* Data);
+void memFreeRemainingLeftNodes();
+
 laStaticMemoryPoolNode* memNewStaticPool(laStaticMemoryPool* smp);
 void* memStaticAcquire(laStaticMemoryPool*smp, int size);
 void* memStaticAcquireThread(laStaticMemoryPool*smp, int size);