@@ -6,7 +6,7 @@ import ll = uv_ll;
6
6
import hl = uv_hl;
7
7
import get_gl = get;
8
8
9
- export get;
9
+ export get, get_single_task_gl ;
10
10
11
11
native mod rustrt {
12
12
fn rust_uv_get_kernel_global_chan_ptr ( ) -> * libc:: uintptr_t ;
@@ -26,7 +26,44 @@ loop is running.
26
26
loop.
27
27
" ]
28
28
fn get ( ) -> hl:: high_level_loop {
29
+ ret get_single_task_gl ( ) ;
30
+ }
31
+
32
+ #[ doc( hidden) ]
33
+ fn get_single_task_gl ( ) -> hl:: high_level_loop {
29
34
let global_loop_chan_ptr = rustrt:: rust_uv_get_kernel_global_chan_ptr ( ) ;
35
+ ret spawn_global_weak_task (
36
+ global_loop_chan_ptr,
37
+ { |weak_exit_po, msg_po, loop_ptr, first_msg|
38
+ log ( debug, "about to enter inner loop" ) ;
39
+ unsafe {
40
+ single_task_loop_body ( weak_exit_po, msg_po, loop_ptr,
41
+ copy ( first_msg) )
42
+ }
43
+ } ,
44
+ { |msg_ch|
45
+ log ( debug, "after priv::chan_from_global_ptr" ) ;
46
+ unsafe {
47
+ let handle = get_global_async_handle_native_representation ( )
48
+ as * * ll:: uv_async_t ;
49
+ hl:: single_task_loop (
50
+ { async_handle: handle, op_chan: msg_ch } )
51
+ }
52
+ }
53
+ ) ;
54
+ }
55
+
56
+ // INTERNAL API
57
+
58
+ fn spawn_global_weak_task (
59
+ global_loop_chan_ptr : * libc:: uintptr_t ,
60
+ weak_task_body_cb : fn ~(
61
+ comm:: port < ( ) > ,
62
+ comm:: port < hl:: high_level_msg > ,
63
+ * libc:: c_void ,
64
+ hl:: high_level_msg ) -> bool ,
65
+ after_task_spawn_cb : fn ~( comm:: chan < hl:: high_level_msg > )
66
+ -> hl:: high_level_loop ) -> hl:: high_level_loop {
30
67
log ( debug, #fmt ( "ENTERING global_loop::get() loop chan: %?" ,
31
68
global_loop_chan_ptr) ) ;
32
69
@@ -44,25 +81,26 @@ fn get() -> hl::high_level_loop {
44
81
} ;
45
82
unsafe {
46
83
log ( debug, "before priv::chan_from_global_ptr" ) ;
47
- let chan = priv:: chan_from_global_ptr :: < hl:: high_level_msg > (
84
+ let msg_ch = priv:: chan_from_global_ptr :: < hl:: high_level_msg > (
48
85
global_loop_chan_ptr,
49
86
builder_fn) { |port|
50
87
51
88
// the actual body of our global loop lives here
52
89
log ( debug, "initialized global port task!" ) ;
53
90
log ( debug, "GLOBAL initialized global port task!" ) ;
54
- outer_global_loop_body ( port) ;
91
+ outer_global_loop_body ( port, weak_task_body_cb ) ;
55
92
} ;
56
- log ( debug, "after priv::chan_from_global_ptr" ) ;
57
- let handle = get_global_async_handle_native_representation ( )
58
- as * * ll:: uv_async_t ;
59
- ret { async_handle : handle, op_chan : chan } ;
93
+ ret after_task_spawn_cb ( msg_ch) ;
60
94
}
61
95
}
62
96
63
- // INTERNAL API
64
-
65
- unsafe fn outer_global_loop_body ( msg_po : comm:: port < hl:: high_level_msg > ) {
97
+ unsafe fn outer_global_loop_body (
98
+ msg_po : comm:: port < hl:: high_level_msg > ,
99
+ weak_task_body_cb : fn ~(
100
+ comm:: port < ( ) > ,
101
+ comm:: port < hl:: high_level_msg > ,
102
+ * libc:: c_void ,
103
+ hl:: high_level_msg ) -> bool ) {
66
104
// we're going to use a single libuv-generated loop ptr
67
105
// for the duration of the process
68
106
let loop_ptr = ll:: loop_new ( ) ;
@@ -87,9 +125,8 @@ unsafe fn outer_global_loop_body(msg_po: comm::port<hl::high_level_msg>) {
87
125
left_val) ) ;
88
126
false
89
127
} , { |right_val|
90
- log ( debug, "about to enter inner loop" ) ;
91
- inner_global_loop_body ( weak_exit_po, msg_po, loop_ptr,
92
- copy ( right_val) )
128
+ weak_task_body_cb ( weak_exit_po, msg_po, loop_ptr,
129
+ right_val)
93
130
} , comm:: select2 ( weak_exit_po, msg_po) ) ;
94
131
log ( debug, #fmt ( "GLOBAL LOOP EXITED, WAITING TO RESTART? %?" ,
95
132
continue ) ) ;
@@ -99,7 +136,7 @@ unsafe fn outer_global_loop_body(msg_po: comm::port<hl::high_level_msg>) {
99
136
ll:: loop_delete ( loop_ptr) ;
100
137
}
101
138
102
- unsafe fn inner_global_loop_body ( weak_exit_po_in : comm:: port < ( ) > ,
139
+ unsafe fn single_task_loop_body ( weak_exit_po_in : comm:: port < ( ) > ,
103
140
msg_po_in : comm:: port < hl:: high_level_msg > ,
104
141
loop_ptr : * libc:: c_void ,
105
142
-first_interaction : hl:: high_level_msg ) -> bool {
0 commit comments