Support for TLS on Win32

master
LemonBoy 2019-10-06 16:45:51 +02:00
parent 93a49076f7
commit 6a687bda76
3 changed files with 12 additions and 4 deletions

View File

@ -116,7 +116,6 @@ test "AtomicFile" {
test "thread local storage" {
if (builtin.single_threaded) return error.SkipZigTest;
if (builtin.os == .windows) return error.SkipZigTest;
const thread1 = try Thread.spawn({}, testTls);
const thread2 = try Thread.spawn({}, testTls);
testTls({});

View File

@ -1,4 +1,5 @@
const std = @import("std");
const builtin = @import("builtin");
export var _tls_index: u32 = std.os.windows.TLS_OUT_OF_INDEXES;
export var _tls_start: u8 linksection(".tls") = 0;
@ -6,6 +7,17 @@ export var _tls_end: u8 linksection(".tls$ZZZ") = 0;
export var __xl_a: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLA") = null;
export var __xl_z: std.os.windows.PIMAGE_TLS_CALLBACK linksection(".CRT$XLZ") = null;
comptime {
if (builtin.arch == .i386) {
// The __tls_array is the offset of the ThreadLocalStoragePointer field
// in the TEB block whose base address held in the %fs segment.
asm (
\\ .global __tls_array
\\ __tls_array = 0x2C
);
}
}
// TODO this is how I would like it to be expressed
// TODO also note, ReactOS has a +1 on StartAddressOfRawData and AddressOfCallBacks. Investigate
// why they do that.

View File

@ -687,9 +687,6 @@ fn getNull() ?*i32 {
}
test "thread local variable" {
if (builtin.os == .windows and builtin.arch == .i386)
return error.SkipZigTest;
const S = struct {
threadlocal var t: i32 = 1234;
};