clockvector: snapshot our clock vectors
[c11tester.git] / main.cc
diff --git a/main.cc b/main.cc
index 6f1483b7decbcebb809c6469489b2815a0965516..26d8beb79d52f8d09a9d16b97f96c79972941822 100644 (file)
--- a/main.cc
+++ b/main.cc
@@ -2,6 +2,8 @@
  *  @brief Entry point for the model checker.
  */
 
+#include <unistd.h>
+
 #include "libthreads.h"
 #include "common.h"
 #include "threads.h"
 #include "model.h"
 #include "snapshot-interface.h"
 
-static void parse_options(struct model_params *params, int argc, char **argv) {
+static void param_defaults(struct model_params * params) {
+       params->maxreads = 0;
+       params->maxfuturedelay = 100;
+       params->fairwindow = 0;
+       params->enabledcount = 1;
+}
+
+static void print_usage(struct model_params *params) {
+       printf(
+"Usage: <program name> [MC_OPTIONS] -- [PROGRAM ARGUMENTS]\n"
+"\n"
+"Options:\n"
+"-h                    Display this help message and exit\n"
+"-m                    Maximum times a thread can read from the same write\n"
+"                      while other writes exist. Default: %d\n"
+"-s                    Maximum actions that the model checker will wait for\n"
+"                      a write from the future past the expected number of\n"
+"                      actions. Default: %d\n"
+"-f                    Specify a fairness window in which actions that are\n"
+"                      enabled sufficiently many times should receive\n"
+"                      priority for execution. Default: %d\n"
+"-e                    Enabled count. Default: %d\n"
+"--                    Program arguments follow.\n\n",
+params->maxreads, params->maxfuturedelay, params->fairwindow, params->enabledcount);
+       exit(EXIT_SUCCESS);
+}
+
+static void parse_options(struct model_params *params, int *argc, char ***argv) {
+       const char *shortopts = "hm:s:f:e:";
+       int opt;
+       bool error = false;
+       while (!error && (opt = getopt(*argc, *argv, shortopts)) != -1) {
+               switch (opt) {
+               case 'h':
+                       print_usage(params);
+                       break;
+               case 's':
+                       params->maxfuturedelay = atoi(optarg);
+                       break;
+               case 'f':
+                       params->fairwindow = atoi(optarg);
+                       break;
+               case 'e':
+                       params->enabledcount = atoi(optarg);
+                       break;
+               case 'm':
+                       params->maxreads = atoi(optarg);
+                       break;
+               default: /* '?' */
+                       error = true;
+                       break;
+               }
+       }
+       (*argc) -= optind;
+       (*argv) += optind;
+
+       if (error)
+               print_usage(params);
 }
 
 int main_argc;
@@ -21,10 +80,11 @@ char **main_argv;
 /** The real_main function contains the main model checking loop. */
 static void real_main() {
        thrd_t user_thread;
-       ucontext_t main_context;
        struct model_params params;
 
-       parse_options(&params, main_argc, main_argv);
+       param_defaults(&params);
+
+       parse_options(&params, &main_argc, &main_argv);
 
        //Initialize race detector
        initRaceDetector();
@@ -34,11 +94,6 @@ static void real_main() {
 
        model = new ModelChecker(params);
 
-       if (getcontext(&main_context))
-               return;
-
-       model->set_system_context(&main_context);
-
        snapshotObject->snapshotStep(0);
        do {
                /* Start user program */