static int commandimport(Pool *p, Handle **unused, Ref **unused_too ) { char *w, *raww; int c; int ok = 0; IOBFILE *inf; Lake *lake; if ((inf = PoolInputFile(p)) == NULL) goto done; if ((c = async_iobfnextc(inf,0)) == NODATA) return 1; /* pretend we got something. */ if ((lake=(Lake*)PoolClientData(p)) == NULL) { lake = LakeDefine(p->inf, p->outf, p); PoolSetClientData(p, (void*)lake); } else if (lake->streamin != inf) { lake->streamin = inf; lake->streamout = PoolOutputFile(p); } switch(c) { case '<': iobfgetc(inf); w = iobfdelimtok("()", inf, 0); if (w == NULL) goto done; if (strcmp(w, "-") && (w = findfile(PoolName(p), raww = w)) == NULL) { OOGLSyntax(inf, "Reading commands from \"%s\": can't find command file %s", PoolName(p), raww); goto done; } p = PoolStreamOpen(w, NULL, 0, &CommandOps); if (iobfile(PoolInputFile(p)) == stdin && !PoolOutputFile(p)) p = PoolStreamOpen(PoolName(p), stdout, 1, &CommandOps); if (p != NULL && inf != NULL) ok = comm_object(w, &CommandOps, NULL, NULL, COMM_LATER); break; case '(': { LObject *val; val = LEvalSexpr(lake); ok = (val != Lnil) ? 1 : -1; LFree(val); } break; default: { LFree( LEvalSexpr(lake) ); } } done: return ok; }
void Heap::Free(void *ptr) { if(!ptr) return; LLOG("Free " << ptr); if((((dword)(uintptr_t)ptr) & 8) == 0) { Page *page = (Page *)((uintptr_t)ptr & ~(uintptr_t)4095); int k = page->klass; LLOG("Small free page: " << (void *)page << ", k: " << k << ", ksz: " << Ksz(k)); ASSERT((4096 - ((uintptr_t)ptr & (uintptr_t)4095)) % Ksz(k) == 0); #ifdef _MULTITHREADED if(page->heap != this) { // freeing page allocated in different thread page->heap->RemoteFree(ptr); // add to original heap's list of free pages to be properly freed later return; } #endif DbgFreeFillK(ptr, k); if(cachen[k]) { cachen[k]--; FreeLink *l = (FreeLink *)ptr; l->next = cache[k]; cache[k] = l; return; } FreeK(ptr, page, k); } else LFree(ptr); }
force_inline void Heap::Free(void *ptr) { if(!ptr) return; LLOG("Free " << ptr); if(IsSmall(ptr)) { Page *page = GetPage(ptr); Free(ptr, page, page->klass); } else LFree(ptr); }
void Heap::FreeDirect(void *ptr) { LLOG("Free Direct " << ptr); if((((dword)(uintptr_t)ptr) & 8) == 0) { Page *page = (Page *)((uintptr_t)ptr & ~(uintptr_t)4095); int k = page->klass; LLOG("Small free page: " << (void *)page << ", k: " << k << ", ksz: " << Ksz(k)); ASSERT((4096 - ((uintptr_t)ptr & (uintptr_t)4095)) % Ksz(k) == 0); DbgFreeFillK(ptr, k); FreeK(ptr, page, k); } else LFree(ptr); }