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

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

?? tsktask.c

?? 一個多任務操作系統CTask的源代碼 用C語言編寫
?? C
字號:
/*
   --- Version 2.2 93-03-04 15:27 ---

   TSKTASK.C - CTask - Task creation and deletion.

   CTask - a Multitasking Kernel for C

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

   No rights reserved.

   This file is new with version 2.1.
   Version 2.1 separates the functions previously collected in tskmain.c into
         tskmain.c - Front ends for installation/removal
         tskinst.c - Install/Remove main kernel
         tskgrp.c  - Create/remove groups
         tsktask.c - Task creation and deletion
         tsktutl.c - Task utilities (get/set priority etc.)
         tskutil.c - General utilities (preemption, t_delay)
*/

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

#if (DOS)
extern void Localfunc tsk_get_dosswap (tcbptr task);
#endif

/*
   tsk_use_ndp is initialized by install_tasker, and may be changed
   to 0 by the user to enable or disable ndp handling for tasks
   being created.

   Note that setting tsk_use_ndp to 1 will have no effect if 
   install_tasker has determined that there is no NDP present, or
   if the NDP configuration flag is FALSE.
*/

int tsk_use_ndp = 0;


#pragma check_stack(off)

/*
   tsk_kill
      mark task as killed.

      CAUTION: Critical section assumed entered.
*/

local void Staticfunc tsk_kill (tcbptr task, int currtask)
{
   /*
      Note: The following test shouldn't be necessary. However,
      if ever an interrupt handler should cause the current task to
      be killed 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, and the task is the current
      task, we have to stop everything.
      The test is ommitted when we're not running under DOS.
   */

#if (DOS)
   if (currtask && GLOBDATA in_sched)
      tsk_fatal ("Kill while in Scheduler");
#endif

   task->state = ST_KILLED;
   task->qhead = LNULL;
   tsk_deqtimer (&task->timerq.link);

#if (TSK_NAMED)
   tsk_dequeue ((queptr)&task->name.list);
#endif

#if (TSK_DYNAMIC)
   if (!currtask)
      {
      if (task->flags & F_STTEMP)
         tsk_pfree (task->stkbot);   /* Bug fixed in 2.1, was 'task->stack' */
      if (task->flags & F_TEMP)
         tsk_pfree (task);
      }
   else if (task->flags & (F_STTEMP | F_TEMP))
      {
      task->qhead = &GLOBDATA kill_queue;
      if (GLOBDATA kill_task->state == ST_STOPPED)
         tsk_runable (GLOBDATA kill_task);
      }
#endif

   if (currtask)
      schedule ();
}

/*
   Killretn kills the current active task. It is used internally, but
   can also be called from outside. (However, *never* call it from an 
   interrupt handler!)
*/

void Taskfunc killretn (void)
{
   tsk_cli ();
   tsk_kill (GLOBDATA current_task, 1);
}


/*
   tsk_kill_queue
      Removes all tasks from a queue, and marks queue invalid. 
      For internal use only.

      CAUTION: Critical section assumed entered.
*/

void Localfunc tsk_kill_queue (queheadptr que)
{
   queptr curr, next;

   CHECK_QHEAD (que, "Task Kill Queue");

   for (curr = que->first; !(curr->kind & Q_HEAD); )
      {
      next = curr->next;
      tsk_kill ((tcbptr)curr, 0);
      curr = next;
      }
   tsk_init_qhead (que, 0xff);
}


/* ---------------------------------------------------------------------- */

/*
   create_task
      Initialises a tcb. The task is in stopped state initially.
*/

tcbptr Globalfunc create_task (tcbptr task,
                               funcptr func,
                               byteptr stack,
                               word stksz,
                               word prior,
                               farptr arg
                               TN(byteptr name)
                               )

{
   struct task_stack far *stk;
#if (CHECKING)
   word i;
#endif

#if (TSK_DYNAMIC)
   if (task == LNULL)
      {
      if ((task = (tcbptr) tsk_palloc (sizeof(tcb))) == LNULL)
         return LNULL;
      task->flags = F_TEMP;
      }
   else
      task->flags = 0;

   if (stack == LNULL)
      {
      if ((stack = (byteptr) tsk_palloc (stksz)) == LNULL)
         {
         if (task->flags & F_TEMP)
            tsk_pfree (task);
         return LNULL;
         }
      task->flags |= F_STTEMP;
      }
#else
   task->flags = 0;
#endif

   stk = (struct task_stack far *)(stack + stksz - sizeof (struct task_stack));
   stk->r_ds = task->t_es = tsk_dseg ();
   stk->r_flags = tsk_flags ();
   stk->retn = func;
   stk->dummyret = killretn;
   stk->arg = arg;
   task->t_bp = 0;

   task->stkbot = stack;
#if (CHECKING)
   for (i = 0; i < stksz - sizeof (struct task_stack); i++)
      *stack++ = (byte)i;
#endif
   task->stack = (byteptr) stk;
   task->cqueue.kind = TYP_TCB;
   task->cqueue.next = LNULL;
   task->qhead = LNULL;
   task->state = ST_STOPPED;
   task->cqueue.el.pri.prior = task->cqueue.el.pri.ini_prior = prior;
   task->timerq.link.el.ticks = task->timerq.elem.time.reload = 0L;
   task->timerq.link.kind = TYP_TIMER;
   task->timerq.link.next = LNULL;
   task->timerq.strucp = (farptr) task;
   task->timerq.struckind = TKIND_WAKE;
   task->timerq.flags = 0;
   task->save_func = task->rest_func = LNULL;
#if (DOS)
   task->sched_ent_func = LNULL;
#endif
   task->user_ptr = LNULL;

#if (GROUPS)
   task->group = task->homegroup = GLOBDATA current_task->group;
#endif
#if (DOS)
   task->indos = 0;
   task->t_new = 1;
   task->base_psp = task->group->create_psp;
   tsk_get_dosswap (task);
#endif

#if (TSK_NAMED)
   tsk_add_name (&task->name, name, TYP_TCB, task);
#endif

#if (EMS)
   if (GLOBDATA ems_savetsk != LNULL)
      GLOBDATA ems_savetsk (task);
#endif

#if (NDP)
   if (tsk_use_ndp && GLOBDATA ndp_present)
      task->flags |= F_USES_NDP;
#endif

   return task;
}


/*
   kill_task
      Removes a task from the system.
*/

void Globalfunc kill_task (tcbptr task)
{
   CRITICAL;

   CHECK_TCBPTR (task, "Kill Task");

   C_ENTER;
   if (task != GLOBDATA current_task)
      {
      if (task->state == ST_KILLED)
         return;
      else
         tsk_dequeue (&task->cqueue);

      tsk_kill (task, 0);
      }
   else
      tsk_kill (task, 1);

   C_LEAVE;
}


/*
   start_task
      Starts a stopped task. Returns -1 if the task was not stopped.
*/

int Globalfunc start_task (tcbptr task)
{
   CRITICAL;

   if (task == LNULL)
#if (GROUPS)
      task = GLOBDATA current_task->group->main_ptr;
#else
      task = GLOBDATA main_ptr;
#endif

   CHECK_TCBPTR (task, "Start Task");

   if (task->state == ST_STOPPED)
      {
      task->state = ST_ELIGIBLE;
      C_ENTER;
      tsk_runable (task);
      C_LEAVE;
      return 0;
      }
   return -1;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品少妇一区二区三区在线视频| 欧美网站大全在线观看| 亚洲成人资源网| ●精品国产综合乱码久久久久| 2021中文字幕一区亚洲| 日韩一区二区三区视频在线| 在线播放中文一区| 欧美一区二区二区| 欧美成人女星排名| 久久亚洲一区二区三区明星换脸| 久久综合国产精品| 国产丝袜欧美中文另类| 国产欧美日韩在线| 国产日韩欧美激情| 亚洲欧洲www| 一区二区视频免费在线观看| 亚洲一区自拍偷拍| 日韩电影免费在线观看网站| 日韩精彩视频在线观看| 久久成人免费电影| 不卡影院免费观看| 色综合天天综合色综合av| 日本高清成人免费播放| 欧美色成人综合| 欧美不卡视频一区| 国产网站一区二区三区| 一区二区三区在线播| 日本女人一区二区三区| 国产精品白丝jk黑袜喷水| 91麻豆国产在线观看| 欧美精品乱码久久久久久按摩| 精品福利视频一区二区三区| 国产精品美女久久久久久久久 | 黄一区二区三区| 国产成人av一区二区三区在线| 97久久超碰国产精品电影| 在线观看日产精品| 精品va天堂亚洲国产| 亚洲色图欧洲色图| 精品一区二区三区不卡 | 欧美一区二区三区免费在线看 | av动漫一区二区| 欧美精品粉嫩高潮一区二区| 久久精品人人做人人综合| 亚洲精品国产a久久久久久| 精品一区二区国语对白| 972aa.com艺术欧美| 欧美videofree性高清杂交| 亚洲欧洲日韩一区二区三区| 日韩成人一级片| 色呦呦一区二区三区| 久久免费国产精品| 图片区小说区国产精品视频| 99国产精品一区| 久久综合久久久久88| 日韩—二三区免费观看av| 在线观看不卡视频| 久久综合一区二区| 五月激情综合色| 精品污污网站免费看| 国产精品灌醉下药二区| 国产综合成人久久大片91| 欧洲国产伦久久久久久久| 欧美国产日韩在线观看| 国产激情精品久久久第一区二区 | 精品中文字幕一区二区| 欧美性三三影院| 夜夜嗨av一区二区三区网页| www.成人网.com| 欧美激情一区二区三区蜜桃视频| 六月丁香婷婷色狠狠久久| 欧美色图12p| 亚洲成人av免费| 精品视频一区三区九区| 亚洲a一区二区| 欧美日韩在线不卡| 亚洲午夜电影在线| 欧美日韩国产一级| 婷婷成人综合网| 欧美日韩国产美| 五月天久久比比资源色| 欧美精品久久99| 美女一区二区三区| 精品盗摄一区二区三区| 精品一区二区精品| 欧美经典一区二区| 99re亚洲国产精品| 亚洲国产日韩一级| 日韩欧美一级片| 国产麻豆午夜三级精品| 国产精品美女久久久久av爽李琼| 91欧美一区二区| 午夜精品久久久久久| 日韩一区二区三区高清免费看看| 日本aⅴ免费视频一区二区三区| 欧美xxxx老人做受| 成人午夜免费av| 亚洲第一综合色| 精品国产123| 色婷婷久久久综合中文字幕| 亚洲网友自拍偷拍| 日韩精品自拍偷拍| 国产成人在线网站| 亚洲成av人在线观看| 久久综合中文字幕| 97se亚洲国产综合自在线| 亚洲成人第一页| 久久久国产精品午夜一区ai换脸| youjizz久久| 午夜精品免费在线观看| 久久这里只有精品首页| 日本黄色一区二区| 久久国产剧场电影| 一区二区三区在线免费| 精品三级在线看| 日本韩国视频一区二区| 国产一区二区三区四区五区入口| 中文字幕亚洲一区二区av在线| 欧美精品自拍偷拍| 成人黄色在线看| 蜜桃av一区二区三区电影| 18成人在线观看| 亚洲综合图片区| 日韩精品最新网址| 91官网在线观看| 国产一区不卡在线| 日本强好片久久久久久aaa| 亚洲人吸女人奶水| 久久免费视频一区| 91精品久久久久久久久99蜜臂| 成人99免费视频| 国产精品66部| 日韩国产高清影视| 亚洲精品乱码久久久久久黑人| 国产亚洲一区二区三区| 欧美一区二区三区系列电影| 日本高清视频一区二区| 91一区二区三区在线观看| 国产一区二区久久| 捆绑紧缚一区二区三区视频| 午夜精品一区二区三区电影天堂| 亚洲免费三区一区二区| 国产精品欧美一级免费| 久久久国产午夜精品| 2020国产成人综合网| 日韩午夜电影在线观看| 91精品欧美久久久久久动漫| 精品1区2区3区| 欧美网站大全在线观看| 欧美中文字幕亚洲一区二区va在线| 成人av网站免费| 成人国产免费视频| caoporen国产精品视频| 成人精品视频.| 99免费精品在线观看| 国产99久久久精品| 成年人国产精品| 色噜噜狠狠色综合欧洲selulu| 99精品久久99久久久久| 91浏览器打开| 欧美日韩在线一区二区| 91麻豆精品国产自产在线观看一区 | 欧美日韩一区二区在线观看| 91免费观看在线| 欧美日韩在线一区二区| 69久久99精品久久久久婷婷| 日韩欧美国产高清| 精品国产一区二区亚洲人成毛片| 精品对白一区国产伦| 中文字幕乱码日本亚洲一区二区| 国产亚洲一区字幕| 亚洲三级在线观看| 亚洲国产wwwccc36天堂| 麻豆精品蜜桃视频网站| 激情五月婷婷综合网| 成人性生交大片免费| 欧美午夜电影网| 欧美精品一区二区久久久| 国产精品久久久久精k8| 亚洲网友自拍偷拍| 久久99精品国产麻豆婷婷洗澡| 国产成人av一区二区三区在线| 91久久精品日日躁夜夜躁欧美| 在线电影院国产精品| 日本一区二区久久| 亚洲图片欧美视频| 精油按摩中文字幕久久| 成人激情动漫在线观看| 欧美高清视频在线高清观看mv色露露十八 | 欧美精三区欧美精三区 | 不卡一二三区首页| 欧美人牲a欧美精品| 久久精品水蜜桃av综合天堂| 亚洲欧美日韩国产成人精品影院 | 国产一区二区剧情av在线| 色悠悠亚洲一区二区| 精品国产免费一区二区三区香蕉| 日本一区二区久久| 久久黄色级2电影| 91一区二区在线观看|