@@ -7,7 +7,7 @@ export get, get_monitor_task_gl;
7
7
import ll = uv_ll;
8
8
import hl = uv_hl;
9
9
import get_gl = get;
10
- import task:: { spawn_sched , single_threaded} ;
10
+ import task:: { run , single_threaded} ;
11
11
import priv:: { chan_from_global_ptr, weaken_task} ;
12
12
import comm:: { port, chan, methods, select2, listen} ;
13
13
import either:: { left, right} ;
@@ -63,7 +63,7 @@ fn get_monitor_task_gl() -> hl::high_level_loop unsafe {
63
63
// As a weak task the runtime will notify us when to exit
64
64
weaken_task ( ) { |weak_exit_po|
65
65
#debug ( "global monitor task is now weak" ) ;
66
- let hl_loop = spawn_high_level_loop ( ) ;
66
+ let hl_loop = spawn_loop ( ) ;
67
67
loop {
68
68
#debug ( "in outer_loop..." ) ;
69
69
alt select2 ( weak_exit_po, msg_po) {
@@ -93,18 +93,45 @@ fn get_monitor_task_gl() -> hl::high_level_loop unsafe {
93
93
}
94
94
}
95
95
96
- fn spawn_high_level_loop ( ) -> hl:: high_level_loop unsafe {
96
+ fn spawn_loop ( ) -> hl:: high_level_loop unsafe {
97
+ let builder = task:: builder ( ) ;
98
+ task:: add_wrapper ( builder) { |task_body|
99
+ fn ~( move task_body) {
100
+ // The I/O loop task also needs to be weak so it doesn't keep
101
+ // the runtime alive
102
+ weaken_task { |weak_exit_po|
103
+ #debug ( "global libuv task is now weak %?" , weak_exit_po) ;
104
+ task_body ( ) ;
105
+
106
+ // We don't wait for the exit message on weak_exit_po
107
+ // because the monitor task will tell the uv loop when to
108
+ // exit
109
+
110
+ #debug ( "global libuv task is leaving weakened state" ) ;
111
+ }
112
+ }
113
+ }
114
+ spawn_high_level_loop ( builder)
115
+ }
116
+
117
+ fn spawn_high_level_loop ( -builder : task:: builder
118
+ ) -> hl:: high_level_loop unsafe {
119
+
97
120
let hll_po = port :: < hl:: high_level_loop > ( ) ;
98
121
let hll_ch = hll_po. chan ( ) ;
99
122
100
- spawn_sched ( single_threaded) { ||
101
- #debug ( "entering global libuv task" ) ;
102
- weaken_task ( ) { |weak_exit_po|
103
- #debug ( "global libuv task is now weak %?" , weak_exit_po) ;
104
- hl:: run_high_level_loop ( hll_ch) ;
105
- #debug ( "global libuv task is leaving weakened state" ) ;
106
- } ;
107
- #debug ( "global libuv task exiting" ) ;
123
+ task:: set_opts ( builder, {
124
+ sched: some ( {
125
+ mode: single_threaded,
126
+ native_stack_size: none
127
+ } )
128
+ with task:: get_opts ( builder)
129
+ } ) ;
130
+
131
+ run ( builder) { ||
132
+ #debug ( "entering libuv task" ) ;
133
+ hl:: run_high_level_loop ( hll_ch) ;
134
+ #debug ( "libuv task exiting" ) ;
108
135
} ;
109
136
110
137
hll_po. recv ( )
0 commit comments