예제 #1
0
int main(int argc, char *argv[])
{
	if (argc != 2 && argc != 3) {
		fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
		return 1;
	}

	if (argc == 3)
		fault_count_fname = argv[2];
	else
		fault_count_fname = "fault_cnt.out";

	so_init_loader();

	if (AddVectoredExceptionHandler(HANDLER_CALL_FIRST,
					(PVECTORED_EXCEPTION_HANDLER)test_segv_handler) < 0) {
		fprintf(stderr, "cannot set signal handler\n");
		return 1;
	}

	so_execute(argv[1], argv+1);

	// Shouldn't reach here
	return 1;
}
예제 #2
0
int so_scheduler(soscheduler *s, soworker *w)
{
    sotask task;
    int rc = so_schedule(s, &task, w);
    int job = rc;
    if (task.rotate) {
        rc = so_rotate(s, w);
        if (srunlikely(rc == -1))
            goto error;
    }
    so *e = s->env;
    if (task.req) {
        rc = so_dispatch(s, w);
        if (srunlikely(rc == -1)) {
            goto error;
        }
    }
    if (task.checkpoint_complete) {
        sr_triggerrun(&e->ctl.checkpoint_on_complete, &e->o);
    }
    if (task.backup_complete) {
        sr_triggerrun(&e->ctl.backup_on_complete, &e->o);
    }
    if (job) {
        rc = so_execute(&task, w);
        if (srunlikely(rc == -1)) {
            if (task.plan.plan != SI_BACKUP) {
                if (task.db)
                    so_dbmalfunction(task.db);
                goto error;
            }
            sr_mutexlock(&s->lock);
            so_backuperror(s);
            sr_mutexunlock(&s->lock);
        }
    }
    if (task.gc) {
        rc = so_gc(s, w);
        if (srunlikely(rc == -1))
            goto error;
    }
    so_complete(s, &task);
    sr_trace(&w->trace, "%s", "sleep");
    return job;
error:
    sr_trace(&w->trace, "%s", "malfunction");
    return -1;
}