Home | History | Annotate | Line # | Download | only in gcn
gthr-gcn.h revision 1.1.1.1
      1  1.1  mrg /* Threads compatibility routines for libgcc2 and libobjc.  */
      2  1.1  mrg /* Compile this one with gcc.  */
      3  1.1  mrg /* Copyright (C) 2019-2020 Free Software Foundation, Inc.
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      8  1.1  mrg the terms of the GNU General Public License as published by the Free
      9  1.1  mrg Software Foundation; either version 3, or (at your option) any later
     10  1.1  mrg version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15  1.1  mrg for more details.
     16  1.1  mrg 
     17  1.1  mrg Under Section 7 of GPL version 3, you are granted additional
     18  1.1  mrg permissions described in the GCC Runtime Library Exception, version
     19  1.1  mrg 3.1, as published by the Free Software Foundation.
     20  1.1  mrg 
     21  1.1  mrg You should have received a copy of the GNU General Public License and
     22  1.1  mrg a copy of the GCC Runtime Library Exception along with this program;
     23  1.1  mrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     24  1.1  mrg <http://www.gnu.org/licenses/>.  */
     25  1.1  mrg 
     26  1.1  mrg /* AMD GCN does not support dynamic creation of threads.  There may be many
     27  1.1  mrg    hardware threads, but they're all created simultaneously at launch time.
     28  1.1  mrg 
     29  1.1  mrg    This implementation is intended to provide mutexes for libgfortran, etc.
     30  1.1  mrg    It is not intended to provide a TLS implementation at this time,
     31  1.1  mrg    although that may be added later if needed.
     32  1.1  mrg 
     33  1.1  mrg    __gthread_active_p returns "1" to ensure that mutexes are used, and that
     34  1.1  mrg    programs attempting to use emutls will fail with the appropriate abort.
     35  1.1  mrg    It is expected that the TLS tests will fail.  */
     36  1.1  mrg 
     37  1.1  mrg #ifndef GCC_GTHR_GCN_H
     38  1.1  mrg #define GCC_GTHR_GCN_H
     39  1.1  mrg 
     40  1.1  mrg #define __GTHREADS 1
     41  1.1  mrg 
     42  1.1  mrg #ifdef __cplusplus
     43  1.1  mrg extern "C" {
     44  1.1  mrg #endif
     45  1.1  mrg 
     46  1.1  mrg #ifdef _LIBOBJC
     47  1.1  mrg #error "Objective C is not supported on AMD GCN"
     48  1.1  mrg #else
     49  1.1  mrg 
     50  1.1  mrg static inline int
     51  1.1  mrg __gthread_active_p (void)
     52  1.1  mrg {
     53  1.1  mrg   return 1;
     54  1.1  mrg }
     55  1.1  mrg 
     56  1.1  mrg typedef int __gthread_key_t;
     57  1.1  mrg typedef int __gthread_once_t;
     58  1.1  mrg typedef int __gthread_mutex_t;
     59  1.1  mrg typedef int __gthread_recursive_mutex_t;
     60  1.1  mrg 
     61  1.1  mrg #define __GTHREAD_ONCE_INIT 0
     62  1.1  mrg #define __GTHREAD_MUTEX_INIT 0
     63  1.1  mrg #define __GTHREAD_RECURSIVE_MUTEX_INIT 0
     64  1.1  mrg 
     65  1.1  mrg static inline int
     66  1.1  mrg __gthread_once (__gthread_once_t *__once __attribute__((unused)),
     67  1.1  mrg 		void (*__func) (void) __attribute__((unused)))
     68  1.1  mrg {
     69  1.1  mrg   return 0;
     70  1.1  mrg }
     71  1.1  mrg 
     72  1.1  mrg static inline int
     73  1.1  mrg __gthread_key_create (__gthread_key_t *__key __attribute__((unused)),
     74  1.1  mrg 		      void (*__dtor) (void *) __attribute__((unused)))
     75  1.1  mrg {
     76  1.1  mrg   /* Operation is not supported.  */
     77  1.1  mrg   return -1;
     78  1.1  mrg }
     79  1.1  mrg 
     80  1.1  mrg static inline int
     81  1.1  mrg __gthread_key_delete (__gthread_key_t __key __attribute__ ((__unused__)))
     82  1.1  mrg {
     83  1.1  mrg   /* Operation is not supported.  */
     84  1.1  mrg   return -1;
     85  1.1  mrg }
     86  1.1  mrg 
     87  1.1  mrg static inline void *
     88  1.1  mrg __gthread_getspecific (__gthread_key_t __key __attribute__((unused)))
     89  1.1  mrg {
     90  1.1  mrg   return NULL;
     91  1.1  mrg }
     92  1.1  mrg 
     93  1.1  mrg static inline int
     94  1.1  mrg __gthread_setspecific (__gthread_key_t __key __attribute__((unused)),
     95  1.1  mrg 		       const void *__ptr __attribute__((unused)))
     96  1.1  mrg {
     97  1.1  mrg   /* Operation is not supported.  */
     98  1.1  mrg   return -1;
     99  1.1  mrg }
    100  1.1  mrg 
    101  1.1  mrg static inline int
    102  1.1  mrg __gthread_mutex_destroy (__gthread_mutex_t *__mutex __attribute__((unused)))
    103  1.1  mrg {
    104  1.1  mrg   return 0;
    105  1.1  mrg }
    106  1.1  mrg 
    107  1.1  mrg static inline int
    108  1.1  mrg __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
    109  1.1  mrg {
    110  1.1  mrg   return 0;
    111  1.1  mrg }
    112  1.1  mrg 
    113  1.1  mrg 
    114  1.1  mrg static inline int
    115  1.1  mrg __gthread_mutex_lock (__gthread_mutex_t *__mutex)
    116  1.1  mrg {
    117  1.1  mrg   while (__sync_lock_test_and_set (__mutex, 1))
    118  1.1  mrg     asm volatile ("s_sleep\t1" ::: "memory");
    119  1.1  mrg 
    120  1.1  mrg   return 0;
    121  1.1  mrg }
    122  1.1  mrg 
    123  1.1  mrg static inline int
    124  1.1  mrg __gthread_mutex_trylock (__gthread_mutex_t *__mutex)
    125  1.1  mrg {
    126  1.1  mrg   return __sync_lock_test_and_set (__mutex, 1);
    127  1.1  mrg }
    128  1.1  mrg 
    129  1.1  mrg static inline int
    130  1.1  mrg __gthread_mutex_unlock (__gthread_mutex_t *__mutex)
    131  1.1  mrg {
    132  1.1  mrg   __sync_lock_release (__mutex);
    133  1.1  mrg 
    134  1.1  mrg   return 0;
    135  1.1  mrg }
    136  1.1  mrg 
    137  1.1  mrg static inline int
    138  1.1  mrg __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
    139  1.1  mrg {
    140  1.1  mrg   /* Operation is not supported.  */
    141  1.1  mrg   return -1;
    142  1.1  mrg }
    143  1.1  mrg 
    144  1.1  mrg static inline int
    145  1.1  mrg __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
    146  1.1  mrg {
    147  1.1  mrg   /* Operation is not supported.  */
    148  1.1  mrg   return -1;
    149  1.1  mrg }
    150  1.1  mrg 
    151  1.1  mrg static inline int
    152  1.1  mrg __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
    153  1.1  mrg {
    154  1.1  mrg   /* Operation is not supported.  */
    155  1.1  mrg   return -1;
    156  1.1  mrg }
    157  1.1  mrg #endif /* _LIBOBJC */
    158  1.1  mrg 
    159  1.1  mrg #ifdef __cplusplus
    160  1.1  mrg }
    161  1.1  mrg #endif
    162  1.1  mrg 
    163  1.1  mrg #endif /* ! GCC_GTHR_GCN_H */
    164