| ... | ... | @@ -478,10 +478,15 @@ const AsyncClosure = struct { |
| 478 | 478 | return ac; |
| 479 | 479 | } |
| 480 | 480 | |
| 481 | | fn waitAndDeinit(ac: *AsyncClosure, gpa: Allocator, result: []u8) void { |
| 482 | | ac.reset_event.waitUncancelable(); |
| 481 | fn waitAndDeinit(ac: *AsyncClosure, t: *Threaded, result: []u8) void { |
| 482 | ac.reset_event.wait(t) catch |err| switch (err) { |
| 483 | error.Canceled => { |
| 484 | ac.closure.requestCancel(); |
| 485 | ac.reset_event.waitUncancelable(); |
| 486 | }, |
| 487 | }; |
| 483 | 488 | @memcpy(result, ac.resultPointer()[0..result.len]); |
| 484 | | ac.deinit(gpa); |
| 489 | ac.deinit(t.allocator); |
| 485 | 490 | } |
| 486 | 491 | |
| 487 | 492 | fn deinit(ac: *AsyncClosure, gpa: Allocator) void { |
| ... | ... | @@ -796,7 +801,7 @@ fn await( |
| 796 | 801 | _ = result_alignment; |
| 797 | 802 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 798 | 803 | const closure: *AsyncClosure = @ptrCast(@alignCast(any_future)); |
| 799 | | closure.waitAndDeinit(t.allocator, result); |
| 804 | closure.waitAndDeinit(t, result); |
| 800 | 805 | } |
| 801 | 806 | |
| 802 | 807 | fn cancel( |
| ... | ... | @@ -809,7 +814,7 @@ fn cancel( |
| 809 | 814 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 810 | 815 | const ac: *AsyncClosure = @ptrCast(@alignCast(any_future)); |
| 811 | 816 | ac.closure.requestCancel(); |
| 812 | | ac.waitAndDeinit(t.allocator, result); |
| 817 | ac.waitAndDeinit(t, result); |
| 813 | 818 | } |
| 814 | 819 | |
| 815 | 820 | fn cancelRequested(userdata: ?*anyopaque) bool { |