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

📄 task.hpp

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

   TASK.HPP - Type and Class definitions and global routine prototypes.

   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
*/


#include "tskconf.hpp"
#include <stdio.h>
#include <dos.h>

#define _Near
#define TURBO  1
#define MSC    0

#define local static      // Comment out the "static" for debugging

typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long dword;
typedef void (cdecl far *funcptr)();
typedef void far *farptr;
typedef byte far *byteptr;
typedef word far *wordptr;

#define TTIMEOUT ((farptr) -1L)
#define TWAKE    ((farptr) -2L)

// Task states

#define  ST_KILLED   0
#define  ST_STOPPED  1
#define  ST_DELAYED  2
#define  ST_WAITING  3
#define  ST_ELIGIBLE 4
#define  ST_RUNNING  5

// Task flags

#define  F_TEMP   0x80     // Task is temporary, free on kill
#define  F_STTEMP 0x40     // Task stack is temporary, free on kill
#define  F_CRIT   0x01     // Task is critical, may not be preempted

#define  FL_SYSM  0xf0     // Mask for system flags
#define  FL_USRM  0x0f     // Mask for user flags

// Timer queue element states

#define  TSTAT_REMOVE      -1    // Remove element from queue
#define  TSTAT_IDLE        0     // Not in queue
#define  TSTAT_COUNTDOWN   1     // Count down timeout, then remove
#define  TSTAT_REPEAT      2     // Count down, reload when done

// Timer queue element control structure pointer kinds

#define  TKIND_NULL        0     // NULL timer, used for deleted task
#define  TKIND_TASK        1     // tcbptr, Wakeup associated task
#define  TKIND_WAKE        2     // tcbptr, but not same task
#define  TKIND_PROC        3     // call function
#define  TKIND_FLAG        4     // flagptr, set flag
#define  TKIND_COUNTER     5     // counterptr, increment counter

#define  TKIND_TEMP        0x80  // Hi bit set means temporary element

extern "C" {
   void asm_schedule(void);
   void asm_c_schedule(void);
   int tsk_dis_int(void);
   void tsk_ena_int(int);
   void tsk_nop(void);
}

class task;    // forward reference
typedef task far *tcbptr;

typedef tcbptr far *tqueptr;

class timer; // forward reference
typedef timer far *tlinkptr;

class timer {
   tlinkptr next;
   dword    timeout;    // Timeout counter
   dword    reload;     // Timeout counter reload value
   farptr   strucp;     // Pointer to control structure
   byte     tstate;     // Element state
   byte     tkind;      // Kind of control structure
   void     tsk_timer_action (void);
   friend   local void far timer_main (void);
   friend   task;
public:
   timer(dword tout, farptr strucp, byte kind, byte rept);
   ~timer(void);
   void change_timer(dword tout, byte rept);
};

class tasker_class {
public:
   tasker_class(byte varpri, int speedup);
   ~tasker_class(void);
   void preempt_on(void);
   void preempt_off(void);
   void far schedule(void);
   void far c_schedule(void); 
   void tsk_dis_preempt(void);
   void tsk_ena_preempt(void);
};

class task {
// private data members
   tcbptr   next;       // Next in queue
   tqueptr  queue;      // Queue head pointer
   byteptr  stack;      // Task stack
   byteptr  stkbot;     // Task stack bottom
   word     prior;      // Task priority
   word     initprior;  // Initial Task priority
   byte     state;      // Task state
   byte     flags;      // Task flags
   timer   *timerq;     // Timer queue link
   farptr   retptr;     // Event return pointer
   int      retsize;    // Return buffer size for pipes
// private member functions
   friend int  far t_delay(dword ticks);
   friend void far tsk_wait (tqueptr que, dword timeout);
   friend void     killretn(void);
   friend void far tsk_kill_queue(tqueptr que);
   void            tsk_kill(void);
   void            tsk_wakeup(void);
public:
   task(funcptr func, byteptr stack, word stksz,
        word priority, farptr arg);
   ~task(void);
   void* operator new(size_t size);
   int start_task(void);
   int wake_task(void);
   void tsk_enqueue(tqueptr que);
   void tsk_unqueue(void);
   void tsk_enqtimer(dword tout);
   void tsk_unqtimer(void);
   tcbptr tsk_runable(void);

   void set_priority(word newprior);
   word get_priority(void);
   void set_state(byte newstate) { state = newstate; }
   byte get_state(void) { return state; }
   void set_user_flags(byte newflags);
   void set_system_flags(byte newflags);
   byte get_flags(void) { return flags; }
   void set_retptr(farptr newptr) { retptr = newptr; }
   farptr get_retptr(void) { return retptr; }
   void set_retsize(int newsize) { retsize = newsize; }
   int get_retsize(void) { return retsize; }
   tcbptr get_next(void) { return next; }
};

class resource {
   tcbptr  waiting;   // queue for tasks waiting for resource
   tcbptr   owner;    // current owner of the resource
   int      state;    // resource state
   byte     flags;    // resource flags
public:
   resource();
   ~resource(void);
   void release_resource(void);
   int request_resource(dword timeout);
   int c_request_resource(void);
   int check_resource(void);
   int get_state(void) { return state; }
   byte get_flags(void) { return flags; }
};

typedef resource far *resourceptr;

class flag {
   tcbptr   wait_set;     // queue for tasks waiting for flag to be set
   tcbptr   wait_clear;   // queue for tasks waiting for flag to be cleared
   int      state;        // flag state
   byte     flags;        // flag flags
public:
   flag();
   ~flag(void);
   void set_flag(void);
   void clear_flag(void);
   int wait_flag_set(dword timeout);
   int wait_flag_clear(dword timeout);
   int clear_flag_wait_set(dword timeout);
   int check_flag(void);
};

typedef flag far *flagptr;

class counter {
   tcbptr   wait_set;    // queue for tasks waiting for counter to be set
   tcbptr   wait_clear;  // queue for tasks waiting for counter to be cleared
   dword    state;       // counter state
   byte     flags;       // counter flags
public:
   counter();
   ~counter(void);
   void set_flag(void);
   void clear_counter(void);
   int wait_counter_set(dword timeout);
   int wait_counter_clear(dword timeout);
   void inc_counter(void);
   dword check_counter(void);
};

typedef counter far *counterptr;

struct msg_header {
   struct msg_header far *next;
};

typedef struct msg_header far *msgptr;

class mailbox {
   tcbptr   waiting;     // queue for tasks waiting for mail
   msgptr   mail_first;  // pointer to first message in mailbox
   msgptr   mail_last;   // pointer to last message in mailbox
   byte     flags;       // mailbox flags
public:
   mailbox();
   ~mailbox(void);
   void send_mail(farptr msg);
   farptr wait_mail(dword timeout);
   farptr c_wait_mail(void);
   int check_mailbox(void);
};

typedef mailbox far *mailboxptr;

class pipe {
   tcbptr    wait_read;    // queue for tasks blocked on read
   tcbptr    wait_write;   // queue for tasks blocked on write
   tcbptr    wait_clear;   // queue for tasks waiting for pipe to be clear
   word      bufsize;      // size of pipe buffer
   word      filled;       // number of bytes in the pipe
   word      inptr;        // head pointer for circular buffer
   word      outptr;       // tail pointer for circular buffer
   byteptr   contents;     // pointer to pipe contents
   byte      flags;        // pipe flags

// private member functions
   byte      tsk_getcpipe ();
   void      tsk_putcpipe (byte c);
public:
   pipe(farptr buf, word buffersize);
   ~pipe(void);
   int read_pipe(dword timeout);
   int c_read_pipe(void);
   int write_pipe(byte ch, dword timeout);
   int c_write_pipe(byte ch);
   int wait_pipe_empty(dword timeout);
   int check_pipe(void);
   word pipe_free(void);
   void flush_pipe(void);
   word get_bufsize(void) { return bufsize; }
   word get_filled(void) { return filled; }
   byte get_flags(void) { return flags; }
};

typedef pipe far *pipeptr;

class wpipe {
   tcbptr    wait_read;    // queue for tasks blocked on read
   tcbptr    wait_write;   // queue for tasks blocked on write
   tcbptr    wait_clear;   // queue for tasks waiting for pipe to be clear
   word      bufsize;      // size of pipe buffer
   word      filled;       // number of words in the pipe
   word      inptr;        // head pointer for circular buffer
   word      outptr;       // tail pointer for circular buffer
   wordptr   wcontents;    // pointer to pipe contents
   byte      flags;        // pipe flags

// private member functions
   word      tsk_getwpipe ();
   void      tsk_putwpipe (word c);
public:
   wpipe(farptr buf, word buffersize);
   ~wpipe(void);
   word read_wpipe(dword timeout);
   word c_read_wpipe(void);
   int write_wpipe(word ch, dword timeout);
   int c_write_wpipe(word ch);
   int wait_wpipe_empty(dword timeout);
   word check_wpipe(void);
   word wpipe_free(void);
   void flush_wpipe(void);
   word get_bufsize(void) { return bufsize; }
   word get_filled(void) { return filled; }
   byte get_flags(void) { return flags; }
};

typedef wpipe far *wpipeptr;

class buffer {
   resource    buf_write;  // write buffer resource
   resource    buf_read;   // read buffer resource
   wpipe       pip;        // pipe used to implement buffer
   word        msgcnt;     // number of messages in buffer
   byte        flags;      // buffer flags

// private member function
   int         tsk_wrbuf (word w, dword timeout);
public:
   buffer(farptr buf, word bufsize);
   ~buffer(void);
   int read_buffer(farptr msg, int size, dword timeout);
   int c_read_buffer(farptr msg, int size);
   int write_buffer(farptr msg, int size, dword timeout);
   int c_write_buffer(farptr msg, int size);
   word check_buffer(void);
};

typedef buffer far *bufferptr;

// create definitions for critical code section handling

#define CRITICAL  int crit_intsav
#define C_ENTER   crit_intsav = tsk_dis_int()
#define C_LEAVE   tsk_ena_int (crit_intsav)


extern void far tsk_kill_queue(tqueptr);

extern farptr tsk_alloc (word size);
extern void tsk_free (farptr item);
extern resource alloc_resource;

// provide "C" linkage for routines to be called from assemply language

extern "C" void far asm_remove_tasker(void);
extern "C" void far asm_inc_counter(counterptr cnt);
extern "C" void far asm_set_flag(flagptr flg);
extern "C" void far asm_clear_flag(flagptr flg);
extern "C" int far asm_wait_flag_clear(flagptr flg, dword timeout);
extern "C" int far asm_request_resource(resourceptr rsc, dword timeout);
extern "C" void far asm_release_resource(resourceptr rsc);
extern "C" word far asm_read_wpipe(wpipeptr pip, dword timeout);
extern "C" word far asm_check_wpipe(wpipeptr pip);
extern "C" int far asm_c_write_wpipe(wpipeptr pip, word ch);

extern task main_tcb;
extern tasker_class tasker;

inline void tsk_cli(void) { disable(); }
inline void tsk_sti(void) { enable(); }
inline void tsk_outp(int port, byte b) { outportb(port, b); }
inline byte tsk_inp(int port) { return ((byte) inportb(port)); }

⌨️ 快捷键说明

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