Skip to content

Commit ceec89a

Browse files
committed
---
yaml --- r: 676 b: refs/heads/master c: 1bd331b h: refs/heads/master v: v3
1 parent 4afc649 commit ceec89a

File tree

6 files changed

+37
-6
lines changed

6 files changed

+37
-6
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 91b4a0c9f8ba7be56fc098ffc6182a888e3970bf
2+
refs/heads/master: 1bd331b7aaa24245f86868305ab64600683a41e1

trunk/src/rt/rust_dom.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ rust_dom::start_main_loop() {
314314
}
315315
log(rust_log::TASK,
316316
"all tasks are blocked, scheduler yielding ...");
317-
sync::yield();
317+
sync::sleep(100);
318318
log(rust_log::TASK,
319319
"scheduler resuming ...");
320320
continue;

trunk/src/rt/rust_kernel.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,7 @@ void
164164
rust_kernel::terminate_kernel_loop() {
165165
log(rust_log::KERN, "terminating kernel loop");
166166
_interrupt_kernel_loop = true;
167-
_kernel_lock.lock();
168-
_kernel_lock.signal_all();
169-
_kernel_lock.unlock();
167+
signal_kernel_lock();
170168
join();
171169
}
172170

@@ -217,6 +215,23 @@ rust_kernel::free_handles(hash_map<T*, rust_handle<T>* > &map) {
217215
}
218216
}
219217

218+
void
219+
rust_kernel::notify_message_enqueued(rust_message_queue *queue,
220+
rust_message *message) {
221+
// The message pump needs to handle this message if the queue is not
222+
// associated with a domain, therefore signal the message pump.
223+
if (queue->is_associated() == false) {
224+
signal_kernel_lock();
225+
}
226+
}
227+
228+
void
229+
rust_kernel::signal_kernel_lock() {
230+
_kernel_lock.lock();
231+
_kernel_lock.signal_all();
232+
_kernel_lock.unlock();
233+
}
234+
220235
//
221236
// Local Variables:
222237
// mode: C++

trunk/src/rt/rust_kernel.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010

1111
class rust_kernel;
12+
class rust_message;
1213

1314
template <typename T> class
1415
rust_handle :
@@ -90,6 +91,16 @@ class rust_kernel : public rust_thread {
9091

9192
bool is_deadlocked();
9293

94+
void signal_kernel_lock();
95+
96+
/**
97+
* Notifies the kernel whenever a message has been enqueued . This gives
98+
* the kernel the opportunity to wake up the message pump thread if the
99+
* message queue is not associated.
100+
*/
101+
void
102+
notify_message_enqueued(rust_message_queue *queue, rust_message *message);
103+
93104
/**
94105
* Blocks until all domains have terminated.
95106
*/

trunk/src/rt/rust_message.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,11 @@ class rust_message_queue : public lock_free_queue<rust_message*>,
114114
bool is_associated() {
115115
return this->dom_handle != NULL;
116116
}
117+
118+
void enqueue(rust_message* message) {
119+
lock_free_queue<rust_message*>::enqueue(message);
120+
kernel->notify_message_enqueued(this, message);
121+
}
117122
};
118123

119124
//

trunk/src/rt/sync/lock_free_queue.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ class lock_free_queue {
120120
return head.node == tail.node;
121121
}
122122

123-
void enqueue(T value) {
123+
virtual void enqueue(T value) {
124124

125125
// Create a new node to be inserted in the linked list, and set the
126126
// next node to NULL.

0 commit comments

Comments
 (0)