glibc Breakdown thread pthread

struct pthread *pd = NULL;
int err = allocate_stack(iattr, &pd, &stackaddr, &stacksize);
int retval = 0;
 
if (__glibc_unlikely(err != 0))
  {
    retval = err == ENOMEM ? EAGAIN : err;
    goto out;
  }

Explanation:

This allocates the stack and thread descriptor using allocate_stack. If allocation fails, it translates the error and exits. The line:

retval = err == ENOMEM ? EAGAIN : err;

converts an ENOMEM (out of memory) error to EAGAIN, which is more appropriate for retryable resource exhaustion in pthread_create, aligning with POSIX expectations.