gcc/libgo/runtime/yield.c
Ian Lance Taylor 980f9a0a4b runtime: copy signal code from Go 1.7 runtime
Add a little shell script to auto-generate runtime.sigtable from the
    known signal names.
    
    Force the main package to always import the runtime package.  Otherwise
    some runtime package global variables may never be initialized.
    
    Set the syscallsp and syscallpc fields of g when entering a syscall, so
    that the runtime package knows when a g is executing a syscall.
    
    Fix runtime.funcPC to avoid dead store elimination of the interface
    value when the function is inlined.
    
    Reviewed-on: https://go-review.googlesource.com/33025

From-SVN: r242060
2016-11-10 22:53:23 +00:00

60 lines
999 B
C

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