Пример #1
0
static int read_data_port(ushort_t port, void * dst, uint_t length, struct vm_device * dev) {
  struct serial_state * state = (struct serial_state *)dev->private_data;
  char * val = (char *)dst;
  PrintDebug("Read from Data Port 0x%x\n", port);

  if (length != 1) {
    PrintDebug("Invalid length(%d) in write to 0x%x\n", length, port);
    return -1;
  }

  switch (port) {
  case COM1_DATA_PORT:
    dequeue_data(&(state->com1.tx_buffer), val);
    break;
  case COM2_DATA_PORT:
    dequeue_data(&(state->com2.tx_buffer), val);
    break;
  case COM3_DATA_PORT:
    dequeue_data(&(state->com3.tx_buffer), val);
    break;
  case COM4_DATA_PORT:
    dequeue_data(&(state->com4.tx_buffer), val);
    break;
  default:
    return -1;
  }
  

  return length;
}
Пример #2
0
bool_t
receive_data(DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_reqdsp)
{
	TCB		*p_tcb;
	intptr_t data;

	if (p_dtqcb->count > 0U) {
		dequeue_data(p_dtqcb, p_data);
		if (!queue_empty(&(p_dtqcb->swait_queue))) {
			p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
			data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
			enqueue_data(p_dtqcb, data);
			*p_reqdsp = wait_complete(p_tcb);
		}
		else {
			*p_reqdsp = false;
		}
		return(true);
	}
	else if (!queue_empty(&(p_dtqcb->swait_queue))) {
		p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
		*p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
		*p_reqdsp = wait_complete(p_tcb);
		return(true);
	}
	else {
		return(false);
	}
}
Пример #3
0
bool message::dequeue(data_chunk& value)
{
    if (queue_.empty())
        return false;

    value = dequeue_data();
    return true;
}