-
Notifications
You must be signed in to change notification settings - Fork 0
/
stacks.c
106 lines (76 loc) · 1.6 KB
/
stacks.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
** SCCS ID: @(#)stacks.c 1.1 04/04/08
**
** File: stack.c
**
** Author: 4003-506 class of 20073
**
** Contributor:
**
** Description: stack-related routines
*/
#define __KERNEL__20073__
#include "headers.h"
#include "stacks.h"
#include "queues.h"
/*
** PRIVATE GLOBAL VARIABLES
*/
static Stack g_stacks[N_PROCESSES]; // all available user stacks
static Stack g_system_stack; // system stack
/*
** PUBLIC GLOBAL VARIABLES
*/
unsigned int *g_system_esp;
/*
** PUBLIC FUNCTIONS
*/
/*
** _get_stack()
**
** allocate a Stack structure
**
** returns a pointer to the structure, or NULL
*/
Stack *_get_stack( void ) {
Stack *stack;
if( _deque(&g_free_stacks,(void **)&stack) != ERR_NONE ) {
return( 0 );
}
_memclr( (void *) stack, sizeof(Stack) );
return( stack );
}
/*
** _free_stack()
**
** deallocate a Stack structure
**
** returns the status from the _enque() call, or ERR_NULLPTR
*/
Status _free_stack( Stack *stack ) {
if( stack != 0 ) {
return( _enque(&g_free_stacks,(void *)stack,T_STACK) );
}
return( ERR_NULLPTR );
}
/*
** _init_stacks()
**
** initialize all stack-related data structures
*/
void _init_stacks( void ) {
int i;
// first, put all stacks into the free pool
//
// NOTE: queues must have been initialized first!
for( i = 0; i < N_PROCESSES; ++i ) {
if( _free_stack(&g_stacks[i]) != ERR_NONE ) {
_kpanic( "init stacks: enqueue failed" );
}
}
// set up the system stack
_memclr( (void *)&g_system_stack, sizeof(Stack) );
g_system_esp = ((unsigned int *)(&g_system_stack + 1)) - 2;
// announce that we have initialized the stack module
c_puts( " stacks" );
}