| // 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); |
| } |