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; }
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; }