home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / CTASK22.ZIP / TSKMEMW.C < prev    next >
C/C++ Source or Header  |  1990-10-12  |  3KB  |  120 lines

  1. /*
  2.    --- Version 2.2 90-10-12 10:33 ---
  3.  
  4.    TSKMEMW.C - CTask - Memory watch operations.
  5.  
  6.    CTask - a Multitasking Kernel for C
  7.  
  8.    Public Domain Software written by
  9.       Thomas Wagner
  10.       Ferrari electronic Gmbh
  11.       Beusselstrasse 27
  12.       D-1000 Berlin 21
  13.       Germany
  14.  
  15.    No rights reserved.
  16.  
  17.    This file is new with 2.1. The memory watch related functions were moved
  18.    from tsktimer to this module.
  19.  
  20.    Version 2.2 adds a create routine that does not enqueue the created
  21.    element. Separate enable and disable routines have been added in
  22.    tsktsub.c.
  23. */
  24.  
  25. #include "tsk.h"
  26. #include "tsklocal.h"
  27.  
  28. #include <stdarg.h>
  29.  
  30. /*
  31.    create_memory_watch_elem
  32.       Creates a memory watch element. 
  33. */
  34.  
  35. tlinkptr CGlobalfunc create_memory_watch_elem (tlinkptr elem, farptr address, 
  36.                                                word mask, word compare, 
  37.                                                byte cmpkind, farptr strucp, 
  38.                                                byte kind, int rept, ...)
  39. {
  40.    va_list val;
  41.  
  42.    if (cmpkind < TCMP_EQ || cmpkind > TCMP_CHG)
  43.       return LNULL;
  44.  
  45.    va_start (val, rept);
  46.    elem = tsk_setup_telem (elem, TYP_WATCH, strucp, kind, va_arg (val, dword));
  47.    va_end (val);
  48.    if (elem == LNULL)
  49.       return LNULL;
  50.  
  51.    if (rept)
  52.       elem->flags |= TFLAG_REPEAT;
  53.    elem->elkind = (byte)(TELEM_MEM | cmpkind);
  54.    elem->elem.mem.address = address;
  55.    elem->elem.mem.mask = mask;
  56.    elem->elem.mem.compare = compare;
  57.  
  58.    return elem;
  59. }
  60.  
  61.  
  62. /*
  63.    create_memory_watch
  64.       Creates a memory watch element and activates it.
  65.       Fro compatibility to previous versions only.
  66. */
  67.  
  68. tlinkptr CGlobalfunc create_memory_watch (tlinkptr elem, farptr address, 
  69.                                           word mask, word compare, byte cmpkind,
  70.                                           farptr strucp, byte kind, int rept, ...)
  71. {
  72.    va_list val;
  73.  
  74.    va_start (val, rept);
  75.    elem = create_memory_watch_elem (elem, address, mask, compare, cmpkind, 
  76.                                     strucp, kind, rept, va_arg (val, dword));
  77.    va_end (val);
  78.    if (elem != LNULL)
  79.       enable_watch (elem);
  80.  
  81.    return elem;
  82. }
  83.  
  84.  
  85. /*
  86.    wait_memory
  87.       Delay current task until specified memory watch condition is met.
  88. */
  89.  
  90. int Globalfunc wait_memory (farptr address, 
  91.                             word mask, word compare, byte cmpkind)
  92. {
  93.    tlinkptr elem;
  94.    tcbptr task = GLOBDATA current_task;
  95.  
  96.    if (cmpkind < TCMP_EQ || cmpkind > TCMP_CHG)
  97.       return 1;
  98.  
  99.    elem = &task->timerq;
  100.    elem->link.kind = TYP_WATCH;
  101.    elem->struckind = TKIND_WAKE;
  102.    elem->elkind = (byte)(TELEM_MEM | cmpkind);
  103.    elem->flags = 0;
  104.    elem->elem.mem.address = address;
  105.    elem->elem.mem.mask = mask;
  106.    elem->elem.mem.compare = compare;
  107.  
  108.    tsk_cli ();
  109.    task->state = ST_DELAYED;
  110.    task->qhead = LNULL;
  111.  
  112.    tsk_putqueue (&GLOBDATA watch_queue, &elem->link);
  113.  
  114.    schedule ();
  115.    return (int)((dword)task->retptr);
  116. }
  117.  
  118.  
  119.  
  120.