| author | |
| committer | |
| log | 25b2954c0c86145948834b31b8edb88aeb4d40a0 |
| tree | e0bf949171ec7b5f20323e2aca93c679f47669c1 |
| parent | 9fd1ecb348f25dd56f09a6bd10022554a87bb6da |
3 files changed, 20 insertions(+), 20 deletions(-)
lib/std/Io.zig+10-10| ... | ... | @@ -593,7 +593,7 @@ pub const VTable = struct { |
| 593 | 593 | context: []const u8, |
| 594 | 594 | context_alignment: std.mem.Alignment, |
| 595 | 595 | start: *const fn (context: *const anyopaque, result: *anyopaque) void, |
| 596 | ) ?*AnyFuture, | |
| 596 | ) error{OutOfMemory}!*AnyFuture, | |
| 597 | 597 | /// Returning `null` indicates resource allocation failed. |
| 598 | 598 | /// |
| 599 | 599 | /// Thread-safe. |
| ... | ... | @@ -606,7 +606,7 @@ pub const VTable = struct { |
| 606 | 606 | context: []const u8, |
| 607 | 607 | context_alignment: std.mem.Alignment, |
| 608 | 608 | start: *const fn (context: *const anyopaque, result: *anyopaque) void, |
| 609 | ) ?*AnyFuture, | |
| 609 | ) error{OutOfMemory}!*AnyFuture, | |
| 610 | 610 | /// Executes `start` asynchronously in a manner such that it cleans itself |
| 611 | 611 | /// up. This mode does not support results, await, or cancel. |
| 612 | 612 | /// |
| ... | ... | @@ -1220,7 +1220,7 @@ pub fn asyncConcurrent( |
| 1220 | 1220 | } |
| 1221 | 1221 | }; |
| 1222 | 1222 | var future: Future(Result) = undefined; |
| 1223 | future.any_future = io.vtable.asyncConcurrent( | |
| 1223 | future.any_future = try io.vtable.asyncConcurrent( | |
| 1224 | 1224 | io.userdata, |
| 1225 | 1225 | @sizeOf(Result), |
| 1226 | 1226 | .of(Result), |
| ... | ... | @@ -1231,14 +1231,14 @@ pub fn asyncConcurrent( |
| 1231 | 1231 | return future; |
| 1232 | 1232 | } |
| 1233 | 1233 | |
| 1234 | /// Calls `function` with `args`, such that the return value of the function is | |
| 1235 | /// not guaranteed to be available until `await` is called, while simultaneously | |
| 1236 | /// passing control flow back to the caller. | |
| 1234 | /// Simultaneously calls `function` with `args` while passing control flow back | |
| 1235 | /// to the caller. The return value of the function is not guaranteed to be | |
| 1236 | /// available until `await` is called. | |
| 1237 | 1237 | /// |
| 1238 | 1238 | /// This has the strongest guarantees of all async family functions, placing |
| 1239 | 1239 | /// the most restrictions on what kind of `Io` implementations are supported. |
| 1240 | /// By calling `asyncConcurrent` instead, one allows, for example, | |
| 1241 | /// stackful single-threaded non-blocking I/O. | |
| 1240 | /// By calling `asyncConcurrent` instead, one allows, for example, stackful | |
| 1241 | /// single-threaded non-blocking I/O. | |
| 1242 | 1242 | /// |
| 1243 | 1243 | /// See also: |
| 1244 | 1244 | /// * `asyncConcurrent` |
| ... | ... | @@ -1258,9 +1258,9 @@ pub fn asyncParallel( |
| 1258 | 1258 | } |
| 1259 | 1259 | }; |
| 1260 | 1260 | var future: Future(Result) = undefined; |
| 1261 | future.any_future = io.vtable.asyncConcurrent( | |
| 1261 | future.any_future = try io.vtable.asyncParallel( | |
| 1262 | 1262 | io.userdata, |
| 1263 | @ptrCast((&future.result)[0..1]), | |
| 1263 | @sizeOf(Result), | |
| 1264 | 1264 | .of(Result), |
| 1265 | 1265 | @ptrCast((&args)[0..1]), |
| 1266 | 1266 | .of(Args), |
lib/std/Io/EventLoop.zig+4-4| ... | ... | @@ -879,7 +879,7 @@ fn async( |
| 879 | 879 | context_alignment: Alignment, |
| 880 | 880 | start: *const fn (context: *const anyopaque, result: *anyopaque) void, |
| 881 | 881 | ) ?*std.Io.AnyFuture { |
| 882 | return asyncConcurrent(userdata, result.len, result_alignment, context, context_alignment, start) orelse { | |
| 882 | return asyncConcurrent(userdata, result.len, result_alignment, context, context_alignment, start) catch { | |
| 883 | 883 | start(context.ptr, result.ptr); |
| 884 | 884 | return null; |
| 885 | 885 | }; |
| ... | ... | @@ -892,14 +892,14 @@ fn asyncConcurrent( |
| 892 | 892 | context: []const u8, |
| 893 | 893 | context_alignment: Alignment, |
| 894 | 894 | start: *const fn (context: *const anyopaque, result: *anyopaque) void, |
| 895 | ) ?*std.Io.AnyFuture { | |
| 895 | ) error{OutOfMemory}!*std.Io.AnyFuture { | |
| 896 | 896 | assert(result_alignment.compare(.lte, Fiber.max_result_align)); // TODO |
| 897 | 897 | assert(context_alignment.compare(.lte, Fiber.max_context_align)); // TODO |
| 898 | 898 | assert(result_len <= Fiber.max_result_size); // TODO |
| 899 | 899 | assert(context.len <= Fiber.max_context_size); // TODO |
| 900 | 900 | |
| 901 | 901 | const event_loop: *EventLoop = @alignCast(@ptrCast(userdata)); |
| 902 | const fiber = Fiber.allocate(event_loop) catch return null; | |
| 902 | const fiber = try Fiber.allocate(event_loop); | |
| 903 | 903 | std.log.debug("allocated {*}", .{fiber}); |
| 904 | 904 | |
| 905 | 905 | const closure: *AsyncClosure = .fromFiber(fiber); |
| ... | ... | @@ -945,7 +945,7 @@ fn asyncParallel( |
| 945 | 945 | context: []const u8, |
| 946 | 946 | context_alignment: Alignment, |
| 947 | 947 | start: *const fn (context: *const anyopaque, result: *anyopaque) void, |
| 948 | ) ?*std.Io.AnyFuture { | |
| 948 | ) error{OutOfMemory}!*std.Io.AnyFuture { | |
| 949 | 949 | _ = userdata; |
| 950 | 950 | _ = result_len; |
| 951 | 951 | _ = result_alignment; |
lib/std/Io/ThreadPool.zig+6-6| ... | ... | @@ -220,7 +220,7 @@ fn async( |
| 220 | 220 | } |
| 221 | 221 | const pool: *Pool = @alignCast(@ptrCast(userdata)); |
| 222 | 222 | const cpu_count = pool.cpu_count catch { |
| 223 | return asyncParallel(userdata, result.len, result_alignment, context, context_alignment, start) orelse { | |
| 223 | return asyncParallel(userdata, result.len, result_alignment, context, context_alignment, start) catch { | |
| 224 | 224 | start(context.ptr, result.ptr); |
| 225 | 225 | return null; |
| 226 | 226 | }; |
| ... | ... | @@ -291,8 +291,8 @@ fn asyncParallel( |
| 291 | 291 | context: []const u8, |
| 292 | 292 | context_alignment: std.mem.Alignment, |
| 293 | 293 | start: *const fn (context: *const anyopaque, result: *anyopaque) void, |
| 294 | ) ?*Io.AnyFuture { | |
| 295 | if (builtin.single_threaded) return null; | |
| 294 | ) error{OutOfMemory}!*Io.AnyFuture { | |
| 295 | if (builtin.single_threaded) unreachable; | |
| 296 | 296 | |
| 297 | 297 | const pool: *Pool = @alignCast(@ptrCast(userdata)); |
| 298 | 298 | const cpu_count = pool.cpu_count catch 1; |
| ... | ... | @@ -300,7 +300,7 @@ fn asyncParallel( |
| 300 | 300 | const context_offset = context_alignment.forward(@sizeOf(AsyncClosure)); |
| 301 | 301 | const result_offset = result_alignment.forward(context_offset + context.len); |
| 302 | 302 | const n = result_offset + result_len; |
| 303 | const closure: *AsyncClosure = @alignCast(@ptrCast(gpa.alignedAlloc(u8, .of(AsyncClosure), n) catch return null)); | |
| 303 | const closure: *AsyncClosure = @alignCast(@ptrCast(try gpa.alignedAlloc(u8, .of(AsyncClosure), n))); | |
| 304 | 304 | |
| 305 | 305 | closure.* = .{ |
| 306 | 306 | .func = start, |
| ... | ... | @@ -324,7 +324,7 @@ fn asyncParallel( |
| 324 | 324 | pool.threads.ensureTotalCapacity(gpa, thread_capacity) catch { |
| 325 | 325 | pool.mutex.unlock(); |
| 326 | 326 | closure.free(gpa, result_len); |
| 327 | return null; | |
| 327 | return error.OutOfMemory; | |
| 328 | 328 | }; |
| 329 | 329 | |
| 330 | 330 | pool.run_queue.prepend(&closure.runnable.node); |
| ... | ... | @@ -334,7 +334,7 @@ fn asyncParallel( |
| 334 | 334 | assert(pool.run_queue.popFirst() == &closure.runnable.node); |
| 335 | 335 | pool.mutex.unlock(); |
| 336 | 336 | closure.free(gpa, result_len); |
| 337 | return null; | |
| 337 | return error.OutOfMemory; | |
| 338 | 338 | }; |
| 339 | 339 | pool.threads.appendAssumeCapacity(thread); |
| 340 | 340 | } |