예제 #1
0
파일: msg_queue.c 프로젝트: Sciumo/minix
/*****************************************************************************
 *     _ddekit_minix_queue_msg                                               *
 ****************************************************************************/
static void 
_ddekit_minix_queue_msg(struct ddekit_minix_msg_q *mq, message *m)
{
	int full;
	full = ddekit_sem_down_try(mq->msg_w_sem);

	if (full) {
		/* Our message queue is full... inform the sender. */
		int result;
		DDEBUG_MSG_WARN("Receive queue is full. Ommiting ingoing msg.\n");

		m->m_type = TASK_REPLY;
		m->REP_STATUS = EAGAIN;
		result = asynsend(m->m_source, m);
		
		if (result != 0) {
			ddekit_panic("unable to send reply to %d: %d\n",
					m->m_source, result);
		}

	} else {
		/* queue the message */
		memcpy(&mq->messages[mq->msg_w_pos], m, sizeof(message));

		if (++mq->msg_w_pos == MESSAGE_QUEUE_SIZE) {
			mq->msg_w_pos = 0;
		}
		DDEBUG_MSG_VERBOSE("ddekit_minix_queue_msg: queueing msg %x\n",
		                    m->m_type);
		ddekit_sem_up(mq->msg_r_sem);
	}
}
예제 #2
0
static void raise_softirq_irqoff_cpu(unsigned int nr, unsigned int cpu)
{
	CHECK_INITVAR(dde26_softirq);

	/* mark softirq scheduled */
	__raise_softirq_irqoff(nr);
	/* wake softirq thread */
	ddekit_sem_up(dde_softirq_sem);
}
예제 #3
0
/***
 * try_to_wake_up - wake up a thread
 * @p: the to-be-woken-up thread
 * @state: the mask of task states that can be woken
 * @sync: do a synchronous wakeup?
 */
int try_to_wake_up(struct task_struct *p, unsigned int state, int sync)
{
	Assert(p);
	dde26_thread_data *t = lxtask_to_ddethread(p);

	Assert(t);
	Assert(SLEEP_LOCK(t));

	p->state = TASK_RUNNING;
	ddekit_sem_up(SLEEP_LOCK(t));

	return 0;
}
예제 #4
0
파일: msg_queue.c 프로젝트: Sciumo/minix
/*****************************************************************************
 *        ddekit_minix_rcv                                                   *
 ****************************************************************************/
void ddekit_minix_rcv(struct ddekit_minix_msg_q *mq, message *m) 
{
	DDEBUG_MSG_VERBOSE("waiting for message");
	
	ddekit_sem_down(mq->msg_r_sem);

	memcpy(m, &mq->messages[mq->msg_r_pos], sizeof(message));

	if (++mq->msg_r_pos == MESSAGE_QUEUE_SIZE) {
		mq->msg_r_pos = 0;
	}
	
	DDEBUG_MSG_VERBOSE("unqueing message");
	
	ddekit_sem_up(mq->msg_w_sem);
}
예제 #5
0
파일: dde.c 프로젝트: DragonQuan/minix3
void ddekit_shutdown() 
{
	ddekit_sem_up(exit_sem);
}
예제 #6
0
파일: timer.c 프로젝트: AgamAgarwal/minix
/*****************************************************************************
 *   _ddekit_timer_interrupt                                                 *
 ****************************************************************************/
void _ddekit_timer_interrupt(void)
{
	jiffies = get_current_clock(); 
	DDEBUG_MSG_VERBOSE("now: %d", jiffies);
	ddekit_sem_up(pending_timer_ints);
}