(root)/
Python-3.12.0/
Python/
thread_pthread_stubs.h
       1  #include "cpython/pthread_stubs.h"
       2  
       3  // mutex
       4  int
       5  pthread_mutex_init(pthread_mutex_t *restrict mutex,
       6                     const pthread_mutexattr_t *restrict attr)
       7  {
       8      return 0;
       9  }
      10  
      11  int
      12  pthread_mutex_destroy(pthread_mutex_t *mutex)
      13  {
      14      return 0;
      15  }
      16  
      17  int
      18  pthread_mutex_trylock(pthread_mutex_t *mutex)
      19  {
      20      return 0;
      21  }
      22  
      23  int
      24  pthread_mutex_lock(pthread_mutex_t *mutex)
      25  {
      26      return 0;
      27  }
      28  
      29  int
      30  pthread_mutex_unlock(pthread_mutex_t *mutex)
      31  {
      32      return 0;
      33  }
      34  
      35  // condition
      36  int
      37  pthread_cond_init(pthread_cond_t *restrict cond,
      38                    const pthread_condattr_t *restrict attr)
      39  {
      40      return 0;
      41  }
      42  
      43  PyAPI_FUNC(int)pthread_cond_destroy(pthread_cond_t *cond)
      44  {
      45      return 0;
      46  }
      47  
      48  int
      49  pthread_cond_wait(pthread_cond_t *restrict cond,
      50                    pthread_mutex_t *restrict mutex)
      51  {
      52      return 0;
      53  }
      54  
      55  int
      56  pthread_cond_timedwait(pthread_cond_t *restrict cond,
      57                         pthread_mutex_t *restrict mutex,
      58                         const struct timespec *restrict abstime)
      59  {
      60      return 0;
      61  }
      62  
      63  int
      64  pthread_cond_signal(pthread_cond_t *cond)
      65  {
      66      return 0;
      67  }
      68  
      69  int
      70  pthread_condattr_init(pthread_condattr_t *attr)
      71  {
      72      return 0;
      73  }
      74  
      75  int
      76  pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t clock_id)
      77  {
      78      return 0;
      79  }
      80  
      81  // pthread
      82  int
      83  pthread_create(pthread_t *restrict thread,
      84                 const pthread_attr_t *restrict attr,
      85                 void *(*start_routine)(void *),
      86                 void *restrict arg)
      87  {
      88      return EAGAIN;
      89  }
      90  
      91  int
      92  pthread_detach(pthread_t thread)
      93  {
      94      return 0;
      95  }
      96  
      97  PyAPI_FUNC(pthread_t) pthread_self(void)
      98  {
      99      return 0;
     100  }
     101  
     102  int
     103  pthread_exit(void *retval)
     104  {
     105      exit(0);
     106  }
     107  
     108  int
     109  pthread_attr_init(pthread_attr_t *attr)
     110  {
     111      return 0;
     112  }
     113  
     114  int
     115  pthread_attr_setstacksize(
     116      pthread_attr_t *attr, size_t stacksize)
     117  {
     118      return 0;
     119  }
     120  
     121  int
     122  pthread_attr_destroy(pthread_attr_t *attr)
     123  {
     124      return 0;
     125  }
     126  
     127  
     128  typedef struct py_stub_tls_entry py_tls_entry;
     129  
     130  #define py_tls_entries (_PyRuntime.threads.stubs.tls_entries)
     131  
     132  int
     133  pthread_key_create(pthread_key_t *key, void (*destr_function)(void *))
     134  {
     135      if (!key) {
     136          return EINVAL;
     137      }
     138      if (destr_function != NULL) {
     139          Py_FatalError("pthread_key_create destructor is not supported");
     140      }
     141      for (pthread_key_t idx = 0; idx < PTHREAD_KEYS_MAX; idx++) {
     142          if (!py_tls_entries[idx].in_use) {
     143              py_tls_entries[idx].in_use = true;
     144              *key = idx;
     145              return 0;
     146          }
     147      }
     148      return EAGAIN;
     149  }
     150  
     151  int
     152  pthread_key_delete(pthread_key_t key)
     153  {
     154      if (key < 0 || key >= PTHREAD_KEYS_MAX || !py_tls_entries[key].in_use) {
     155          return EINVAL;
     156      }
     157      py_tls_entries[key].in_use = false;
     158      py_tls_entries[key].value = NULL;
     159      return 0;
     160  }
     161  
     162  
     163  void *
     164  pthread_getspecific(pthread_key_t key) {
     165      if (key < 0 || key >= PTHREAD_KEYS_MAX || !py_tls_entries[key].in_use) {
     166          return NULL;
     167      }
     168      return py_tls_entries[key].value;
     169  }
     170  
     171  int
     172  pthread_setspecific(pthread_key_t key, const void *value)
     173  {
     174      if (key < 0 || key >= PTHREAD_KEYS_MAX || !py_tls_entries[key].in_use) {
     175          return EINVAL;
     176      }
     177      py_tls_entries[key].value = (void *)value;
     178      return 0;
     179  }
     180  
     181  // let thread_pthread define the Python API
     182  #include "thread_pthread.h"