⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tskbuf.cpp

📁 这是一个关于C++编程开发的算法!
💻 CPP
字号:
/*
   CPPTask - A Multitasking Kernel For C++

   Version 1.0 08-12-91

   Ported by Rich Smith from:

   Public Domain Software written by
      Thomas Wagner
      Patschkauer Weg 31
      D-1000 Berlin 33
      West Germany

   NOTE: None of the Buffer routines my be used from inside an interrupt
         handler. The routines are relatively slow, since they use
         the normal word pipe and resource calls. Optimization would be 
         possible by using block moves and internally handling resources.

   TSKBUF.CPP - Buffered Message handling routines.

   Subroutines:
        buffer::buffer
        buffer::~buffer
        buffer::read_buffer
        buffer::c_read_buffer
        buffer::write_buffer
        buffer::c_write_buffer
        buffer::check_buffer

*/

#include <stdio.h>

#include "task.hpp"
#include "tsklocal.hpp"


/*
   buffer
*/
buffer::buffer (farptr pbuf, word bufsize)
:pip(pbuf, bufsize), buf_write(), buf_read()
{
   flags = 0;
   msgcnt = 0;
}


/*
   ~buffer
*/
buffer::~buffer ()
{
   msgcnt = 0;
}


/*
   read_buffer
*/
int far buffer::read_buffer (farptr msg, int size, dword timeout)
{
   int i, len, l1, l2;
   word w;

   if ((i = buf_read.request_resource (timeout)) < 0)
      return i;

   if ((len = pip.read_wpipe (timeout)) < 0)
      {
      buf_read.release_resource ();
      return len;
      }

   l1 = (len < size) ? len : size;

   for (i = 0; i < l1; i++)
      {
      if (!(i & 1))
         w = pip.read_wpipe (0L);
      else
         w = w >> 8;
      ((byteptr)msg) [i] = (byte)w;
      }

   l2 = (len + 1) >> 1;
   for (i = (l1 + 1) >> 1; i < l2; i++)
      pip.read_wpipe (0L);
   if (l1 < size)
      ((byteptr)msg) [l1] = 0;

   msgcnt--;

   buf_read.release_resource ();
   return len;
}


/*
   c_read_buffer
*/
int far buffer::c_read_buffer (farptr msg, int size)
{
   int res;
   CRITICAL;

   res = -1;
   C_ENTER;

   if (pip.get_filled() && buf_read.get_state())
      {
      buf_read.request_resource (0L);
      C_LEAVE;
      res = read_buffer (msg, size, 0L);
      }
   else
      C_LEAVE;

   return res;
}


/*
   tsk_wrbuf
*/
int buffer::tsk_wrbuf (word w, dword timeout)
{
   int i;

   if ((i = pip.write_wpipe (w, timeout)) < 0)
      buf_write.release_resource ();
   return i;
}


/*
   write_buffer
*/
int far buffer::write_buffer (farptr msg, int size, dword timeout)
{
   int i, res, l2;

   if (size < 0 || (word)((size + 3) >> 1) > pip.get_bufsize())
      return -3;

   if ((i = buf_write.request_resource (timeout)) < 0)
      return i;

   if ((i = tsk_wrbuf ((word)size, timeout)) < 0)
      return i;

   l2 = (size + 1) >> 1;

   for (i = 0; i < l2; i++)
      if ((res = tsk_wrbuf (((wordptr)msg) [i], timeout)) < 0)
         return res;

   msgcnt++;

   buf_write.release_resource ();
   return size;
}


/*
   c_write_buffer
*/
int far buffer::c_write_buffer (farptr msg, int size)
{
   int res;
   CRITICAL;

   if (size < 0 || (word)((size + 3) >> 1) > pip.get_bufsize())
      return -3;

   C_ENTER;
   res = -1;

   if (pip.wpipe_free () >= ((size + 3) >> 1) && buf_write.get_state())
      {
      buf_write.request_resource (0L);
      C_LEAVE;
      res = write_buffer (msg, size, 0L);
      }
   else
      C_LEAVE;

   return res;
}


/*
   check_buffer
*/
word far buffer::check_buffer (void)
{
   return msgcnt;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -