コード例 #1
0
ファイル: thread_pool.cpp プロジェクト: Jsims1992/phoenix
void* thread_pool::loop(void* arg)
{
    thread_arg_t*    thread_arg = (thread_arg_t*)arg;
    
    assert (thread_arg);

    thread_func     thread_func;
    thread_pool*    pool = thread_arg->pool;
    thread_loc&        loc = thread_arg->loc;
    void            *thread_func_arg;
    
    if(loc.cpu >= 0)
        proc_bind_thread (loc.cpu);
        
    loc.lgrp = loc_get_lgrp();

    while (!pool->die)
    {
        thread_arg->sem_run.wait();
        if (pool->die)
            break;
        
        thread_func = *(pool->thread_function);
        thread_func_arg = pool->args[loc.thread];        
        
        // Run thread function.
        (*thread_func)(thread_func_arg, loc);
        
        int num_workers_done = fetch_and_inc(&pool->num_workers_done) + 1;        
        if (num_workers_done == pool->num_workers) {            
            // Everybody's done.
            pool->sem_all_workers_done.post();
        }        
    }

    int num_workers_done = fetch_and_inc(&pool->num_workers_done) + 1;        
    if (num_workers_done == pool->num_workers) {            
        // Everybody's done.
        pool->sem_all_workers_done.post();
    }

    return NULL;
}
コード例 #2
0
ファイル: tpool.c プロジェクト: SANL-2015/SANL-2015
static void* thread_loop (void *arg)
{
    thread_arg_t    *thread_arg = arg;
    thread_func     thread_func;
    void            *thread_func_arg;
    void            **ret;
    int             num_workers_done;

    assert (thread_arg);

    while (1)
    {
        CHECK_ERROR (sem_wait (&thread_arg->sem_run));
        if (*thread_arg->die)
            break;

        thread_func = *(thread_arg->thread_func);
        thread_func_arg = *(thread_arg->thread_func_arg);
        ret = thread_arg->ret;

        /* Run thread function. */
        *ret = (*thread_func)(thread_func_arg);

        num_workers_done = fetch_and_inc(thread_arg->num_workers_done) + 1;
        if (num_workers_done == *thread_arg->num_workers)
        {
            /* Everybody's done. */
            CHECK_ERROR (sem_post (thread_arg->sem_all_workers_done));
        }
    }

    sem_destroy (&thread_arg->sem_run);
    num_workers_done = fetch_and_inc(thread_arg->num_workers_done) + 1;
    if (num_workers_done == *thread_arg->num_workers)
    {
        /* Everybody's done. */
        CHECK_ERROR (sem_post (thread_arg->sem_all_workers_done));
    }

    return NULL;
}
コード例 #3
0
static void __add_timestamp_user(struct timestamp *pre_recorded)
{
	unsigned int seq_no;
	struct timestamp *ts;
	seq_no = fetch_and_inc((int *) &ts_seq_no);
	if (ft_buffer_start_write(trace_ts_buf, (void**)  &ts)) {
		*ts = *pre_recorded;
		ts->seq_no = seq_no;
		__save_irq_flags(ts);
		ft_buffer_finish_write(trace_ts_buf, ts);
	}
}
コード例 #4
0
ファイル: matrixSum.c プロジェクト: kimpers/school_work
// Each worker computes the, sum, min & max values for tasks from taken from bag
// while there are still tasks left to be computed
void *Worker(void *arg) {
    long myid = (long) arg;
    int total, i, j, first, last;
    ThreadData *my_min_max = malloc(sizeof (ThreadData));
    my_min_max-> max = INT_MIN;
    my_min_max-> min = INT_MAX;
    my_min_max->sum = 0;
    my_min_max->max_col = -1;
    my_min_max->max_row = -1;
    my_min_max->min_col = -1;
    my_min_max->min_row = -1;

#ifdef DEBUG
    // printf("worker %d (pthread id %d) has started\n", myid, pthread_self());
#endif


    /* sum values in my strip */
    total = 0;
#ifdef DEBUG
    printf("T: %d started\n", (int) myid);
#endif
    int my_row;
    while ((my_row = fetch_and_inc()) < size) {
#ifdef DEBUG
        printf("T: %d started with row %d\n", (int) myid, my_row);
#endif
        for (j = 0; j < size; j++) {
            total += matrix[my_row][j];
            if (matrix[my_row][j] > my_min_max->max) {
                my_min_max->max = matrix[my_row][j];
                my_min_max->max_row = my_row;
                my_min_max->max_col = j;
            }
            if (matrix[my_row][j] < my_min_max->min) {
                my_min_max->min = matrix[my_row][j];
                my_min_max->min_row = my_row;
                my_min_max->min_col = j;

            }
            my_min_max->sum = total;
        }
    }

#ifdef DEBUG
    printf("T: %d done with total %d\n", (int) myid, my_min_max->sum);
#endif
    pthread_exit(my_min_max);

}
コード例 #5
0
static inline void __save_timestamp_cpu(unsigned long event,
					uint8_t type, uint8_t cpu)
{
	unsigned int seq_no;
	struct timestamp *ts;
	seq_no = fetch_and_inc((int *) &ts_seq_no);
	if (ft_buffer_start_write(trace_ts_buf, (void**)  &ts)) {
		ts->event     = event;
		ts->seq_no    = seq_no;
		ts->cpu       = cpu;
		ts->task_type = type;
		__save_irq_flags(ts);
		barrier();
		/* prevent re-ordering of ft_timestamp() */
		ts->timestamp = ft_timestamp();
		ft_buffer_finish_write(trace_ts_buf, ts);
	}
}
コード例 #6
0
ファイル: spmdext.c プロジェクト: stefankok/lpel
void LpelSpmdRequest(lpel_task_t *task, lpel_spmdfunc_t fun, void *arg)
{
  int tail;
  spmdreq_t *req;
  workerctx_t *wc = task->worker_context;
  assert(wc != NULL && wc->wid >= 0 && wc->wid < num_workers);

  /* set pending flag */
  assert( 0 == worker_data[wc->wid].pending);
  worker_data[wc->wid].pending = 1;

  /* append */
  tail = fetch_and_inc(&qtail) % num_workers;
  req = &req_queue[tail];
  req->wctx = wc;
  req->func = fun;
  req->arg  = arg;
  req->task = task;
}
コード例 #7
0
feather_callback void save_task_latency(unsigned long event,
					unsigned long when_ptr)
{
	lt_t now = litmus_clock();
	lt_t *when = (lt_t*) when_ptr;
	unsigned int seq_no;
	int cpu = raw_smp_processor_id();
	struct timestamp *ts;

	seq_no = fetch_and_inc((int *) &ts_seq_no);
	if (ft_buffer_start_write(trace_ts_buf, (void**)  &ts)) {
		ts->event     = event;
		ts->timestamp = now - *when;
		ts->seq_no    = seq_no;
		ts->cpu       = cpu;
		ts->task_type = TSK_RT;
		__save_irq_flags(ts);
		ft_buffer_finish_write(trace_ts_buf, ts);
	}
}