亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tsksub.c

?? 一個多任務操作系統CTask的源代碼 用C語言編寫
?? C
字號:
/*
   --- Version 2.2 92-09-02 12:42 ---

   CTask Subroutines

   Public Domain Software written by
      Thomas Wagner
      Ferrari electronic Gmbh
      Beusselstrasse 27
      D-1000 Berlin 21
      Germany

   Note: The find_xxx_name functions were moved to a separate file,
   'tskname.c', in version 2.1 for potential code savings.
*/

#include "tsk.h"
#include "tsklocal.h"


/*
   tsk_runable
      Make a task eligible for running. The task is removed from the
      timer queue and enqueued in the eligible queue.

      CAUTION: Critical section assumed entered.
*/

void Localfunc tsk_runable (tcbptr task)
{
   CHECK_TCBPTR (task, "Task Runable");

   task->state = ST_ELIGIBLE;
   tsk_deqtimer (&task->timerq.link);
   tsk_dequeue (&task->cqueue);
   tsk_enqueue (task->qhead = &GLOBDATA eligible_queue, &task->cqueue);
}


/*
   tsk_run_pending
      Make a task eligible for running, but don't enqueue it in the
      eligible queue.

      CAUTION: Critical section assumed entered.
*/

void Localfunc tsk_run_pending (tcbptr task)
{
   CHECK_TCBPTR (task, "Task Runable");

   task->state = ST_ELIGIBLE;
   tsk_deqtimer (&task->timerq.link);
   tsk_dequeue (&task->cqueue);
}


/*
   tsk_runable_all
      Make all tasks in a queue eligible for running.

      CAUTION: Critical section assumed entered.
*/

void Localfunc tsk_runable_all (queheadptr que)
{
   queptr curr;
   tcbptr task;

   CHECK_QHEAD (que, "Task Runable All: Queue");

   for (curr = que->first; !(curr->kind & Q_HEAD); )
      {
      task = (tcbptr)curr;
      CHECK_TCBPTR (task, "Task Runable All: TCB");
      curr = curr->next;
      task->state = ST_ELIGIBLE;
      tsk_deqtimer (&task->timerq.link);
      tsk_enqueue (task->qhead = &GLOBDATA eligible_queue, &task->cqueue);
      }
   tsk_init_qhead (que, que->kind);
}


/*
   tsk_wait
      put current running task in wait state.

      With version 2.2, the wait action was changed to immediately
      enqueue the task into the respective queue. In previous versions,
      the task was not enqueued, this was done by the scheduler based 
      on the queue head pointer. Starting with version 2.1, interrupts 
      are enabled early in the scheduler, before the scheduler gets to 
      the point where it enqueues the task. This could lead to race 
      conditions, with tasks being only partially enqueued, or never 
      dequeued, when "tsk_runable" was called by an interrupt handler
      hitting in this interval.

      CAUTION: Critical section assumed entered.
*/

void Localfunc tsk_wait (queheadptr que, dword timeout)
{
   tcbptr curr;

   /*
      Note: The following test shouldn't be necessary. However,
      if ever an interrupt handler should cause the current task to
      be made waiting while the scheduler is active, this would cause
      catastrophic effects (also see the notes in tskasm.asm).
      Well, no interrupt handler should ever do such a nasty thing, but...
      So if the in_sched flag is set, we have to stop everything.
      The test is ommitted when we're not running under DOS.
   */

#if (DOS || DEBUG)
   if (GLOBDATA in_sched)
      tsk_fatal ("Wait while in Scheduler");
#endif

   CHECK_QHEAD (que, "Task Wait: Queue");

   curr = GLOBDATA current_task;
   curr->state = ST_WAITING;
   tsk_enqueue (curr->qhead = que, &curr->cqueue);
   if (timeout)
      {
      tsk_enqtimer (&curr->timerq.link, tsk_timeout(timeout));
      curr->timerq.flags = 0;
      curr->timerq.link.kind = TYP_TIMER;
      }
   schedule ();
}


#if (TSK_NAMED)

/*
   tsk_copy_name
      A replacement for strcpy, used for copying names. The C-runtime
      strcpy is not used here to keep the kernel model independent.
*/

void Localfunc tsk_copy_name (nameptr elem, byteptr name)
{
   byteptr n;
   int i;

   n = elem->name;
   if (name != LNULL)
      for (i = 0; i < 8; i++)
         if ((*n++ = *name++) == 0)
            break;
   *n = 0;
}


/*
   tsk_add_name
      Initialise name-list element and insert it into the name list.
      NOTE: no check is made for duplicate names; names are not sorted.
      Version 2.1 allows name pointers to be LNULL. Structures with LNULL
      name pointers are not added to the list.
*/

void Localfunc tsk_add_name (nameptr elem, byteptr name, byte kind, farptr strucp)
{
   CRITICAL;

   elem->list.kind = kind;
   elem->strucp = strucp;
   if (name == LNULL)
      {
      elem->list.first = LNULL;
      elem->name [0] = 0;
      return;
      }

   tsk_copy_name (elem, name);

   C_ENTER;
#if (GROUPS)
   tsk_putqueue (&GLOBDATA current_task->group->namelist.list, (queptr)&elem->list);
#else
   tsk_putqueue (&GLOBDATA name_list.list, (queptr)&elem->list);
#endif
   C_LEAVE;
}


/*
   tsk_del_name
      delete name-element from the name-list.
*/

void Localfunc tsk_del_name (nameptr elem)
{
   CRITICAL;

   C_ENTER;
   tsk_dequeue ((queptr)&elem->list);
   C_LEAVE;
}

#endif


/*
   tsk_init_qhead
      Initializes the head of a queue.
*/

void Localfunc tsk_init_qhead (queheadptr head, byte kind)
{
   head->kind = Q_HEAD | kind;
   head->first = head->last = (queptr)head;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
偷拍亚洲欧洲综合| 色欧美日韩亚洲| 成人av午夜电影| 91精品国产综合久久精品| 国产精品福利一区| 狠狠色伊人亚洲综合成人| 日本久久一区二区| 国产精品女同一区二区三区| 精品一区二区影视| 在线不卡中文字幕| 亚洲一区二区三区四区五区中文| 国产精品77777竹菊影视小说| 欧美理论电影在线| 一区二区不卡在线视频 午夜欧美不卡在| 激情综合网最新| 欧美一区二区高清| 无码av免费一区二区三区试看| av成人动漫在线观看| 国产丝袜美腿一区二区三区| 麻豆成人av在线| 日韩一区二区精品在线观看| 亚洲电影第三页| 欧美日韩一区二区三区在线看| 国产精品成人在线观看| 盗摄精品av一区二区三区| 久久精品欧美日韩精品| 国产又粗又猛又爽又黄91精品| 日韩一区二区视频在线观看| 日本v片在线高清不卡在线观看| 欧美日韩一卡二卡三卡| 午夜免费久久看| 欧美精品123区| 日本中文字幕一区二区视频 | av成人老司机| 中文字幕在线观看一区二区| 丁香六月久久综合狠狠色| 国产精品免费视频一区| 99视频一区二区| 亚洲欧美日韩久久| 欧美色综合久久| 日本亚洲免费观看| 精品日韩一区二区三区免费视频| 美国十次综合导航| 国产欧美一区二区三区网站| 国产成人在线影院| 中文字幕成人网| 色88888久久久久久影院按摩| 亚洲国产精品久久久男人的天堂| 欧美高清精品3d| 久久不见久久见中文字幕免费| 精品福利一区二区三区| 国产成人亚洲综合a∨婷婷| 欧美激情中文字幕| 91精品福利在线| 日日噜噜夜夜狠狠视频欧美人| 日韩一区二区三区四区五区六区 | 一区二区三区中文在线| 欧美丰满高潮xxxx喷水动漫 | 日韩国产欧美三级| 久久婷婷久久一区二区三区| 国产成人综合网站| 亚洲成av人片一区二区| www国产精品av| 色综合久久久网| 日本在线播放一区二区三区| 欧美激情一二三区| 欧美一卡二卡三卡四卡| 成熟亚洲日本毛茸茸凸凹| 怡红院av一区二区三区| 精品久久国产97色综合| 91视频国产观看| 久久精品国产亚洲a| 亚洲欧洲日韩av| 欧美大胆一级视频| 一本一本大道香蕉久在线精品 | 亚洲免费观看高清在线观看| 欧美一区二区三区在线视频| 不卡一区中文字幕| 美女一区二区在线观看| 最新国产成人在线观看| 欧美sm极限捆绑bd| 91国偷自产一区二区三区观看| 国产一区二区三区视频在线播放| 亚洲制服欧美中文字幕中文字幕| 久久久精品日韩欧美| 欧美精品免费视频| 色噜噜偷拍精品综合在线| 国产一区二区三区在线看麻豆| 亚洲成av人片www| 亚洲精品国产a久久久久久| 国产亚洲精品中文字幕| 日韩一区二区在线看| 欧美日韩成人在线| 欧美在线观看视频在线| 91在线视频网址| 成人午夜精品在线| 国产露脸91国语对白| 日韩成人一级片| 丝袜诱惑制服诱惑色一区在线观看| 中文在线资源观看网站视频免费不卡| 日韩一区二区三区在线| 在线不卡a资源高清| 欧美亚洲免费在线一区| av电影天堂一区二区在线| 国产成人一区在线| 国产成人av一区二区| 国产电影一区在线| 福利一区二区在线| 国产成a人亚洲精品| 国产精品综合网| 国产69精品久久99不卡| 国产suv精品一区二区6| 国产黄色精品网站| 懂色av一区二区三区蜜臀| 国产成人精品免费网站| 国产99久久久国产精品潘金| 国产精品夜夜嗨| 成人免费的视频| 99久久久精品免费观看国产蜜| 国产成人av一区二区| 高潮精品一区videoshd| 不卡一卡二卡三乱码免费网站| 大白屁股一区二区视频| 丰满岳乱妇一区二区三区| 97国产精品videossex| 91色porny| 欧美绝品在线观看成人午夜影视| 欧美日韩一二三区| 欧美成人伊人久久综合网| 久久精品人人爽人人爽| 18成人在线视频| 亚洲国产美女搞黄色| 久久机这里只有精品| 国产成人一区在线| 日韩一区二区视频在线观看| 久久你懂得1024| 国产精品家庭影院| 亚洲bt欧美bt精品| 国产一区二区在线看| 99国产麻豆精品| 欧美巨大另类极品videosbest| 日韩欧美一区电影| 国产精品久久久久久久久免费桃花| 一区二区三区蜜桃| 麻豆国产精品一区二区三区| 成人一区二区三区视频在线观看| 91九色最新地址| 精品国产乱码久久久久久闺蜜| 国产精品久久久久精k8| 天天色综合成人网| 成人av先锋影音| 欧美精品高清视频| 亚洲国产精品黑人久久久| 亚洲成人三级小说| 风间由美中文字幕在线看视频国产欧美 | 国产精品你懂的在线| 亚洲mv大片欧洲mv大片精品| 国产精品一二三在| 色屁屁一区二区| 久久久久久久久久久黄色| 亚洲高清免费在线| 成人激情av网| 欧美不卡在线视频| 亚洲五码中文字幕| 北条麻妃国产九九精品视频| 欧美日韩一区小说| 亚洲欧洲精品一区二区精品久久久| 日韩电影免费在线看| 色视频欧美一区二区三区| 26uuu精品一区二区三区四区在线| 亚洲激情图片一区| 国产69精品久久久久777| 欧美一二三区精品| 亚洲电影激情视频网站| 色综合久久久久综合体桃花网| 久久精品一区二区三区不卡牛牛| 五月天中文字幕一区二区| 91女人视频在线观看| 国产日韩欧美综合在线| 免费人成网站在线观看欧美高清| 91香蕉国产在线观看软件| 久久精品水蜜桃av综合天堂| 青草国产精品久久久久久| 在线区一区二视频| 国产精品视频yy9299一区| 国产一区在线视频| 精品免费视频.| 香港成人在线视频| 欧美中文一区二区三区| 亚洲精品国产a| 色欧美乱欧美15图片| 亚洲三级在线看| 成人污污视频在线观看| 国产精品午夜春色av| 成人精品免费视频| 中文字幕 久热精品 视频在线| 国产福利视频一区二区三区| 久久久久国产精品麻豆ai换脸 | 日韩高清在线观看| 91精品一区二区三区久久久久久|