Commit 0a3ae9dc6e

Andrew Kelley <superjoe30@gmail.com>
2018-08-06 22:48:49
fix std.os.Thread.getCurrentId for linux
1 parent 647fd0f
Changed files (3)
std/os/linux/index.zig
@@ -947,6 +947,10 @@ pub fn getpid() i32 {
     return @bitCast(i32, @truncate(u32, syscall0(SYS_getpid)));
 }
 
+pub fn gettid() i32 {
+    return @bitCast(i32, @truncate(u32, syscall0(SYS_gettid)));
+}
+
 pub fn sigprocmask(flags: u32, noalias set: *const sigset_t, noalias oldset: ?*sigset_t) usize {
     return syscall4(SYS_rt_sigprocmask, flags, @ptrToInt(set), @ptrToInt(oldset), NSIG / 8);
 }
std/os/index.zig
@@ -160,7 +160,7 @@ test "os.getRandomBytes" {
     try getRandomBytes(buf_b[0..]);
 
     // Check if random (not 100% conclusive)
-    assert( !mem.eql(u8, buf_a, buf_b) );
+    assert(!mem.eql(u8, buf_a, buf_b));
 }
 
 /// Raises a signal in the current kernel thread, ending its execution.
@@ -2547,22 +2547,20 @@ pub const Thread = struct {
     };
 
     /// Returns the ID of the calling thread.
-    pub fn currentId() Thread.Id {
-        // TODO: As-is, this function is potentially expensive (making a
-        // syscall on every call).  Once we have support for thread-local
-        // storage (https://github.com/ziglang/zig/issues/924), we could
-        // memoize it.
+    /// Makes a syscall every time the function is called.
+    pub fn getCurrentId() Thread.Id {
         if (use_pthreads) {
             return c.pthread_self();
-        } else return switch (builtin.os) {
-            builtin.Os.linux => linux.getpid(),
+        } else
+            return switch (builtin.os) {
+            builtin.Os.linux => linux.gettid(),
             builtin.Os.windows => windows.GetCurrentThread(),
             else => @compileError("Unsupported OS"),
         };
     }
 
     /// Returns the ID of this thread.
-    pub fn id(self: *const Thread) Thread.Id {
+    pub fn id(self: Thread) Thread.Id {
         return self.data.handle;
     }
 
std/os/test.zig
@@ -34,16 +34,16 @@ test "access file" {
     try os.deleteTree(a, "os_test_tmp");
 }
 
-fn testThreadIdFn(threadId: *os.Thread.Id) void {
-    threadId.* = os.Thread.currentId();
+fn testThreadIdFn(thread_id: *os.Thread.Id) void {
+    thread_id.* = os.Thread.getCurrentId();
 }
 
-test "std.os.Thread.currentId" {
-    var threadCurrentId: os.Thread.Id = undefined;
-    const thread = try os.spawnThread(&threadCurrentId, testThreadIdFn);
-    const threadId = thread.id();
+test "std.os.Thread.getCurrentId" {
+    var thread_current_id: os.Thread.Id = undefined;
+    const thread = try os.spawnThread(&thread_current_id, testThreadIdFn);
+    const thread_id = thread.id();
     thread.wait();
-    assert(threadCurrentId == threadId);
+    assert(thread_current_id == thread_id);
 }
 
 test "spawn threads" {