Example #1
0
int sthread_cond_signal(sthread_cond_t *cond)
{
	if(cond->cond)
	{
		int i;
		__DEBUG_PRINT(("tid %d signal 1 \n", __selftid));
		setup_sync();
		__DEBUG_PRINT(("tid %d signal 2 \n", __selftid));
		wait_to_enter();
		__DEBUG_PRINT(("tid %d signal 3 \n", __selftid));
		__mvspace_commit();
		v_next_and_wait();
		__DEBUG_PRINT(("tid %d signal 3 \n", __selftid));
		__mvspace_pull();

		for(i=0;i<MAXTHREADS;i++)
			post_sem(cond->cond->locks, i);
		__DEBUG_PRINT(("tid %d signal 4 \n", __selftid));

		leave_sync();
		__DEBUG_PRINT(("tid %d signal 5 \n", __selftid));
			
		return 0;
	}
	return -1;
}
Example #2
0
        int push(const T ele)
        {
            sem_t *p_sem;

            p_sem = &this->p_sem;
            mQueue.push(ele);

            // 等待信号量
            return post_sem(p_sem);
        };
Example #3
0
int sthread_barrier_wait(sthread_barrier_t *barrier)
{
	if(barrier->barrier) {
		setup_sync();
		//setup_barrier_sync(barrier->barrier);
		__DEBUG_PRINT(("tid %d barrier1\n", __selftid));
		wait_to_enter();
		__mvspace_commit();
		__threadpool[__selftid].state = E_STOPPED;
		__threadpool[__selftid].barrier = barrier->barrier;
		__DEBUG_PRINT(("tid %d barrier2\n", __selftid));
		v_next_and_wait();
		setup_barrier_sync(barrier->barrier);
		__sync_fetch_and_add(&(barrier->barrier->num), 1);
		__DEBUG_PRINT(("tid %d barrier3\n", __selftid));
		__mvspace_pull();

		if(barrier->barrier->total == barrier->barrier->num) {
			int i;
			for(i=0;i<MAXTHREADS;i++) {
				if(__threadpool[i].barrier == barrier->barrier)
					__threadpool[i].state = E_NORMAL;
			}
		__DEBUG_PRINT(("tid %d barrier3.5\n", __selftid));
			barrier->barrier->inited = 0;
			post_sem(barrier->barrier->sema, 0);
		}
		__DEBUG_PRINT(("tid %d barrier4\n", __selftid));
		wait_sem(barrier->barrier->sema, 0);
		__DEBUG_PRINT(("tid %d barrier5\n", __selftid));
		post_sem(barrier->barrier->sema, 0);
		__threadpool[__selftid].barrier = NULL;
		__threadpool[__selftid].state = E_NORMAL;

		leave_sync();

		return 0;
	}
	return -1;
}
Example #4
0
void *hackbench_thread(void *t)
{
	unsigned int i, num_groups, total_children;
	int readyfds[2], wakefds[2];
	char dummy;

	num_groups = 50;
	t = NULL;

	fdpair(readyfds);
	fdpair(wakefds);
	
	while (1) {
		total_children = 0;
		for (i = 0; i < num_groups; i++)
			total_children += group(readyfds[1], wakefds[0]);
	
		/* Wait for everyone to be ready */
		for (i = 0; i < total_children; i++)
			if (Read(readyfds[0], &dummy, 1) != 1)
				barf("Reading for readyfds");
	
		/* Kick them off */
		if (write(wakefds[1], &dummy, 1) != 1)
			barf("Writing to start them");
	
		/* Reap them all */
		for (i = 0; i < total_children; i++) {
			int status;
			wait(&status);
			if (!WIFEXITED(status))
				exit(1);
		}
		if (!trywait_sem(&hackthread.sem.stop))
			break;
	}

	post_sem(&hackthread.sem.complete);
	return NULL;
}