示例#1
0
文件: vport.c 项目: syunta/Gauche
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;
}
示例#2
0
文件: prof.c 项目: qykth-git/Gauche
/*=============================================================
 * 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();
}
示例#3
0
文件: write.c 项目: Hamayama/Gauche
                                             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;