static ScmObj vport_allocate(ScmClass *klass, ScmObj initargs) { vport *data = SCM_NEW(vport); data->getb_proc = SCM_FALSE; data->getc_proc = SCM_FALSE; data->gets_proc = SCM_FALSE; data->ready_proc = SCM_FALSE; data->putb_proc = SCM_FALSE; data->putc_proc = SCM_FALSE; data->puts_proc = SCM_FALSE; data->flush_proc = SCM_FALSE; data->close_proc = SCM_FALSE; data->seek_proc = SCM_FALSE; ScmPortVTable vtab; vtab.Getb = vport_getb; vtab.Getc = vport_getc; vtab.Getz = vport_getz; vtab.Ready = vport_ready; vtab.Putb = vport_putb; vtab.Putc = vport_putc; vtab.Putz = vport_putz; vtab.Puts = vport_puts; vtab.Flush = vport_flush; vtab.Close = vport_close; vtab.Seek = vport_seek; int dir = 0; if (Scm_SubtypeP(klass, SCM_CLASS_VIRTUAL_INPUT_PORT)) { dir = SCM_PORT_INPUT; } else if (Scm_SubtypeP(klass, SCM_CLASS_VIRTUAL_OUTPUT_PORT)) { dir = SCM_PORT_OUTPUT; } else { Scm_Panic("vport_allocate: implementaion error (class wiring screwed?)"); } ScmObj port = Scm_MakeVirtualPort(klass, dir, &vtab); SCM_PORT(port)->src.vt.data = data; return port; }
/*============================================================= * External API */ void Scm_ProfilerStart(void) { ScmVM *vm = Scm_VM(); ScmObj templat = Scm_StringAppendC(SCM_STRING(Scm_TmpDir()), "/gauche-profXXXXXX", -1, -1); char *templat_buf = Scm_GetString(SCM_STRING(templat)); /*mutable copy*/ if (!vm->prof) { vm->prof = SCM_NEW(ScmVMProfiler); vm->prof->state = SCM_PROFILER_INACTIVE; vm->prof->samplerFd = Scm_Mkstemp(templat_buf); vm->prof->currentSample = 0; vm->prof->totalSamples = 0; vm->prof->errorOccurred = 0; vm->prof->currentCount = 0; vm->prof->statHash = SCM_HASH_TABLE(Scm_MakeHashTableSimple(SCM_HASH_EQ, 0)); unlink(templat_buf); /* keep anonymous tmpfile */ } else if (vm->prof->samplerFd < 0) { vm->prof->samplerFd = Scm_Mkstemp(templat_buf); unlink(templat_buf); } if (vm->prof->state == SCM_PROFILER_RUNNING) return; vm->prof->state = SCM_PROFILER_RUNNING; vm->profilerRunning = TRUE; /* NB: this should be done globally!!! */ struct sigaction act; act.sa_handler = sampler_sample; sigfillset(&act.sa_mask); act.sa_flags = SA_RESTART; if (sigaction(SIGPROF, &act, NULL) < 0) { Scm_SysError("sigaction failed"); } ITIMER_START(); }
ScmWriteState *st) { if (ctx && ctx->controls) return ctx->controls; if (st && st->controls) return st->controls; return defaultWriteControls; } /* * WriteState */ /* The class definition is in libio.scm */ /* NB: For the time being, proto argument is ignored. */ ScmWriteState *Scm_MakeWriteState(ScmWriteState *proto SCM_UNUSED) { ScmWriteState *z = SCM_NEW(ScmWriteState); SCM_SET_CLASS(z, SCM_CLASS_WRITE_STATE); z->sharedTable = NULL; z->sharedCounter = 0; z->currentLevel = 0; z->controls = NULL; return z; } /* Cleanup transient data attached to the port. */ static void cleanup_port_write_state(ScmPort *port) { port->flags &= ~(SCM_PORT_WALKING|SCM_PORT_WRITESS); if (port->writeState != NULL) { ScmWriteState *s = port->writeState; port->writeState = NULL;