(
writer: Arc<RwLock<Writer<Text80x25>>>,
comm_handle: CommHandle)
| 511 | } |
| 512 | |
| 513 | fn writer_handler( |
| 514 | writer: Arc<RwLock<Writer<Text80x25>>>, |
| 515 | comm_handle: CommHandle) { |
| 516 | |
| 517 | loop { |
| 518 | match syscalls::receive(&comm_handle) { |
| 519 | Ok(syscalls::Message::Long( |
| 520 | message::WRITE, |
| 521 | MessageData::Value(length), |
| 522 | MessageData::MemoryHandle(data_handle))) => { |
| 523 | |
| 524 | let data = data_handle.as_slice::<u8>(length as usize); |
| 525 | writer.write().write_string(data); |
| 526 | |
| 527 | // Done, send reply |
| 528 | syscalls::send(&comm_handle, |
| 529 | syscalls::Message::Short( |
| 530 | message::OK, 0, 0)); |
| 531 | }, |
| 532 | Ok(syscalls::Message::Short( |
| 533 | message::CHAR, ch, _)) => { |
| 534 | |
| 535 | let s : [u8; 1] = [ch as u8]; |
| 536 | writer.write().write_string(&s); |
| 537 | }, |
| 538 | Ok(message) => { |
| 539 | // Unknown message => Return error |
| 540 | syscalls::send(&comm_handle, |
| 541 | syscalls::Message::Short( |
| 542 | message::ERROR_UNKNOWN_MESSAGE, 0, 0)); |
| 543 | }, |
| 544 | Err(syscalls::SYSCALL_ERROR_RECV_BLOCKING) => { |
| 545 | // Waiting for a message |
| 546 | // => Send an error message |
| 547 | syscalls::send(&STDIN, |
| 548 | Message::Short( |
| 549 | message::ERROR, 0, 0)); |
| 550 | // Wait and try again |
| 551 | syscalls::thread_yield(); |
| 552 | }, |
| 553 | Err(code) => { |
| 554 | debug_println!("[vga] Receive error {}", code); |
| 555 | // Wait and try again |
| 556 | syscalls::thread_yield(); |
| 557 | } |
| 558 | } |
| 559 | } |
| 560 | } |
no test coverage detected