mcs-queue: modifications for compiling
[model-checker-benchmarks.git] / mcs-queue / main.c
index 98ca29a26ac87a38ed745bd03a41c1859d7e0bd6..015fbd4c7737175294b9952b697558dca7bf66af 100644 (file)
 #include "main.h"
+#include <stdlib.h>
 
 #define NUM_PROCESSORS                 12
 
 struct tms tim;
 struct tms tim1;
 
-usptr_t *Handle;
-barrier_t *Barrier;
-usptr_t *lock_handle;
-ulock_t native_lock;
-
 int shmid;
 
 unsigned pid;
-unsigned backoff;
-unsigned backoff_base;
-unsigned backoff_cap;
-unsigned backoff_addend;
 char* name = "";
-unsigned backoff_base_bits = 0;
-unsigned backoff_cap_bits = 0;
 unsigned procs = 1;
 unsigned multi = 1;
 unsigned iterations = 1;
 unsigned initial_nodes = 0;
 unsigned repetitions = 1;
-unsigned backoff_shift_bits = 0;
 unsigned work = 0;
 private_t private;
 shared_mem_t *smp;
 
-void
-native_acquire ()
+void time_test()
 {
-  ussetlock(native_lock);
-} 
+       unsigned i,j;
+       struct tms time_val;
+       clock_t t1, t2;
+       unsigned val;
 
-void
-native_release ()
-{
-  usunsetlock(native_lock);
+       if(pid==0) {
+               init_queue();
+       }
+       init_memory();
+       init_private();
+       for(i=0;i<iterations;i++) {
+               val = private.value;
+               enqueue(val);
+               for(j=0; j<work;) j++;
+               val = dequeue();
+               for(j=0; j<work;) j++;
+               private.value++;
+       }
 }
 
-void
-tts_acq(unsigned* plock)
+void main_task()
 {
-  do {
-    if (*plock == 1) {
-      backoff = backoff_base;
-      do {
-       backoff_delay();
-      } while(*plock == 1);
-    }
-  } while (tas(plock) == 1);
+       unsigned processor;
+       unsigned i;
+
+       processor = (pid/multi)+1;
+       processor %= NUM_PROCESSORS;
+       for (i=0; i<repetitions; i++) {
+               time_test();
+       }
 }
 
-void 
-time_test ()
+int user_main(int argc, char **argv)
 {
-  unsigned i,j;
-  struct tms time_val;
-  clock_t t1, t2;
-  unsigned val;
+       int i, num_threads;
+       thrd_t *t;
 
-  if(pid==0) {
-    init_queue();
-  }
-  init_memory();
-  init_private();
-  init_backoff();
-  barrier(Barrier, procs*multi);
-  if(pid==0)
-  {
-    t1=times(&time_val);
-  }
-  for(i=0;i<iterations;i++) {
-    val = private.value;
-    enqueue(val);
-    for(j=0; j<work;) j++;
-    val = dequeue();
-    for(j=0; j<work;) j++;
-    private.value++;
-  }
-  barrier(Barrier, procs*multi);
-  if(pid==0)
-  {
-    t2=times(&time_val);
-    printf("p%d  m%d  i%d  b%d c%d s%d  w%d time %.0f ms.\n",
-          procs, multi, iterations*procs*multi,
-          backoff_base_bits, backoff_cap_bits,
-          backoff_shift_bits, work, ((t2-t1)*1000)/(double)HZ);
-    fflush(stdout);
-  }
-}
+       parse_args(argc, argv);
+       name = argv[0];
+       iterations = (iterations + ((procs*multi)>>1))/(procs*multi);
 
-void main_task()
-{
-  unsigned processor;
-  unsigned i;
+       smp = (shared_mem_t *)calloc(1, sizeof(shared_mem_t));
+       assert(smp);
 
-  processor = (pid/multi)+1;
-  processor %= NUM_PROCESSORS;
-  if(sysmp(MP_MUSTRUN, processor) == -1) { perror("Could not MUSTRUN"); }
-  if (pid==0) {
-    printf("--- %s\n", name);
-    fflush(stdout);
-  }
-  for (i=0; i<repetitions; i++) {
-    time_test();
-  }
-}
+       num_threads = procs * multi;
+       t = malloc(num_threads * sizeof(thrd_t));
 
-void  setup_shmem()
-{
-  shmid = shmget(IPC_PRIVATE, sizeof(shared_mem_t), 511);
-  assert(shmid != -1);
-  smp = (shared_mem_t *)shmat(shmid, 0, 0);
-  assert((int)smp != -1);
-}
+       for (i = 0; i < num_threads; i++)
+               thrd_create(&t[i], main_task, NULL);
+       for (i = 0; i < num_threads; i++)
+               thrd_join(t[i]);
 
-void my_m_fork(void (*func)(),int num_procs)
-{
-  for (pid=1;pid<num_procs;pid++) {
-    if(fork()==0) /* Child */ {
-      (*func)(); /* Call the program */
-      return;
-    }
-  }
-  pid=0;
-  (*func)(); /* Call the program */
-}
+       free(t);
+       free(smp);
 
-main(int argc,char **argv)
-{
-  parse_args(argc, argv);
-  name = argv[0];
-  iterations = (iterations + ((procs*multi)>>1))/(procs*multi);
-  setup_shmem();
-  Handle = usinit("/tmp/foo_barrier");
-  Barrier = new_barrier(Handle);
-  init_barrier(Barrier);
-  lock_handle = usinit("/tmp/foo_lock");
-  native_lock = usnewlock(lock_handle);
-  my_m_fork(main_task, procs*multi); 
-  shmctl(shmid, IPC_RMID, smp);
-  exit(0);
+       return 0;
 }