(spipe_t * p, void *buf, size_t n) {  size_t ret = 0;  __spipe_state_t *state = p->state; try_again:  if (p->isclosed || sem_wait(p->spipe_sem) != 0) {   goto out;  }  if (__spipeisclosed_nolock(p, 0)) {   goto out_unlock;  }  