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; }
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); } }
bool message::dequeue(data_chunk& value) { if (queue_.empty()) return false; value = dequeue_data(); return true; }