github.com/alexanius/gollvm12@v0.0.0-20230419200121-b152358b84f3/gofrontend/libgo/runtime/yield.c (about)

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  #include "config.h"
     6  
     7  #include <stddef.h>
     8  #include <sys/types.h>
     9  #include <sys/time.h>
    10  #include <sched.h>
    11  #include <unistd.h>
    12  
    13  #ifdef HAVE_SYS_SELECT_H
    14  #include <sys/select.h>
    15  #endif
    16  
    17  #if defined (__i386__) || defined (__x86_64__)
    18  #include <xmmintrin.h>
    19  #endif
    20  
    21  #include "runtime.h"
    22  
    23  /* Spin wait.  */
    24  
    25  void
    26  runtime_procyield (uint32 cnt)
    27  {
    28    volatile uint32 i;
    29  
    30    for (i = 0; i < cnt; ++i)
    31      {
    32  #if defined (__i386__) || defined (__x86_64__)
    33        _mm_pause ();
    34  #endif
    35      }
    36  }
    37  
    38  /* Ask the OS to reschedule this thread.  */
    39  
    40  void runtime_osyield(void)
    41    __attribute__ ((no_split_stack));
    42  
    43  void
    44  runtime_osyield (void)
    45  {
    46    sched_yield ();
    47  }
    48  
    49  /* Sleep for some number of microseconds.  */
    50  
    51  void
    52  runtime_usleep (uint32 us)
    53  {
    54    struct timeval tv;
    55  
    56    tv.tv_sec = us / 1000000;
    57    tv.tv_usec = us % 1000000;
    58    select (0, NULL, NULL, NULL, &tv);
    59  }