text: #include <semaphore.h>
  #include <stdatomic.h>
  
  #include "atomic.h"
  #include "threads_impl.h"
  
  int sem_timedwait(sem_t* restrict sem, const struct timespec* restrict at) {
    if (!sem_trywait(sem))
      return 0;
  
    int spins = 100;
    while (spins-- && atomic_load(&sem->_s_value) <= 0 && !atomic_load(&sem->_s_waiters))
      a_spin();
  
    while (sem_trywait(sem)) {
      atomic_fetch_add(&sem->_s_waiters, 1);
      a_cas_shim(&sem->_s_value, 0, -1);
      int r = __timedwait(&sem->_s_value, -1, CLOCK_REALTIME, at);
      if (r) {
        errno = r;
        return -1;
      }
    }
    return 0;
  }
  