Skip to content

Commit f7eed22

Browse files
committed
A major refactoring that changes the way the runtime uses TLS. In the
old design the TLS held the scheduler struct, and the scheduler struct held the active task. This posed all sorts of weird problems due to how we wanted to use the contents of TLS. The cleaner approach is to leave the active task in TLS and have the task hold the scheduler. To make this work out the scheduler has to run inside a regular task, and then once that is the case the context switching code is massively simplified, as instead of three possible paths there is only one. The logical flow is also easier to follow, as the scheduler struct acts somewhat like a "token" indicating what is active. These changes also necessitated changing a large number of runtime tests, and rewriting most of the runtime testing helpers. Polish level is "low", as I will very soon start on more scheduler changes that will require wiping the polish off. That being said there should be sufficient comments around anything complex to make this entirely respectable as a standalone commit.
1 parent 82b2455 commit f7eed22

File tree

15 files changed

+887
-1022
lines changed

15 files changed

+887
-1022
lines changed

src/libstd/macros.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,14 @@ macro_rules! rtdebug_ (
2323
} )
2424
)
2525

26-
// An alternate version with no output, for turning off logging
26+
// An alternate version with no output, for turning off logging. An
27+
// earlier attempt that did not call the fmt! macro was insufficient,
28+
// as a case of the "let bind each variable" approach eventually
29+
// failed without an error message describing the invocation site.
2730
macro_rules! rtdebug (
28-
($( $arg:expr),+) => ( $(let _ = $arg)*; )
31+
($( $arg:expr),+) => ( {
32+
let _x = fmt!( $($arg),+ );
33+
})
2934
)
3035

3136
macro_rules! rtassert (

src/libstd/rt/comm.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,7 @@ mod test {
743743
do run_in_newsched_task {
744744
let (port, chan) = oneshot::<~int>();
745745
let port_cell = Cell::new(port);
746-
do spawntask_immediately {
746+
do spawntask {
747747
assert!(port_cell.take().recv() == ~10);
748748
}
749749

@@ -1019,5 +1019,4 @@ mod test {
10191019
}
10201020
}
10211021
}
1022-
10231022
}

src/libstd/rt/context.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,11 @@ impl Context {
4949
let argp: *c_void = unsafe { transmute::<&~fn(), *c_void>(&*start) };
5050
let sp: *uint = stack.end();
5151
let sp: *mut uint = unsafe { transmute_mut_unsafe(sp) };
52-
5352
// Save and then immediately load the current context,
5453
// which we will then modify to call the given function when restored
5554
let mut regs = new_regs();
5655
unsafe {
57-
swap_registers(transmute_mut_region(&mut *regs), transmute_region(&*regs))
56+
swap_registers(transmute_mut_region(&mut *regs), transmute_region(&*regs));
5857
};
5958

6059
initialize_call_frame(&mut *regs, fp, argp, sp);
@@ -72,13 +71,14 @@ impl Context {
7271
then loading the registers from a previously saved Context.
7372
*/
7473
pub fn swap(out_context: &mut Context, in_context: &Context) {
74+
rtdebug!("swapping contexts");
7575
let out_regs: &mut Registers = match out_context {
7676
&Context { regs: ~ref mut r, _ } => r
7777
};
7878
let in_regs: &Registers = match in_context {
7979
&Context { regs: ~ref r, _ } => r
8080
};
81-
81+
rtdebug!("doing raw swap");
8282
unsafe { swap_registers(out_regs, in_regs) };
8383
}
8484
}

src/libstd/rt/io/net/tcp.rs

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -186,15 +186,15 @@ mod test {
186186
do run_in_newsched_task {
187187
let addr = next_test_ip4();
188188

189-
do spawntask_immediately {
189+
do spawntask {
190190
let mut listener = TcpListener::bind(addr);
191191
let mut stream = listener.accept();
192192
let mut buf = [0];
193193
stream.read(buf);
194194
assert!(buf[0] == 99);
195195
}
196196

197-
do spawntask_immediately {
197+
do spawntask {
198198
let mut stream = TcpStream::connect(addr);
199199
stream.write([99]);
200200
}
@@ -206,15 +206,15 @@ mod test {
206206
do run_in_newsched_task {
207207
let addr = next_test_ip6();
208208

209-
do spawntask_immediately {
209+
do spawntask {
210210
let mut listener = TcpListener::bind(addr);
211211
let mut stream = listener.accept();
212212
let mut buf = [0];
213213
stream.read(buf);
214214
assert!(buf[0] == 99);
215215
}
216216

217-
do spawntask_immediately {
217+
do spawntask {
218218
let mut stream = TcpStream::connect(addr);
219219
stream.write([99]);
220220
}
@@ -226,15 +226,15 @@ mod test {
226226
do run_in_newsched_task {
227227
let addr = next_test_ip4();
228228

229-
do spawntask_immediately {
229+
do spawntask {
230230
let mut listener = TcpListener::bind(addr);
231231
let mut stream = listener.accept();
232232
let mut buf = [0];
233233
let nread = stream.read(buf);
234234
assert!(nread.is_none());
235235
}
236236

237-
do spawntask_immediately {
237+
do spawntask {
238238
let _stream = TcpStream::connect(addr);
239239
// Close
240240
}
@@ -246,15 +246,15 @@ mod test {
246246
do run_in_newsched_task {
247247
let addr = next_test_ip6();
248248

249-
do spawntask_immediately {
249+
do spawntask {
250250
let mut listener = TcpListener::bind(addr);
251251
let mut stream = listener.accept();
252252
let mut buf = [0];
253253
let nread = stream.read(buf);
254254
assert!(nread.is_none());
255255
}
256256

257-
do spawntask_immediately {
257+
do spawntask {
258258
let _stream = TcpStream::connect(addr);
259259
// Close
260260
}
@@ -266,7 +266,7 @@ mod test {
266266
do run_in_newsched_task {
267267
let addr = next_test_ip4();
268268

269-
do spawntask_immediately {
269+
do spawntask {
270270
let mut listener = TcpListener::bind(addr);
271271
let mut stream = listener.accept();
272272
let mut buf = [0];
@@ -276,7 +276,7 @@ mod test {
276276
assert!(nread.is_none());
277277
}
278278

279-
do spawntask_immediately {
279+
do spawntask {
280280
let _stream = TcpStream::connect(addr);
281281
// Close
282282
}
@@ -288,7 +288,7 @@ mod test {
288288
do run_in_newsched_task {
289289
let addr = next_test_ip6();
290290

291-
do spawntask_immediately {
291+
do spawntask {
292292
let mut listener = TcpListener::bind(addr);
293293
let mut stream = listener.accept();
294294
let mut buf = [0];
@@ -298,7 +298,7 @@ mod test {
298298
assert!(nread.is_none());
299299
}
300300

301-
do spawntask_immediately {
301+
do spawntask {
302302
let _stream = TcpStream::connect(addr);
303303
// Close
304304
}
@@ -310,7 +310,7 @@ mod test {
310310
do run_in_newsched_task {
311311
let addr = next_test_ip4();
312312

313-
do spawntask_immediately {
313+
do spawntask {
314314
let mut listener = TcpListener::bind(addr);
315315
let mut stream = listener.accept();
316316
let buf = [0];
@@ -327,7 +327,7 @@ mod test {
327327
}
328328
}
329329

330-
do spawntask_immediately {
330+
do spawntask {
331331
let _stream = TcpStream::connect(addr);
332332
// Close
333333
}
@@ -339,7 +339,7 @@ mod test {
339339
do run_in_newsched_task {
340340
let addr = next_test_ip6();
341341

342-
do spawntask_immediately {
342+
do spawntask {
343343
let mut listener = TcpListener::bind(addr);
344344
let mut stream = listener.accept();
345345
let buf = [0];
@@ -356,7 +356,7 @@ mod test {
356356
}
357357
}
358358

359-
do spawntask_immediately {
359+
do spawntask {
360360
let _stream = TcpStream::connect(addr);
361361
// Close
362362
}
@@ -369,7 +369,7 @@ mod test {
369369
let addr = next_test_ip4();
370370
let max = 10;
371371

372-
do spawntask_immediately {
372+
do spawntask {
373373
let mut listener = TcpListener::bind(addr);
374374
do max.times {
375375
let mut stream = listener.accept();
@@ -379,8 +379,8 @@ mod test {
379379
}
380380
}
381381

382-
do spawntask_immediately {
383-
do max.times {
382+
do spawntask {
383+
for max.times {
384384
let mut stream = TcpStream::connect(addr);
385385
stream.write([99]);
386386
}
@@ -394,7 +394,7 @@ mod test {
394394
let addr = next_test_ip6();
395395
let max = 10;
396396

397-
do spawntask_immediately {
397+
do spawntask {
398398
let mut listener = TcpListener::bind(addr);
399399
do max.times {
400400
let mut stream = listener.accept();
@@ -404,8 +404,8 @@ mod test {
404404
}
405405
}
406406

407-
do spawntask_immediately {
408-
do max.times {
407+
do spawntask {
408+
for max.times {
409409
let mut stream = TcpStream::connect(addr);
410410
stream.write([99]);
411411
}
@@ -419,13 +419,13 @@ mod test {
419419
let addr = next_test_ip4();
420420
static MAX: int = 10;
421421

422-
do spawntask_immediately {
422+
do spawntask {
423423
let mut listener = TcpListener::bind(addr);
424424
for int::range(0, MAX) |i| {
425425
let stream = Cell::new(listener.accept());
426426
rtdebug!("accepted");
427427
// Start another task to handle the connection
428-
do spawntask_immediately {
428+
do spawntask {
429429
let mut stream = stream.take();
430430
let mut buf = [0];
431431
stream.read(buf);
@@ -440,7 +440,7 @@ mod test {
440440
fn connect(i: int, addr: IpAddr) {
441441
if i == MAX { return }
442442

443-
do spawntask_immediately {
443+
do spawntask {
444444
rtdebug!("connecting");
445445
let mut stream = TcpStream::connect(addr);
446446
// Connect again before writing
@@ -458,13 +458,13 @@ mod test {
458458
let addr = next_test_ip6();
459459
static MAX: int = 10;
460460

461-
do spawntask_immediately {
461+
do spawntask {
462462
let mut listener = TcpListener::bind(addr);
463463
for int::range(0, MAX) |i| {
464464
let stream = Cell::new(listener.accept());
465465
rtdebug!("accepted");
466466
// Start another task to handle the connection
467-
do spawntask_immediately {
467+
do spawntask {
468468
let mut stream = stream.take();
469469
let mut buf = [0];
470470
stream.read(buf);
@@ -479,7 +479,7 @@ mod test {
479479
fn connect(i: int, addr: IpAddr) {
480480
if i == MAX { return }
481481

482-
do spawntask_immediately {
482+
do spawntask {
483483
rtdebug!("connecting");
484484
let mut stream = TcpStream::connect(addr);
485485
// Connect again before writing
@@ -497,7 +497,7 @@ mod test {
497497
let addr = next_test_ip4();
498498
static MAX: int = 10;
499499

500-
do spawntask_immediately {
500+
do spawntask {
501501
let mut listener = TcpListener::bind(addr);
502502
for int::range(0, MAX) |_| {
503503
let stream = Cell::new(listener.accept());
@@ -535,7 +535,7 @@ mod test {
535535
let addr = next_test_ip6();
536536
static MAX: int = 10;
537537

538-
do spawntask_immediately {
538+
do spawntask {
539539
let mut listener = TcpListener::bind(addr);
540540
for int::range(0, MAX) |_| {
541541
let stream = Cell::new(listener.accept());

src/libstd/rt/io/net/udp.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ mod test {
132132
let server_ip = next_test_ip4();
133133
let client_ip = next_test_ip4();
134134

135-
do spawntask_immediately {
135+
do spawntask {
136136
match UdpSocket::bind(server_ip) {
137137
Some(ref mut server) => {
138138
let mut buf = [0];
@@ -149,7 +149,7 @@ mod test {
149149
}
150150
}
151151

152-
do spawntask_immediately {
152+
do spawntask {
153153
match UdpSocket::bind(client_ip) {
154154
Some(ref mut client) => client.sendto([99], server_ip),
155155
None => fail!()
@@ -164,7 +164,7 @@ mod test {
164164
let server_ip = next_test_ip6();
165165
let client_ip = next_test_ip6();
166166

167-
do spawntask_immediately {
167+
do spawntask {
168168
match UdpSocket::bind(server_ip) {
169169
Some(ref mut server) => {
170170
let mut buf = [0];
@@ -181,7 +181,7 @@ mod test {
181181
}
182182
}
183183

184-
do spawntask_immediately {
184+
do spawntask {
185185
match UdpSocket::bind(client_ip) {
186186
Some(ref mut client) => client.sendto([99], server_ip),
187187
None => fail!()
@@ -196,7 +196,7 @@ mod test {
196196
let server_ip = next_test_ip4();
197197
let client_ip = next_test_ip4();
198198

199-
do spawntask_immediately {
199+
do spawntask {
200200
match UdpSocket::bind(server_ip) {
201201
Some(server) => {
202202
let server = ~server;
@@ -214,7 +214,7 @@ mod test {
214214
}
215215
}
216216

217-
do spawntask_immediately {
217+
do spawntask {
218218
match UdpSocket::bind(client_ip) {
219219
Some(client) => {
220220
let client = ~client;
@@ -233,7 +233,7 @@ mod test {
233233
let server_ip = next_test_ip6();
234234
let client_ip = next_test_ip6();
235235

236-
do spawntask_immediately {
236+
do spawntask {
237237
match UdpSocket::bind(server_ip) {
238238
Some(server) => {
239239
let server = ~server;
@@ -251,7 +251,7 @@ mod test {
251251
}
252252
}
253253

254-
do spawntask_immediately {
254+
do spawntask {
255255
match UdpSocket::bind(client_ip) {
256256
Some(client) => {
257257
let client = ~client;

0 commit comments

Comments
 (0)