| // Copyright 2011 The Go Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style | 
 | // license that can be found in the LICENSE file. | 
 |  | 
 | #include "config.h" | 
 |  | 
 | #include <stddef.h> | 
 | #include <sys/types.h> | 
 | #include <sys/time.h> | 
 | #include <sched.h> | 
 | #include <unistd.h> | 
 |  | 
 | #ifdef HAVE_SYS_SELECT_H | 
 | #include <sys/select.h> | 
 | #endif | 
 |  | 
 | #if defined (__i386__) || defined (__x86_64__) | 
 | #include <xmmintrin.h> | 
 | #endif | 
 |  | 
 | #include "runtime.h" | 
 |  | 
 | /* Spin wait.  */ | 
 |  | 
 | void | 
 | runtime_procyield (uint32 cnt) | 
 | { | 
 |   volatile uint32 i; | 
 |  | 
 |   for (i = 0; i < cnt; ++i) | 
 |     { | 
 | #if defined (__i386__) || defined (__x86_64__) | 
 |       _mm_pause (); | 
 | #endif | 
 |     } | 
 | } | 
 |  | 
 | /* Ask the OS to reschedule this thread.  */ | 
 |  | 
 | void runtime_osyield(void) | 
 |   __attribute__ ((no_split_stack)); | 
 |  | 
 | void | 
 | runtime_osyield (void) | 
 | { | 
 |   sched_yield (); | 
 | } | 
 |  | 
 | /* Sleep for some number of microseconds.  */ | 
 |  | 
 | void | 
 | runtime_usleep (uint32 us) | 
 | { | 
 |   struct timeval tv; | 
 |  | 
 |   tv.tv_sec = us / 1000000; | 
 |   tv.tv_usec = us % 1000000; | 
 |   select (0, NULL, NULL, NULL, &tv); | 
 | } |