Browse Source

os2: fix using uuid as process handle for darwin, once it goes zombie it changes

Laytan Laats 11 months ago
parent
commit
c2a7c29ce8
1 changed files with 5 additions and 13 deletions
  1. 5 13
      core/os/os2/process_posix_darwin.odin

+ 5 - 13
core/os/os2/process_posix_darwin.odin

@@ -263,13 +263,10 @@ _process_open :: proc(pid: int, flags: Process_Open_Flags) -> (process: Process,
 		return
 		return
 	}
 	}
 
 
-	// XOR fold the UUID so it fits the handle, I think this is enough to verify pid uniqueness.
-	#assert(size_of(uintptr) == size_of(u64))
-	a := intrinsics.unaligned_load((^u64)(&rusage.ri_uuid))
-	b := intrinsics.unaligned_load((^u64)(&rusage.ri_uuid[8]))
-	process.handle = uintptr(a ~ b)
-
-	process.pid = int(pid)
+	// Using the start time as the handle, there is no pidfd or anything on Darwin.
+	// There is a uuid, but once a process becomes a zombie it changes...
+	process.handle = uintptr(rusage.ri_proc_start_abstime)
+	process.pid    = int(pid)
 	return
 	return
 }
 }
 
 
@@ -279,12 +276,7 @@ _process_handle_still_valid :: proc(p: Process) -> Error {
 		return _get_platform_error()
 		return _get_platform_error()
 	}
 	}
 
 
-	// XOR fold the UUID so it fits the handle, I think this is enough to verify pid uniqueness.
-	#assert(size_of(uintptr) == size_of(u64))
-	a := intrinsics.unaligned_load((^u64)(&rusage.ri_uuid))
-	b := intrinsics.unaligned_load((^u64)(&rusage.ri_uuid[8]))
-	handle := uintptr(a ~ b)
-
+	handle := uintptr(rusage.ri_proc_start_abstime)
 	if p.handle != handle {
 	if p.handle != handle {
 		return posix.Errno.ESRCH
 		return posix.Errno.ESRCH
 	}
 	}