@@ -12,61 +12,78 @@ rust_kernel::rust_kernel(rust_srv *srv) :
12
12
13
13
rust_handle<rust_dom> *
14
14
rust_kernel::create_domain (const rust_crate *crate, const char *name) {
15
+ LOCK (_kernel_lock);
15
16
rust_message_queue *message_queue =
16
17
new (this ) rust_message_queue (_srv, this );
17
18
rust_srv *srv = _srv->clone ();
18
19
rust_dom *dom =
19
20
new (this ) rust_dom (this , message_queue, srv, crate, name);
20
- rust_handle<rust_dom> *handle = get_dom_handle (dom);
21
+ rust_handle<rust_dom> *handle = internal_get_dom_handle (dom);
21
22
message_queue->associate (handle);
22
23
domains.append (dom);
23
24
message_queues.append (message_queue);
25
+ UNLOCK (_kernel_lock);
24
26
return handle;
25
27
}
26
28
27
29
void
28
30
rust_kernel::destroy_domain (rust_dom *dom) {
31
+ LOCK (_kernel_lock);
29
32
log (rust_log::KERN, " deleting domain: " PTR " , index: %d, domains %d" ,
30
33
dom, dom->list_index , domains.length ());
31
34
domains.remove (dom);
32
35
dom->message_queue ->disassociate ();
33
36
rust_srv *srv = dom->srv ;
34
37
delete dom;
35
38
delete srv;
39
+ UNLOCK (_kernel_lock);
36
40
}
37
41
38
42
rust_handle<rust_dom> *
39
- rust_kernel::get_dom_handle (rust_dom *dom) {
43
+ rust_kernel::internal_get_dom_handle (rust_dom *dom) {
40
44
rust_handle<rust_dom> *handle = NULL ;
41
- if (_dom_handles.get (dom, &handle)) {
42
- return handle;
45
+ if (_dom_handles.get (dom, &handle) == false ) {
46
+ handle =
47
+ new (this ) rust_handle<rust_dom>(this , dom->message_queue , dom);
48
+ _dom_handles.put (dom, handle);
43
49
}
44
- handle = new (this ) rust_handle<rust_dom>(this , dom->message_queue , dom);
45
- _dom_handles.put (dom, handle);
50
+ return handle;
51
+ }
52
+
53
+ rust_handle<rust_dom> *
54
+ rust_kernel::get_dom_handle (rust_dom *dom) {
55
+ LOCK (_kernel_lock);
56
+ rust_handle<rust_dom> *handle = internal_get_dom_handle (dom);
57
+ UNLOCK (_kernel_lock);
46
58
return handle;
47
59
}
48
60
49
61
rust_handle<rust_task> *
50
62
rust_kernel::get_task_handle (rust_task *task) {
63
+ LOCK (_kernel_lock);
51
64
rust_handle<rust_task> *handle = NULL ;
52
- if (_task_handles.get (task, &handle)) {
53
- return handle;
65
+ if (_task_handles.get (task, &handle) == false ) {
66
+ handle =
67
+ new (this ) rust_handle<rust_task>(this , task->dom ->message_queue ,
68
+ task);
69
+ _task_handles.put (task, handle);
54
70
}
55
- handle = new (this ) rust_handle<rust_task>(this , task->dom ->message_queue ,
56
- task);
57
- _task_handles.put (task, handle);
71
+ UNLOCK (_kernel_lock);
58
72
return handle;
59
73
}
60
74
61
75
rust_handle<rust_port> *
62
76
rust_kernel::get_port_handle (rust_port *port) {
77
+ PLOCK (_kernel_lock);
63
78
rust_handle<rust_port> *handle = NULL ;
64
- if (_port_handles.get (port, &handle)) {
65
- return handle;
79
+ if (_port_handles.get (port, &handle) == false ) {
80
+ handle =
81
+ new (this ) rust_handle<rust_port>(this ,
82
+ port->task ->dom ->message_queue ,
83
+ port);
84
+ _port_handles.put (port, handle);
66
85
}
67
- handle = new (this ) rust_handle<rust_port>(this ,
68
- port->task ->dom ->message_queue , port);
69
- _port_handles.put (port, handle);
86
+ PUNLOCK (_kernel_lock);
70
87
return handle;
71
88
}
72
89
@@ -76,6 +93,7 @@ rust_kernel::join_all_domains() {
76
93
while (domains.length () > 0 ) {
77
94
sync::yield ();
78
95
}
96
+ log (rust_log::KERN, " joined domains" );
79
97
}
80
98
81
99
void
@@ -92,30 +110,8 @@ rust_kernel::log_all_domain_state() {
92
110
bool
93
111
rust_kernel::is_deadlocked () {
94
112
return false ;
95
- // _lock.lock();
96
- // if (domains.length() != 1) {
97
- // // We can only check for deadlocks when only one domain exists.
98
- // return false;
99
- // }
100
- //
101
- // if (domains[0]->running_tasks.length() != 0) {
102
- // // We are making progress and therefore we are not deadlocked.
103
- // return false;
104
- // }
105
- //
106
- // if (domains[0]->message_queue->is_empty() &&
107
- // domains[0]->blocked_tasks.length() > 0) {
108
- // // We have no messages to process, no running tasks to schedule
109
- // // and some blocked tasks therefore we are likely in a deadlock.
110
- // log_all_domain_state();
111
- // return true;
112
- // }
113
- //
114
- // _lock.unlock();
115
- // return false;
116
113
}
117
114
118
-
119
115
void
120
116
rust_kernel::log (uint32_t type_bits, char const *fmt, ...) {
121
117
char buf[256 ];
@@ -130,7 +126,7 @@ rust_kernel::log(uint32_t type_bits, char const *fmt, ...) {
130
126
131
127
void
132
128
rust_kernel::pump_message_queues () {
133
- message_queues. global . lock ( );
129
+ LOCK (_kernel_lock );
134
130
for (size_t i = 0 ; i < message_queues.length (); i++) {
135
131
rust_message_queue *queue = message_queues[i];
136
132
if (queue->is_associated () == false ) {
@@ -141,13 +137,14 @@ rust_kernel::pump_message_queues() {
141
137
}
142
138
}
143
139
}
144
- message_queues. global . unlock ( );
140
+ UNLOCK (_kernel_lock );
145
141
}
146
142
147
143
void
148
144
rust_kernel::start_kernel_loop () {
149
145
while (_interrupt_kernel_loop == false ) {
150
146
pump_message_queues ();
147
+ sync::yield ();
151
148
}
152
149
}
153
150
@@ -160,6 +157,7 @@ rust_kernel::run() {
160
157
161
158
void
162
159
rust_kernel::terminate_kernel_loop () {
160
+ log (rust_log::KERN, " terminating kernel loop" );
163
161
_interrupt_kernel_loop = true ;
164
162
join ();
165
163
}
@@ -177,10 +175,14 @@ rust_kernel::~rust_kernel() {
177
175
// messages.
178
176
pump_message_queues ();
179
177
178
+ log (rust_log::KERN, " freeing handles" );
179
+
180
180
free_handles (_task_handles);
181
181
free_handles (_port_handles);
182
182
free_handles (_dom_handles);
183
183
184
+ log (rust_log::KERN, " freeing queues" );
185
+
184
186
rust_message_queue *queue = NULL ;
185
187
while (message_queues.pop (&queue)) {
186
188
K (_srv, queue->is_empty (), " Kernel message queue should be empty "
0 commit comments