PersistentPerl

 view release on metacpan or  search on metacpan

src/perperl_perl.c  view on Meta::CPAN

	temp_script_name = "-e&{$" PERPERL_PKG("_sub") "}(@ARGV);";
    }

    /* Parse perl file. */
    perl_argv = perperl_opt_perl_argv(temp_script_name);
    if (perl_parse(my_perl, xs_init,
	perperl_util_argc((const char * const *)perl_argv), perl_argv, NULL))
    {
	DIE_QUIET("perl_parse error");
    }
    cleanup_after_perl();

    /* If we had to use /dev/fd/N, perl will close the file for us, so
     * make sure our code knows it's closed.  If we need it from here on out
     * it'll have to be re-opened.
     */
    if (use_devfd)
	perperl_script_close();

    /* Create a PersistentScript entry for the standard script */
    scr = find_scr(perperl_util_stat_devino(perperl_script_getstat()), &is_new);

    /* If using groups, try pre-loading the script to save time later */
    if (!single_script && !perperl_script_open_failure()) {
	load_script(
	    perperl_util_stat_devino(perperl_script_getstat()),
	    scr, perperl_opt_script_fname()
	);
	cleanup_after_perl();
    }

    /* Time to close stderr */
    close(2);
}

void perperl_perl_run(slotnum_t gslotnum, slotnum_t bslotnum) {
    int numrun, exit_val;
    int single_script = DOING_SINGLE_SCRIPT;

    /* Start listening on our socket */
    perperl_ipc_listen(bslotnum);

    /* Main loop */
    for (numrun = 0; !OPTVAL_MAXRUNS || numrun < OPTVAL_MAXRUNS; ++numrun) {

	/* Lock/mmap our temp file.  If our group is invalid, exit quietly */
	if (getppid() == 1 || !perperl_group_lock(gslotnum))
	    all_done();

	/* Update our maturity level */
	FILE_SLOT(be_slot, bslotnum).maturity = numrun ? 2 : 1;

	/* Put ourself onto the be_wait list */
	perperl_backend_be_wait_put(gslotnum, bslotnum);

	/* If we were listed as starting, turn that off */
	if (FILE_SLOT(gr_slot, gslotnum).be_starting == perperl_util_getpid())
	    FILE_SLOT(gr_slot, gslotnum).be_starting = 0;

	/* Send out alarm signal to frontends */
	perperl_group_sendsigs(gslotnum);

	/* Fix our listener fd */
	perperl_ipc_listen_fixfd(bslotnum);

	/* Unlock file */
	perperl_file_set_state(FS_HAVESLOTS);

	/* Do an accept on our socket */
	backend_accept();

	/* Lock file.  If our group is invalid, exit quietly */
	if (!perperl_group_lock(gslotnum))
	    all_done();

	/* If we were listed as starting, turn that off */
	if (FILE_SLOT(gr_slot, gslotnum).be_starting == perperl_util_getpid())
	    FILE_SLOT(gr_slot, gslotnum).be_starting = 0;

	/* Wake up any waiting frontends */
	perperl_group_sendsigs(gslotnum);

	/* Unlock the file */
	perperl_file_set_state(FS_HAVESLOTS);

	/* Run the perl code once */
	exit_val = onerun(single_script);

	/* Send the exit status to the frontend */
	perperl_file_set_state(FS_CORRUPT);
	perperl_backend_exited(bslotnum, 0, exit_val);
    }
    
    /* Start up a replacement backend */
    if (perperl_group_lock(gslotnum))
	perperl_group_start_be(gslotnum);

    /* Exit out */
    all_done();
}

int perperl_perl_fork(void) {
    dSP;
    int retval;
    static int made_sub;

    if (!made_sub) {
	made_sub = 1;
	eval_pv("sub " PERPERL_PKG("_fork") " {return fork;}", TRUE);
    }

    ENTER;
    SAVETMPS;

    PUSHMARK(SP);
    if (call_sv(get_perlvar(&PERLVAR_FORK), G_NOARGS|G_SCALAR) != 1)
	DIE_QUIET("perl fork didn't return one value");

    SPAGAIN;
    retval = POPi;
    PUTBACK;

    FREETMPS;
    LEAVE;

    return retval;
}

/*
 * Glue
 */

void perperl_abort(const char *s) {
    PerlIO_puts(PerlIO_stderr(), s);
    perperl_util_exit(1, 0);
}



( run in 0.468 second using v1.01-cache-2.11-cpan-71847e10f99 )