inline static void Execute(void* Arg) {
    ThreadState lobject_lock;
    long i, rnum;
    volatile long j;
    long id = (long) Arg;

    setThreadId(id);
    _thread_pin(id);
    simSRandom(id + 1L);
    threadStateInit(&lobject_lock, &object_lock, (int)id);
    if (id == N_THREADS - 1)
        d1 = getTimeMillis();
    // Synchronization point
    int rc = pthread_barrier_wait(&barr);
    if (rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) {
        printf("Could not wait on barrier\n");
        exit(-1);
    }
    start_cpu_counters(id);
    for (i = 0; i < RUNS; i++) {
        // perform a fetchAndMultiply operation
        applyOp(&object_lock, &lobject_lock, fetchAndMultiply, (ArgVal) id, id);
        rnum = simRandomRange(1, MAX_WORK);
        for (j = 0; j < rnum; j++)
            ; 
    }
    stop_cpu_counters(id);
}
inline void Execute(void* Arg) {
    long i, rnum;
    volatile int j;
    long id = (long) Arg;
    HQueueThreadState lqueue_struct;

    setThreadId(id);
    _thread_pin(id);
    simSRandom(id + 1);
    hqueueThreadStateInit(&queue_object, &lqueue_struct, (int)id);

    if (id == N_THREADS - 1)
        d1 = getTimeMillis();
    // Synchronization point
    int rc = pthread_barrier_wait(&barr);
    if (rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) {
        printf("Could not wait on barrier\n");
        exit(-1);
    }
    start_cpu_counters(id);
    for (i = 0; i < RUNS; i++) {
        // perform an enqueue operation
        applyEnqueue(&queue_object, &lqueue_struct, (ArgVal) id, id);
        rnum = simRandomRange(1, MAX_WORK);
        for (j = 0; j < rnum; j++)
            ; 
        // perform a dequeue operation
        applyDequeue(&queue_object, &lqueue_struct, id);
        rnum = simRandomRange(1, MAX_WORK);
        for (j = 0; j < rnum; j++)
            ; 
    }
    stop_cpu_counters(id);
}
inline static void Execute(void* Arg) {
    long i;
    long rnum;
    long id = (long) Arg;
    volatile int j;

    setThreadId(id);
    _thread_pin(id);
    simSRandom(id + 1);
    init_pool(&pool_node, sizeof(ListNode));
    if (id == N_THREADS - 1)
        d1 = getTimeMillis();
    // Synchronization point
    int rc = pthread_barrier_wait(&barr);
    if (rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) {
        printf("Could not wait on barrier\n");
        exit(-1);
    }
    start_cpu_counters(id);
    for (i = 0; i < RUNS; i++) {
        push((Object)1, id);
        rnum = simRandomRange(1, MAX_WORK);
        for (j = 0; j < rnum; j++)
            ;
        pop(id);
        rnum = simRandomRange(1, MAX_WORK);
        for (j = 0; j < rnum; j++)
            ;
    }
    stop_cpu_counters(id);
}
void initialize_ds(int initListSize, int elementsRange, ThreadGlobals *tg){
#if defined(DAOA) && !defined(HASH_OP)
	void addRoot(void **root, int len);
	addRoot((void**)&entryHead, 1);
#endif
	entryHead=NULL;
	midkey=elementsRange/2;
	simSRandom(-1);
	for (int i = 0; i < initListSize; i++) {
		int key = simRandom() % elementsRange;
#ifndef HASH_OP
		ListInsertFAST(&entryHead, tg, key, 0);
#else
		HashInsertFAST(&hash, tg, key, 0);
#endif
	}
}