| ... | ... | @@ -94,11 +94,13 @@ pub fn Channel(comptime T: type) type { |
| 94 | 94 | /// buffer, or in the case of a zero size buffer, when the item has been retrieved by a getter. |
| 95 | 95 | /// Or when the channel is destroyed. |
| 96 | 96 | pub fn put(self: *SelfChannel, data: T) void { |
| 97 | | var my_tick_node = Loop.NextTickNode.init(@frame()); |
| 98 | | var queue_node = std.atomic.Queue(PutNode).Node.init(PutNode{ |
| 99 | | .tick_node = &my_tick_node, |
| 100 | | .data = data, |
| 101 | | }); |
| 97 | var my_tick_node = Loop.NextTickNode{ .data = @frame() }; |
| 98 | var queue_node = std.atomic.Queue(PutNode).Node{ |
| 99 | .data = PutNode{ |
| 100 | .tick_node = &my_tick_node, |
| 101 | .data = data, |
| 102 | }, |
| 103 | }; |
| 102 | 104 | |
| 103 | 105 | suspend { |
| 104 | 106 | self.putters.put(&queue_node); |
| ... | ... | @@ -113,13 +115,15 @@ pub fn Channel(comptime T: type) type { |
| 113 | 115 | pub fn get(self: *SelfChannel) callconv(.Async) T { |
| 114 | 116 | // TODO https://github.com/ziglang/zig/issues/2765 |
| 115 | 117 | var result: T = undefined; |
| 116 | | var my_tick_node = Loop.NextTickNode.init(@frame()); |
| 117 | | var queue_node = std.atomic.Queue(GetNode).Node.init(GetNode{ |
| 118 | | .tick_node = &my_tick_node, |
| 119 | | .data = GetNode.Data{ |
| 120 | | .Normal = GetNode.Normal{ .ptr = &result }, |
| 118 | var my_tick_node = Loop.NextTickNode{ .data = @frame() }; |
| 119 | var queue_node = std.atomic.Queue(GetNode).Node{ |
| 120 | .data = GetNode{ |
| 121 | .tick_node = &my_tick_node, |
| 122 | .data = GetNode.Data{ |
| 123 | .Normal = GetNode.Normal{ .ptr = &result }, |
| 124 | }, |
| 121 | 125 | }, |
| 122 | | }); |
| 126 | }; |
| 123 | 127 | |
| 124 | 128 | suspend { |
| 125 | 129 | self.getters.put(&queue_node); |
| ... | ... | @@ -145,17 +149,19 @@ pub fn Channel(comptime T: type) type { |
| 145 | 149 | // TODO integrate this function with named return values |
| 146 | 150 | // so we can get rid of this extra result copy |
| 147 | 151 | var result: ?T = null; |
| 148 | | var my_tick_node = Loop.NextTickNode.init(@frame()); |
| 149 | | var or_null_node = std.atomic.Queue(*std.atomic.Queue(GetNode).Node).Node.init(undefined); |
| 150 | | var queue_node = std.atomic.Queue(GetNode).Node.init(GetNode{ |
| 151 | | .tick_node = &my_tick_node, |
| 152 | | .data = GetNode.Data{ |
| 153 | | .OrNull = GetNode.OrNull{ |
| 154 | | .ptr = &result, |
| 155 | | .or_null = &or_null_node, |
| 152 | var my_tick_node = Loop.NextTickNode{ .data = @frame() }; |
| 153 | var or_null_node = std.atomic.Queue(*std.atomic.Queue(GetNode).Node).Node{ .data = undefined }; |
| 154 | var queue_node = std.atomic.Queue(GetNode).Node{ |
| 155 | .data = GetNode{ |
| 156 | .tick_node = &my_tick_node, |
| 157 | .data = GetNode.Data{ |
| 158 | .OrNull = GetNode.OrNull{ |
| 159 | .ptr = &result, |
| 160 | .or_null = &or_null_node, |
| 161 | }, |
| 156 | 162 | }, |
| 157 | 163 | }, |
| 158 | | }); |
| 164 | }; |
| 159 | 165 | or_null_node.data = &queue_node; |
| 160 | 166 | |
| 161 | 167 | suspend { |