home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 330_02 / tskbuf.c < prev    next >
C/C++ Source or Header  |  1990-10-12  |  5KB  |  215 lines

  1. /*
  2.    --- Version 2.2 90-10-12 10:33 ---
  3.  
  4.    TSKBUF.C - CTask - Buffered Message handling routines.
  5.  
  6.    Public Domain Software written by
  7.       Thomas Wagner
  8.       Ferrari electronic Gmbh
  9.       Beusselstrasse 27
  10.       D-1000 Berlin 21
  11.       Germany
  12.  
  13.    NOTE: None of the Buffer routines my be used from inside an interrupt
  14.          handler. The routines are relatively slow, since they use
  15.          the normal word pipe and resource calls. Optimization would be 
  16.          possible by using block moves and internally handling resources.
  17. */
  18.  
  19. #include "tsk.h"
  20. #include "tsklocal.h"
  21.  
  22.  
  23. bufferptr Globalfunc create_buffer (bufferptr buf, farptr pbuf, 
  24.                                     word bufsize TN(byteptr name))
  25. {
  26. #if (TSK_DYNAMIC)
  27.    if (buf == LNULL)
  28.       {
  29.       if ((buf = tsk_palloc (sizeof (buffer))) == LNULL)
  30.          return LNULL;
  31.       buf->flags = F_TEMP;
  32.       }
  33.    else
  34.       buf->flags = 0;
  35.    if (pbuf == LNULL)
  36.       {
  37.       if ((pbuf = tsk_palloc (bufsize)) == LNULL)
  38.          {
  39.          if (buf->flags & F_TEMP)
  40.             tsk_pfree (buf);
  41.          return LNULL;
  42.          }
  43.       buf->flags |= F_STTEMP;
  44.       }
  45. #endif
  46.  
  47.    create_wpipe (&buf->pip, pbuf, bufsize TN(name));
  48.    create_resource (&buf->buf_read TN(name));
  49.    create_resource (&buf->buf_write TN(name));
  50.    buf->msgcnt = 0;
  51.  
  52. #if (TSK_NAMED)
  53.    tsk_add_name (&buf->name, name, TYP_BUFFER, buf);
  54. #endif
  55.  
  56.    return buf;
  57. }
  58.  
  59.  
  60. void Globalfunc delete_buffer (bufferptr buf)
  61. {
  62.    CHECK_EVTPTR (buf, TYP_RESOURCE, "Delete Buffer");
  63.  
  64.    delete_wpipe (&buf->pip);
  65.    delete_resource (&buf->buf_read);
  66.    delete_resource (&buf->buf_write);
  67.    buf->msgcnt = 0;
  68.  
  69. #if (TSK_NAMED)
  70.    tsk_del_name (&buf->name);
  71. #endif
  72.  
  73. #if (TSK_DYNAMIC)
  74.    if (buf->flags & F_STTEMP)
  75.       tsk_pfree (buf->pip.wcontents);
  76.    if (buf->flags & F_TEMP)
  77.       tsk_pfree (buf);
  78. #endif
  79. }
  80.  
  81.  
  82. int Globalfunc read_buffer (bufferptr buf, farptr msg, int size, dword timeout)
  83. {
  84.    int i, len, l1, l2;
  85.    word w;
  86.  
  87.    CHECK_EVTPTR (buf, TYP_RESOURCE, "Read Buffer");
  88.  
  89.    if ((i = request_resource (&buf->buf_read, timeout)) < 0)
  90.       return i;
  91.  
  92.    if ((len = read_wpipe (&buf->pip, timeout)) < 0)
  93.       {
  94.       release_resource (&buf->buf_read);
  95.       return len;
  96.       }
  97.  
  98.    l1 = (len < size) ? len : size;
  99.  
  100.    for (i = 0; i < l1; i++)
  101.       {
  102.       if (!(i & 1))
  103.          w = read_wpipe (&buf->pip, 0L);
  104.       else
  105.          w = w >> 8;
  106.       ((byteptr)msg) [i] = (byte)w;
  107.       }
  108.  
  109.    l2 = (len + 1) >> 1;
  110.    for (i = (l1 + 1) >> 1; i < l2; i++)
  111.       read_wpipe (&buf->pip, 0L);
  112.    if (l1 < size)
  113.       ((byteptr)msg) [l1] = 0;
  114.  
  115.    buf->msgcnt--;
  116.  
  117.    release_resource (&buf->buf_read);
  118.    return len;
  119. }
  120.  
  121.  
  122. int Globalfunc c_read_buffer (bufferptr buf, farptr msg, int size)
  123. {
  124.    int res;
  125.    CRITICAL;
  126.  
  127.    CHECK_EVTPTR (buf, TYP_RESOURCE, "Cond Read Buffer");
  128.  
  129.    res = -1;
  130.    C_ENTER;
  131.  
  132.    if (buf->pip.filled && !buf->buf_read.count)
  133.       {
  134.       request_resource (&buf->buf_read, 0L);
  135.       C_LEAVE;
  136.       res = read_buffer (buf, msg, size, 0L);
  137.       }
  138.    else
  139.       C_LEAVE;
  140.  
  141.    return res;
  142. }
  143.  
  144.  
  145. local int Staticfunc tsk_wrbuf (bufferptr buf, word w, dword timeout)
  146. {
  147.    int i;
  148.  
  149.    if ((i = write_wpipe (&buf->pip, w, timeout)) < 0)
  150.       release_resource (&buf->buf_write);
  151.    return i;
  152. }
  153.  
  154.  
  155. int Globalfunc write_buffer (bufferptr buf, farptr msg, int size, dword timeout)
  156. {
  157.    int i, res, l2;
  158.  
  159.    CHECK_EVTPTR (buf, TYP_RESOURCE, "Write Buffer");
  160.  
  161.    if (size < 0 || (word)((size + 3) >> 1) > buf->pip.bufsize)
  162.       return -3;
  163.  
  164.    if ((i = request_resource (&buf->buf_write, timeout)) < 0)
  165.       return i;
  166.  
  167.    if ((i = tsk_wrbuf (buf, (word)size, timeout)) < 0)
  168.       return i;
  169.  
  170.    l2 = (size + 1) >> 1;
  171.  
  172.    for (i = 0; i < l2; i++)
  173.       if ((res = tsk_wrbuf (buf, ((wordptr)msg) [i], timeout)) < 0)
  174.          return res;
  175.  
  176.    buf->msgcnt++;
  177.  
  178.    release_resource (&buf->buf_write);
  179.    return size;
  180. }
  181.  
  182.  
  183. int Globalfunc c_write_buffer (bufferptr buf, farptr msg, int size)
  184. {
  185.    int res;
  186.    CRITICAL;
  187.  
  188.    CHECK_EVTPTR (buf, TYP_RESOURCE, "Cond Write Buffer");
  189.  
  190.    if (size < 0 || (word)((size + 3) >> 1) > buf->pip.bufsize)
  191.       return -3;
  192.  
  193.    C_ENTER;
  194.    res = -1;
  195.  
  196.    if (wpipe_free (&buf->pip) >= (word)((size + 3) >> 1) && !buf->buf_write.count)
  197.       {
  198.       request_resource (&buf->buf_write, 0L);
  199.       C_LEAVE;
  200.       res = write_buffer (buf, msg, size, 0L);
  201.       }
  202.    else
  203.       C_LEAVE;
  204.  
  205.    return res;
  206. }
  207.  
  208.  
  209. word Globalfunc check_buffer (bufferptr buf)
  210. {
  211.    CHECK_EVTPTR (buf, TYP_RESOURCE, "Check Buffer");
  212.    return buf->msgcnt;
  213. }
  214.  
  215.