Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/proc/thread.h

    r06f81c4 rd23712e  
    9595        waitq_t join_wq;
    9696
    97         /** Lock protecting thread structure.
     97        /** Thread accounting. */
     98        atomic_time_stat_t ucycles;
     99        atomic_time_stat_t kcycles;
     100
     101        /** Architecture-specific data. */
     102        thread_arch_t arch;
     103
     104#ifdef CONFIG_UDEBUG
     105        /**
     106         * If true, the scheduler will print a stack trace
     107         * to the kernel console upon scheduling this thread.
     108         */
     109        atomic_int_fast8_t btrace;
     110
     111        /** Debugging stuff */
     112        udebug_thread_t udebug;
     113#endif /* CONFIG_UDEBUG */
     114
     115        /*
     116         * Immutable fields.
    98117         *
    99          * Protects the whole thread structure except fields listed above.
    100          */
    101         IRQ_SPINLOCK_DECLARE(lock);
    102 
    103         char name[THREAD_NAME_BUFLEN];
     118         * These fields are only modified during initialization, and are not
     119         * changed at any time between initialization and destruction.
     120         * Can be accessed without synchronization in most places.
     121         */
     122
     123        /** Thread ID. */
     124        thread_id_t tid;
    104125
    105126        /** Function implementing the thread. */
     
    108129        void *thread_arg;
    109130
     131        char name[THREAD_NAME_BUFLEN];
     132
     133        /** Thread is executed in user space. */
     134        bool uspace;
     135
     136        /** Thread doesn't affect accumulated accounting. */
     137        bool uncounted;
     138
     139        /** Containing task. */
     140        task_t *task;
     141
     142        /** Thread's kernel stack. */
     143        uint8_t *kstack;
     144
     145        /*
     146         * Local fields.
     147         *
     148         * These fields can be safely accessed from code that _controls execution_
     149         * of this thread. Code controls execution of a thread if either:
     150         *  - it runs in the context of said thread AND interrupts are disabled
     151         *    (interrupts can and will access these fields)
     152         *  - the thread is not running, and the code accessing it can legally
     153         *    add/remove the thread to/from a runqueue, i.e., either:
     154         *    - it is allowed to enqueue thread in a new runqueue
     155         *    - it holds the lock to the runqueue containing the thread
     156         *
     157         */
     158
    110159        /**
    111160         * From here, the stored context is restored
     
    113162         */
    114163        context_t saved_context;
    115         ipl_t saved_ipl;
     164
     165        // TODO: we only need one of the two bools below
    116166
    117167        /**
     
    127177        bool in_copy_to_uspace;
    128178
     179        /*
     180         * FPU context is a special case. If lazy FPU switching is disabled,
     181         * it acts as a regular local field. However, if lazy switching is enabled,
     182         * the context is synchronized via CPU->fpu_lock
     183         */
    129184#ifdef CONFIG_FPU
    130185        fpu_context_t fpu_context;
     
    135190        unsigned int nomigrate;
    136191
    137         /** Thread state. */
    138         state_t state;
    139 
    140         /** Thread CPU. */
    141         cpu_t *cpu;
    142         /** Containing task. */
    143         task_t *task;
    144192        /** Thread was migrated to another CPU and has not run yet. */
    145193        bool stolen;
    146         /** Thread is executed in user space. */
    147         bool uspace;
    148 
    149         /** Thread accounting. */
    150         uint64_t ucycles;
    151         uint64_t kcycles;
     194
     195        /**
     196         * Thread state (state_t).
     197         * This is atomic because we read it via some commands for debug output,
     198         * otherwise it could just be a regular local.
     199         */
     200        atomic_int_fast32_t state;
     201
     202        /** Thread CPU. */
     203        _Atomic(cpu_t *) cpu;
     204
     205        /** Thread's priority. Implemented as index to CPU->rq */
     206        atomic_int_fast32_t priority;
     207
    152208        /** Last sampled cycle. */
    153209        uint64_t last_cycle;
    154         /** Thread doesn't affect accumulated accounting. */
    155         bool uncounted;
    156 
    157         /** Thread's priority. Implemented as index to CPU->rq */
    158         int priority;
    159         /** Thread ID. */
    160         thread_id_t tid;
    161 
    162         /** Architecture-specific data. */
    163         thread_arch_t arch;
    164 
    165         /** Thread's kernel stack. */
    166         uint8_t *kstack;
    167 
    168 #ifdef CONFIG_UDEBUG
    169         /**
    170          * If true, the scheduler will print a stack trace
    171          * to the kernel console upon scheduling this thread.
    172          */
    173         bool btrace;
    174 
    175         /** Debugging stuff */
    176         udebug_thread_t udebug;
    177 #endif /* CONFIG_UDEBUG */
    178210} thread_t;
    179211
     
    186218extern void thread_wire(thread_t *, cpu_t *);
    187219extern void thread_attach(thread_t *, task_t *);
    188 extern void thread_ready(thread_t *);
     220extern void thread_start(thread_t *);
     221extern void thread_requeue_sleeping(thread_t *);
    189222extern void thread_exit(void) __attribute__((noreturn));
    190223extern void thread_interrupt(thread_t *);
     224
     225enum sleep_state {
     226        SLEEP_INITIAL,
     227        SLEEP_ASLEEP,
     228        SLEEP_WOKE,
     229};
    191230
    192231typedef enum {
     
    237276extern errno_t thread_join(thread_t *);
    238277extern errno_t thread_join_timeout(thread_t *, uint32_t, unsigned int);
     278extern void thread_detach(thread_t *);
     279
     280extern void thread_yield(void);
    239281
    240282extern void thread_print_list(bool);
Note: See TracChangeset for help on using the changeset viewer.