Commit a09e6139 authored by Russ Cox's avatar Russ Cox

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
parent e8d65b92
......@@ -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;
}
// 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;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment