Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> writes: > Sean Christopherson <seanjc@xxxxxxxxxx> writes: > >> On Tue, Oct 04, 2022, Vitaly Kuznetsov wrote: > > ... > >>> + >>> + r = pthread_cancel(thread); >>> + TEST_ASSERT(r == 0, >> >> !r is generally preferred over "r == 0" >> >>> + "pthread_cancel on vcpu_id=%d failed with errno=%d", >>> + vcpu->id, r); >> >> Do you happen to know if errno is preserved? I.e. if TEST_ASSERT()'s print of >> errno will capture the right errno? If so, this and the pthread_join() assert >> can be: >> >> TEST_ASSERT(!r, pthread_cancel() failed on vcpu_id=%d, vcpu->id); >> > > The example from 'man 3 pthread_cancel' makes me think errno is not > set. 'man 3 errno' confirms that: > > " > Note that the POSIX threads APIs do not set errno on error. > Instead, on failure they return an error number as the function result. > These error numbers have the same meanings as the error numbers returned > in errno by other APIs. > " > > but nothing stops us from doing something like > > #include <errno.h> > ... > > errno = pthread_cancel(thread); > TEST_ASSERT(!errno, pthread_cancel() failed on vcpu_id=%d, vcpu->id); > > I believe. ... only the fact that this won't be thread safe :-( i.e. if we also try setting 'errno' from vcpu_thread() (where the pattern for pthread_setcanceltype() is exactly the same), we will likely be reporting the wrong errno. I think it's better to keep reporting 'r' for now (and maybe think about pthread* wrappers later). -- Vitaly