diff options
Diffstat (limited to 'exercises')
| -rw-r--r-- | exercises/090_async7.zig | 2 | ||||
| -rw-r--r-- | exercises/091_async8.zig | 67 | ||||
| -rw-r--r-- | exercises/095_interfaces.zig (renamed from exercises/092_interfaces.zig) | 0 | ||||
| -rw-r--r-- | exercises/096_hello_c.zig (renamed from exercises/093_hello_c.zig) | 0 | ||||
| -rw-r--r-- | exercises/097_c_math.zig (renamed from exercises/094_c_math.zig) | 0 | ||||
| -rw-r--r-- | exercises/098_for3.zig (renamed from exercises/095_for3.zig) | 0 | ||||
| -rw-r--r-- | exercises/099_memory_allocation.zig (renamed from exercises/096_memory_allocation.zig) | 0 | ||||
| -rw-r--r-- | exercises/100_bit_manipulation.zig (renamed from exercises/097_bit_manipulation.zig) | 0 | ||||
| -rw-r--r-- | exercises/101_bit_manipulation2.zig (renamed from exercises/098_bit_manipulation2.zig) | 0 | ||||
| -rw-r--r-- | exercises/102_formatting.zig (renamed from exercises/099_formatting.zig) | 0 | ||||
| -rw-r--r-- | exercises/103_for4.zig (renamed from exercises/100_for4.zig) | 0 | ||||
| -rw-r--r-- | exercises/104_for5.zig (renamed from exercises/101_for5.zig) | 0 | ||||
| -rw-r--r-- | exercises/105_testing.zig (renamed from exercises/102_testing.zig) | 0 | ||||
| -rw-r--r-- | exercises/106_tokenization.zig (renamed from exercises/103_tokenization.zig) | 0 | ||||
| -rw-r--r-- | exercises/107_threading.zig (renamed from exercises/104_threading.zig) | 0 | ||||
| -rw-r--r-- | exercises/108_threading2.zig (renamed from exercises/105_threading2.zig) | 0 | ||||
| -rw-r--r-- | exercises/109_files.zig (renamed from exercises/106_files.zig) | 0 | ||||
| -rw-r--r-- | exercises/110_files2.zig (renamed from exercises/107_files2.zig) | 0 | ||||
| -rw-r--r-- | exercises/111_labeled_switch.zig (renamed from exercises/108_labeled_switch.zig) | 0 | ||||
| -rw-r--r-- | exercises/112_vectors.zig (renamed from exercises/109_vectors.zig) | 0 | ||||
| -rw-r--r-- | exercises/113_quiz9.zig (renamed from exercises/110_quiz9.zig) | 0 | ||||
| -rw-r--r-- | exercises/114_packed.zig (renamed from exercises/111_packed.zig) | 0 | ||||
| -rw-r--r-- | exercises/115_packed2.zig (renamed from exercises/112_packed2.zig) | 0 |
23 files changed, 48 insertions, 21 deletions
diff --git a/exercises/090_async7.zig b/exercises/090_async7.zig index f914aef..bfe6ffd 100644 --- a/exercises/090_async7.zig +++ b/exercises/090_async7.zig @@ -42,7 +42,7 @@ pub fn main(init: std.process.Init) !void { try group.await(io); - print("Counter: {} (expected: 400)\n", .{state.counter}); + print("Counter: {}\n", .{state.counter}); } fn increment(io: std.Io, state: *SharedState, times: u32) void { diff --git a/exercises/091_async8.zig b/exercises/091_async8.zig index cd9c975..10921c3 100644 --- a/exercises/091_async8.zig +++ b/exercises/091_async8.zig @@ -1,35 +1,62 @@ // -// You have doubtless noticed that 'suspend' requires a block -// expression like so: +// Tasks often need to communicate! Io provides Queue for this — +// a bounded, thread-safe channel for passing data between tasks: // -// suspend {} +// var backing: [16]u32 = undefined; +// var queue: std.Io.Queue(u32) = .init(&backing); // -// The suspend block executes when a function suspends. To get -// sense for when this happens, please make the following -// program print the string +// // Producer task: +// try queue.putOne(io, value); // blocks if queue is full // -// "ABCDEF" +// // Consumer task: +// const val = try queue.getOne(io); // blocks if queue is empty // -const print = @import("std").debug.print; +// When the producer is done, it calls queue.close(io) to signal +// that no more data is coming. After that, getOne() will return +// error.Closed once the queue is drained. +// +// This is the classic producer/consumer pattern — one task +// generates work, another processes it, and the queue handles +// all the synchronization automatically. +// +// Fix this program: the producer sends numbers 1..10, the +// consumer sums them up. The expected sum is 55. +// +const std = @import("std"); +const print = std.debug.print; -pub fn main() void { - print("A", .{}); +pub fn main(init: std.process.Init) !void { + const io = init.io; - var frame = async suspendable(); + var backing: [4]u32 = undefined; + var queue: std.Io.Queue(u32) = .init(&backing); - print("X", .{}); + var group: std.Io.Group = .init; - resume frame; + group.async(io, producer, .{ io, &queue }); + group.async(io, consumer, .{ io, &queue }); - print("F", .{}); + try group.await(io); } -fn suspendable() void { - print("X", .{}); - - suspend { - print("X", .{}); +fn producer(io: std.Io, queue: *std.Io.Queue(u32)) void { + // Send numbers 1 through 10 into the queue. + for (1..11) |i| { + // What Queue method sends a single element, blocking if full? + queue.???(io, @intCast(i)) catch return; } + // Signal that we're done sending. + queue.close(io); +} - print("X", .{}); +fn consumer(io: std.Io, queue: *std.Io.Queue(u32)) void { + var sum: u32 = 0; + while (true) { + const value = queue.getOne(io) catch |err| switch (err) { + error.Closed => break, + error.Canceled => return, + }; + sum += value; + } + print("Sum of 1..10 = {}\n", .{sum}); } diff --git a/exercises/092_interfaces.zig b/exercises/095_interfaces.zig index 7775dd5..7775dd5 100644 --- a/exercises/092_interfaces.zig +++ b/exercises/095_interfaces.zig diff --git a/exercises/093_hello_c.zig b/exercises/096_hello_c.zig index 182e0b0..182e0b0 100644 --- a/exercises/093_hello_c.zig +++ b/exercises/096_hello_c.zig diff --git a/exercises/094_c_math.zig b/exercises/097_c_math.zig index ec59a86..ec59a86 100644 --- a/exercises/094_c_math.zig +++ b/exercises/097_c_math.zig diff --git a/exercises/095_for3.zig b/exercises/098_for3.zig index 77a1b56..77a1b56 100644 --- a/exercises/095_for3.zig +++ b/exercises/098_for3.zig diff --git a/exercises/096_memory_allocation.zig b/exercises/099_memory_allocation.zig index 58de7b0..58de7b0 100644 --- a/exercises/096_memory_allocation.zig +++ b/exercises/099_memory_allocation.zig diff --git a/exercises/097_bit_manipulation.zig b/exercises/100_bit_manipulation.zig index 0e64ad7..0e64ad7 100644 --- a/exercises/097_bit_manipulation.zig +++ b/exercises/100_bit_manipulation.zig diff --git a/exercises/098_bit_manipulation2.zig b/exercises/101_bit_manipulation2.zig index 8b51265..8b51265 100644 --- a/exercises/098_bit_manipulation2.zig +++ b/exercises/101_bit_manipulation2.zig diff --git a/exercises/099_formatting.zig b/exercises/102_formatting.zig index be16978..be16978 100644 --- a/exercises/099_formatting.zig +++ b/exercises/102_formatting.zig diff --git a/exercises/100_for4.zig b/exercises/103_for4.zig index c8a1161..c8a1161 100644 --- a/exercises/100_for4.zig +++ b/exercises/103_for4.zig diff --git a/exercises/101_for5.zig b/exercises/104_for5.zig index 200e71d..200e71d 100644 --- a/exercises/101_for5.zig +++ b/exercises/104_for5.zig diff --git a/exercises/102_testing.zig b/exercises/105_testing.zig index 0dec9b9..0dec9b9 100644 --- a/exercises/102_testing.zig +++ b/exercises/105_testing.zig diff --git a/exercises/103_tokenization.zig b/exercises/106_tokenization.zig index d0abb5c..d0abb5c 100644 --- a/exercises/103_tokenization.zig +++ b/exercises/106_tokenization.zig diff --git a/exercises/104_threading.zig b/exercises/107_threading.zig index 3c3fa21..3c3fa21 100644 --- a/exercises/104_threading.zig +++ b/exercises/107_threading.zig diff --git a/exercises/105_threading2.zig b/exercises/108_threading2.zig index 374391a..374391a 100644 --- a/exercises/105_threading2.zig +++ b/exercises/108_threading2.zig diff --git a/exercises/106_files.zig b/exercises/109_files.zig index bf4de9b..bf4de9b 100644 --- a/exercises/106_files.zig +++ b/exercises/109_files.zig diff --git a/exercises/107_files2.zig b/exercises/110_files2.zig index c363086..c363086 100644 --- a/exercises/107_files2.zig +++ b/exercises/110_files2.zig diff --git a/exercises/108_labeled_switch.zig b/exercises/111_labeled_switch.zig index 897fcf5..897fcf5 100644 --- a/exercises/108_labeled_switch.zig +++ b/exercises/111_labeled_switch.zig diff --git a/exercises/109_vectors.zig b/exercises/112_vectors.zig index 96892ca..96892ca 100644 --- a/exercises/109_vectors.zig +++ b/exercises/112_vectors.zig diff --git a/exercises/110_quiz9.zig b/exercises/113_quiz9.zig index 8f5cb61..8f5cb61 100644 --- a/exercises/110_quiz9.zig +++ b/exercises/113_quiz9.zig diff --git a/exercises/111_packed.zig b/exercises/114_packed.zig index 1058f76..1058f76 100644 --- a/exercises/111_packed.zig +++ b/exercises/114_packed.zig diff --git a/exercises/112_packed2.zig b/exercises/115_packed2.zig index 2b6b558..2b6b558 100644 --- a/exercises/112_packed2.zig +++ b/exercises/115_packed2.zig |
