forked from yhzhang0128/egos-2000
-
Notifications
You must be signed in to change notification settings - Fork 0
/
proc_utils.c
68 lines (55 loc) · 1.39 KB
/
proc_utils.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
* (C) 2022, Cornell University
* All rights reserved.
*/
/* Author: Yunhao Zhang
* Description: process util functions
*/
#include "egos.h"
#include "grass.h"
#include <string.h>
static int proc_nprocs;
extern int proc_curr_idx;
extern struct process proc_set[MAX_NPROCESS];
void intr_entry(int id);
void proc_init() {
earth->intr_register(intr_entry);
proc_nprocs = 0;
memset(proc_set, 0, sizeof(struct process) * MAX_NPROCESS);
/* the first process is now running */
proc_alloc();
proc_curr_idx = 0;
proc_set_running(PID(proc_curr_idx));
}
int proc_alloc() {
proc_nprocs++;
for (int i = 0; i < MAX_NPROCESS; i++) {
if (proc_set[i].pid == 0) {
proc_set[i].pid = proc_nprocs;
proc_set[i].status = PROC_UNUSED;
return proc_nprocs;
}
}
FATAL("Reach the limit of %d processes", MAX_NPROCESS);
return -1;
}
void proc_free(int pid) {
FATAL("proc_free not implemented");
}
static void proc_set_status(int pid, int status) {
for (int i = 0; i < MAX_NPROCESS; i++) {
if (proc_set[i].pid == pid) {
proc_set[i].status = status;
return;
}
}
}
void proc_set_ready(int pid) {
proc_set_status(pid, PROC_READY);
}
void proc_set_running(int pid) {
proc_set_status(pid, PROC_RUNNING);
}
void proc_set_runnable(int pid) {
proc_set_status(pid, PROC_RUNNABLE);
}