Beispiel #1
0
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;
}
Beispiel #2
0
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);
}
Beispiel #3
0
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);
}
Beispiel #4
0
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);
}