mirror of https://github.com/golang/go.git
runtime: move stubs.goc code into runtime.c
Now that the calling conventions are the same, there's no danger to using plain C for these. LGTM=bradfitz R=golang-codereviews, bradfitz CC=dvyukov, golang-codereviews, iant, khr, r https://golang.org/cl/134580043
This commit is contained in:
parent
e8d65b92d7
commit
a09e61395e
|
|
@ -341,3 +341,51 @@ runtime·timediv(int64 v, int32 div, int32 *rem)
|
|||
*rem = v;
|
||||
return res;
|
||||
}
|
||||
|
||||
// Helpers for Go. Must be NOSPLIT, must only call NOSPLIT functions, and must not block.
|
||||
|
||||
#pragma textflag NOSPLIT
|
||||
G*
|
||||
runtime·getg(void)
|
||||
{
|
||||
return g;
|
||||
}
|
||||
|
||||
#pragma textflag NOSPLIT
|
||||
M*
|
||||
runtime·acquirem(void)
|
||||
{
|
||||
g->m->locks++;
|
||||
return g->m;
|
||||
}
|
||||
|
||||
#pragma textflag NOSPLIT
|
||||
void
|
||||
runtime·releasem(M *mp)
|
||||
{
|
||||
mp->locks--;
|
||||
if(mp->locks == 0 && g->preempt) {
|
||||
// restore the preemption request in case we've cleared it in newstack
|
||||
g->stackguard0 = StackPreempt;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma textflag NOSPLIT
|
||||
MCache*
|
||||
runtime·gomcache(void)
|
||||
{
|
||||
return g->m->mcache;
|
||||
}
|
||||
|
||||
#pragma textflag NOSPLIT
|
||||
Slice
|
||||
reflect·typelinks(void)
|
||||
{
|
||||
extern Type *runtime·typelink[], *runtime·etypelink[];
|
||||
Slice ret;
|
||||
|
||||
ret.array = (byte*)runtime·typelink;
|
||||
ret.len = runtime·etypelink - runtime·typelink;
|
||||
ret.cap = ret.len;
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,57 +0,0 @@
|
|||
// Copyright 2014 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.
|
||||
|
||||
package runtime
|
||||
#include "runtime.h"
|
||||
#include "arch_GOARCH.h"
|
||||
#include "malloc.h"
|
||||
#include "stack.h"
|
||||
#include "textflag.h"
|
||||
|
||||
// This file contains functions called by Go but written
|
||||
// in C. These functions are problematic for the garbage
|
||||
// collector and stack copier because we don't have
|
||||
// stack maps for them. So we must ensure that the
|
||||
// garbage collector and stack copier cannot see these
|
||||
// frames. So we impose the following invariants:
|
||||
|
||||
// 1) Functions should be marked NOSPLIT and call
|
||||
// out to only NOSPLIT functions (recursively).
|
||||
// 2) Functions should not block.
|
||||
|
||||
// These invariants do not hold yet but will be established once we have
|
||||
// finished converting runtime support code from C to Go.
|
||||
|
||||
#pragma textflag NOSPLIT
|
||||
func runtime·getg() (ret *G) {
|
||||
ret = g;
|
||||
}
|
||||
|
||||
#pragma textflag NOSPLIT
|
||||
func runtime·acquirem() (ret *M) {
|
||||
ret = g->m;
|
||||
ret->locks++;
|
||||
}
|
||||
|
||||
#pragma textflag NOSPLIT
|
||||
func runtime·releasem(mp *M) {
|
||||
mp->locks--;
|
||||
if(mp->locks == 0 && g->preempt) {
|
||||
// restore the preemption request in case we've cleared it in newstack
|
||||
g->stackguard0 = StackPreempt;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma textflag NOSPLIT
|
||||
func runtime·gomcache() (ret *MCache) {
|
||||
ret = g->m->mcache;
|
||||
}
|
||||
|
||||
#pragma textflag NOSPLIT
|
||||
func reflect·typelinks() (ret Slice) {
|
||||
extern Type *runtime·typelink[], *runtime·etypelink[];
|
||||
ret.array = (byte*)runtime·typelink;
|
||||
ret.len = runtime·etypelink - runtime·typelink;
|
||||
ret.cap = ret.len;
|
||||
}
|
||||
Loading…
Reference in New Issue