mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| /* Copyright © 2011 Lukas Martini
 | |
|  *
 | |
|  * This file is part of Xelix.
 | |
|  *
 | |
|  * Xelix is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation, either version 3 of the License, or
 | |
|  * (at your option) any later version.
 | |
|  *
 | |
|  * Xelix is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with Xelix. If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| #include <lib/generic.h>
 | |
| #include <hw/cpu.h>
 | |
| #include <memory/vmem.h>
 | |
| 
 | |
| #define SCHEDULER_MAXNAME 256
 | |
| #define SCHEDULER_TASK_PATH_MAX 256
 | |
| 
 | |
| // Single linked list
 | |
| typedef struct task {
 | |
| 	uint32_t pid;
 | |
| 	char name[SCHEDULER_MAXNAME];
 | |
| 	struct task *parent;
 | |
| 	cpu_state_t* state;
 | |
| 	struct task* next;
 | |
| 	struct task* previous;
 | |
| 
 | |
| 	void* stack;
 | |
| 	void* entry;
 | |
| 	struct vmem_context *memory_context;
 | |
| 
 | |
| 	// Current task state
 | |
| 	enum {
 | |
| 		TASK_STATE_KILLED,
 | |
| 		TASK_STATE_TERMINATED,
 | |
| 		TASK_STATE_BLOCKING,
 | |
| 		TASK_STATE_STOPPED,
 | |
| 		TASK_STATE_RUNNING
 | |
| 	} task_state;
 | |
| 
 | |
| 	char** environ;
 | |
| 	char** argv;
 | |
| 	int argc;
 | |
| 
 | |
| 	// TODO Is this actually the same as PATH_MAX in our toolchain?
 | |
| 	char cwd[SCHEDULER_TASK_PATH_MAX + 1];
 | |
| } task_t;
 | |
| 
 | |
| int scheduler_state;
 | |
| 
 | |
| task_t* scheduler_new(void* entry, task_t* parent, char name[SCHEDULER_MAXNAME],
 | |
| 	char** environ, char** argv, int argc, struct vmem_context* memory_context, bool map_structs);
 | |
| void scheduler_add(task_t *task);
 | |
| void scheduler_terminate_current();
 | |
| task_t* scheduler_get_current();
 | |
| task_t* scheduler_select(cpu_state_t* lastRegs);
 | |
| void scheduler_init();
 | |
| void scheduler_yield();
 | |
| void scheduler_remove(task_t *t);
 | |
| task_t* scheduler_fork(task_t* to_fork, cpu_state_t* state); |