| ... | @@ -252,12 +252,37 @@ pub const Thread = struct { | ... | @@ -252,12 +252,37 @@ pub const Thread = struct { |
| 252 | } | 252 | } |
| 253 | } | 253 | } |
| 254 | fn posixThreadMain(ctx: ?*c_void) callconv(.C) ?*c_void { | 254 | fn posixThreadMain(ctx: ?*c_void) callconv(.C) ?*c_void { |
| 255 | if (@sizeOf(Context) == 0) { | 255 | const arg = if (@sizeOf(Context) == 0) {} else @ptrCast(*Context, @alignCast(@alignOf(Context), ctx)).*; |
| 256 | _ = startFn({}); | 256 | |
| 257 | return null; | 257 | switch (@typeInfo(@TypeOf(startFn).ReturnType)) { |
| 258 | } else { | 258 | .NoReturn => { |
| 259 | _ = startFn(@ptrCast(*const Context, @alignCast(@alignOf(Context), ctx)).*); | 259 | startFn(arg); |
| 260 | return null; | 260 | }, |
| | 261 | .Void => { |
| | 262 | startFn(arg); |
| | 263 | return null; |
| | 264 | }, |
| | 265 | .Int => |info| { |
| | 266 | if (info.bits != 8) { |
| | 267 | @compileError(bad_startfn_ret); |
| | 268 | } |
| | 269 | // pthreads don't support exit status, ignore value |
| | 270 | _ = startFn(arg); |
| | 271 | return null; |
| | 272 | }, |
| | 273 | .ErrorUnion => |info| { |
| | 274 | if (info.payload != void) { |
| | 275 | @compileError(bad_startfn_ret); |
| | 276 | } |
| | 277 | startFn(arg) catch |err| { |
| | 278 | std.debug.warn("error: {}\n", .{@errorName(err)}); |
| | 279 | if (@errorReturnTrace()) |trace| { |
| | 280 | std.debug.dumpStackTrace(trace.*); |
| | 281 | } |
| | 282 | }; |
| | 283 | return 0; |
| | 284 | }, |
| | 285 | else => @compileError(bad_startfn_ret), |
| 261 | } | 286 | } |
| 262 | } | 287 | } |
| 263 | }; | 288 | }; |