// Copyright 2010 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.h"
#include "go-type.h"

func GOMAXPROCS(n int) (ret int) {
	ret = runtime_gomaxprocsfunc(n);
}

func NumCPU() (ret int) {
	ret = runtime_ncpu;
}

func NumCgoCall() (ret int64) {
	M *mp;

	ret = 0;
	for(mp=runtime_atomicloadp(&runtime_allm); mp; mp=mp->alllink)
		ret += mp->ncgocall;
}

func newParFor(nthrmax uint32) (desc *ParFor) {
	desc = runtime_parforalloc(nthrmax);
}

func parForSetup(desc *ParFor, nthr uint32, n uint32, ctx *byte, wait bool, body *byte) {
	runtime_parforsetup(desc, nthr, n, ctx, wait, *(void(**)(ParFor*, uint32))body);
}

func parForDo(desc *ParFor) {
	runtime_parfordo(desc);
}

func parForIters(desc *ParFor, tid uintptr) (start uintptr, end uintptr) {
	runtime_parforiters(desc, tid, &start, &end);
}

func typestring(e Eface) (s String) {
	s = *e.__type_descriptor->__reflection;
}

func golockedOSThread() (ret bool) {
	ret = runtime_lockedOSThread();
}

func NumGoroutine() (ret int) {
	ret = runtime_gcount();
}

func getgoroot() (out String) {
	const byte *p;

	p = runtime_getenv("GOROOT");
	out = runtime_gostringnocopy(p);
}

func runtime_pprof.runtime_cyclesPerSecond() (res int64) {
	res = runtime_tickspersecond();
}

func sync.runtime_procPin() (p int) {
	M *mp;

	mp = runtime_m();
	// Disable preemption.
	mp->locks++;
	p = mp->p->id;
}

func sync.runtime_procUnpin() {
	runtime_m()->locks--;
}
