[ received from Ed Maste at FreeBSD ] We just had a FreeBSD bug submitted for a failure arising from libc++'s use of pthread_equal. FreeBSD's pthread_equal stub implementation (used in non-threaded programs) returns true unconditionally, since a non-threaded program cannot have two different threads. However, std::thread::id defines a special value that should not equal any real thread, and this is may be passed to pthread_equal. See FreeBSD PR 239550 for more details, and PR 239038 for the user-facing issue that prompted this. https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=239550 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=239038 Now the most expedient fix is probably for us to make pthread_equal somewhat less of a stub, but for correctness it seems __libcpp_thread_id_equal would need to check for libc++'s special value before calling pthread_equal.
I've looked at this, and it seems like the best place to fix this is in __thread_id, which is where the "no thread == 0" is imposed. However, the recursive_timed_mutex implementation doesn't use __thread_id, but instead goes right to the underlying type __libcpp_thread_id. Also, we have no tests :-(
Fixed in revision 368916.