(root)/
gcc-13.2.0/
gcc/
ada/
libgnarl/
thread.c
       1  /****************************************************************************
       2   *                                                                          *
       3   *                         GNAT COMPILER COMPONENTS                         *
       4   *                                                                          *
       5   *                              P T H R E A D                               *
       6   *                                                                          *
       7   *                          C Implementation File                           *
       8   *                                                                          *
       9   *          Copyright (C) 2011-2023, Free Software Foundation, Inc.         *
      10   *                                                                          *
      11   * GNAT is free software;  you can  redistribute it  and/or modify it under *
      12   * terms of the  GNU General Public License as published  by the Free Soft- *
      13   * ware  Foundation;  either version 3,  or (at your option) any later ver- *
      14   * sion.  GNAT is distributed in the hope that it will be useful, but WITH- *
      15   * OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY *
      16   * or FITNESS FOR A PARTICULAR PURPOSE.                                     *
      17   *                                                                          *
      18   * As a special exception under Section 7 of GPL version 3, you are granted *
      19   * additional permissions described in the GCC Runtime Library Exception,   *
      20   * version 3.1, as published by the Free Software Foundation.               *
      21   *                                                                          *
      22   * You should have received a copy of the GNU General Public License and    *
      23   * a copy of the GCC Runtime Library Exception along with this program;     *
      24   * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    *
      25   * <http://www.gnu.org/licenses/>.                                          *
      26   *                                                                          *
      27   * GNAT was originally developed  by the GNAT team at  New York University. *
      28   * Extensive contributions were provided by Ada Core Technologies Inc.      *
      29   *                                                                          *
      30   ****************************************************************************/
      31  
      32  /*  This file provides utility functions to access the threads API          */
      33  
      34  #include "s-oscons.h"
      35  
      36  /* If the clock we used for tasking (CLOCK_RT_Ada) is not the default
      37   * CLOCK_REALTIME, we need to set cond var attributes accordingly.
      38   */
      39  #if CLOCK_RT_Ada != CLOCK_REALTIME
      40  # include <pthread.h>
      41  # include <time.h>
      42  
      43  int
      44  __gnat_pthread_condattr_setup(pthread_condattr_t *attr) {
      45    return pthread_condattr_setclock (attr, CLOCK_RT_Ada);
      46  }
      47  
      48  #else
      49  
      50  int
      51  __gnat_pthread_condattr_setup (void *attr) {
      52    /* Dummy version for other platforms, which may or may not have pthread.h */
      53    return 0;
      54  }
      55  
      56  #endif
      57  
      58  #if defined (__APPLE__)
      59  #include <mach/mach.h>
      60  #include <mach/clock.h>
      61  #endif
      62  
      63  /* Return the clock ticks per nanosecond for Posix systems lacking the
      64     Posix extension function clock_getres, or else 0 nsecs on error.  */
      65  
      66  int
      67  __gnat_clock_get_res (void)
      68  {
      69  #if defined (__APPLE__)
      70    clock_serv_t clock_port;
      71    mach_msg_type_number_t count;
      72    int nsecs;
      73    int result;
      74  
      75    count = 1;
      76    result = host_get_clock_service
      77      (mach_host_self (), SYSTEM_CLOCK, &clock_port);
      78  
      79    if (result == KERN_SUCCESS)
      80      result = clock_get_attributes (clock_port, CLOCK_GET_TIME_RES,
      81        (clock_attr_t) &nsecs, &count);
      82  
      83    if (result == KERN_SUCCESS)
      84      return nsecs;
      85  #endif
      86  
      87    return 0;
      88  }