buffer.rs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. use alloc::vec::Vec;
  2. use alloc::{string::String, sync::Arc};
  3. use system_error::SystemError;
  4. use crate::libs::spinlock::SpinLock;
  5. #[derive(Debug)]
  6. pub struct Buffer {
  7. metadata: Metadata,
  8. read_buffer: SpinLock<Vec<u8>>,
  9. write_buffer: SpinLock<Vec<u8>>,
  10. }
  11. impl Buffer {
  12. pub fn new() -> Arc<Self> {
  13. Arc::new(Self {
  14. metadata: Metadata::default(),
  15. read_buffer: SpinLock::new(Vec::new()),
  16. write_buffer: SpinLock::new(Vec::new()),
  17. })
  18. }
  19. pub fn is_read_buf_empty(&self) -> bool {
  20. return self.read_buffer.lock().is_empty();
  21. }
  22. pub fn is_read_buf_full(&self) -> bool {
  23. return self.metadata.buf_size - self.read_buffer.lock().len() == 0;
  24. }
  25. pub fn is_write_buf_empty(&self) -> bool {
  26. return self.write_buffer.lock().is_empty();
  27. }
  28. pub fn is_write_buf_full(&self) -> bool {
  29. return self.write_buffer.lock().len() >= self.metadata.buf_size;
  30. }
  31. pub fn read_read_buffer(&self, buf: &mut [u8]) -> Result<usize, SystemError> {
  32. let mut read_buffer = self.read_buffer.lock_irqsave();
  33. let len = core::cmp::min(buf.len(), read_buffer.len());
  34. buf[..len].copy_from_slice(&read_buffer[..len]);
  35. let _ = read_buffer.split_off(len);
  36. // log::debug!("recv buf {}", String::from_utf8_lossy(buf));
  37. return Ok(len);
  38. }
  39. pub fn write_read_buffer(&self, buf: &[u8]) -> Result<usize, SystemError> {
  40. let mut buffer = self.read_buffer.lock_irqsave();
  41. // log::debug!("send buf {}", String::from_utf8_lossy(buf));
  42. let len = buf.len();
  43. if self.metadata.buf_size - buffer.len() < len {
  44. return Err(SystemError::ENOBUFS);
  45. }
  46. buffer.extend_from_slice(buf);
  47. Ok(len)
  48. }
  49. pub fn write_write_buffer(&self, buf: &[u8]) -> Result<usize, SystemError> {
  50. let mut buffer = self.write_buffer.lock_irqsave();
  51. let len = buf.len();
  52. if self.metadata.buf_size - buffer.len() < len {
  53. return Err(SystemError::ENOBUFS);
  54. }
  55. buffer.extend_from_slice(buf);
  56. Ok(len)
  57. }
  58. }
  59. #[derive(Debug)]
  60. pub struct Metadata {
  61. /// 默认的元数据缓冲区大小
  62. metadata_buf_size: usize,
  63. /// 默认的缓冲区大小
  64. buf_size: usize,
  65. }
  66. impl Default for Metadata {
  67. fn default() -> Self {
  68. Self {
  69. metadata_buf_size: 1024,
  70. buf_size: 64 * 1024,
  71. }
  72. }
  73. }