Files
net/exec/task.h
2025-12-20 18:49:21 -08:00

58 lines
1.4 KiB
C

#pragma once
#include <stddef.h>
#include <stdint.h>
#include <stdatomic.h>
#include <exec/list.h>
#define SIGNAL_MAX 32
#define SIGNAL_MY_BASE 4
#if SIGNAL_MAX > 32
#define SIGNAL_ONE 1ULL
typedef uint64_t Signals;
#elif SIGNAL_MAX > 16
#define SIGNAL_ONE 1UL
typedef uint32_t Signals;
#elif SIGNAL_MAX > 8
#define SIGNAL_ONE 1U
typedef uint16_t Signals;
#else
#define SIGNAL_ONE 1
typedef uint8_t Signals;
#endif
#define SIGNAL(n) (SIGNAL_ONE << (n))
#define MY_SIGNAL(n) (SIGNAL_ONE << (SIGNAL_MY_BASE+n))
#define SIGNAL_SET(s,n) ((s) | SIGNAL(n))
#define SIGNAL_RESET(s,n) ((s) & ~SIGNAL(n))
#define SIGNAL_TEST(s,n) ((s) & SIGNAL(n))
extern int execTicks;
struct Task {
struct Node node;
uintptr_t sp;
Signals sig_alloc;
Signals sig_wait;
Signals sig_received;
Signals sig_except;
atomic_int *blocked_address;
int blocked_value;
uint32_t forbids;
};
void TasksInit(void);
void AddTask(struct Task *task, uintptr_t initial_pc, uintptr_t final_pc);
struct Task *CreateTask(char *name, int8_t pri, uintptr_t initial_pc, size_t stack_size);
struct Task *ThisTask(void);
void Block(struct Task *task, atomic_int *address, int value);
void Yield(void);
void Delay(int ticks);
void InterruptsSaveAndDisable(void);
void InterruptsRestore(void);
int Forbid();
int Permit();
uint8_t AllocSignal(uint8_t hint);
void FreeSignal(uint8_t signal);
void Signal(struct Task *task, Signals signals);
Signals Wait(Signals signals);