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