diff options
Diffstat (limited to 'src/pkg/runtime/cgocall.c')
-rw-r--r-- | src/pkg/runtime/cgocall.c | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/src/pkg/runtime/cgocall.c b/src/pkg/runtime/cgocall.c index f673d1b6e..80ae97e7a 100644 --- a/src/pkg/runtime/cgocall.c +++ b/src/pkg/runtime/cgocall.c @@ -7,16 +7,19 @@ void *initcgo; /* filled in by dynamic linker when Cgo is available */ int64 ncgocall; -void ·entersyscall(void); -void ·exitsyscall(void); +void runtime·entersyscall(void); +void runtime·exitsyscall(void); void -cgocall(void (*fn)(void*), void *arg) +runtime·cgocall(void (*fn)(void*), void *arg) { G *oldlock; - if(initcgo == nil) - throw("cgocall unavailable"); + if(!runtime·iscgo) + runtime·throw("cgocall unavailable"); + + if(fn == 0) + runtime·throw("cgocall nil"); ncgocall++; @@ -34,9 +37,9 @@ cgocall(void (*fn)(void*), void *arg) * M to run goroutines while we are in the * foreign code. */ - ·entersyscall(); - runcgo(fn, arg); - ·exitsyscall(); + runtime·entersyscall(); + runtime·runcgo(fn, arg); + runtime·exitsyscall(); m->lockedg = oldlock; if(oldlock == nil) @@ -51,37 +54,38 @@ cgocall(void (*fn)(void*), void *arg) // arguments back where they came from, and finally returns to the old // stack. void -cgocallback(void (*fn)(void), void *arg, int32 argsize) +runtime·cgocallback(void (*fn)(void), void *arg, int32 argsize) { - Gobuf oldsched; + Gobuf oldsched, oldg1sched; G *g1; void *sp; if(g != m->g0) - throw("bad g in cgocallback"); - - oldsched = m->sched; + runtime·throw("bad g in cgocallback"); g1 = m->curg; + oldsched = m->sched; + oldg1sched = g1->sched; - startcgocallback(g1); + runtime·startcgocallback(g1); sp = g1->sched.sp - argsize; if(sp < g1->stackguard) - throw("g stack overflow in cgocallback"); - mcpy(sp, arg, argsize); + runtime·throw("g stack overflow in cgocallback"); + runtime·mcpy(sp, arg, argsize); - runcgocallback(g1, sp, fn); + runtime·runcgocallback(g1, sp, fn); - mcpy(arg, sp, argsize); + runtime·mcpy(arg, sp, argsize); - endcgocallback(g1); + runtime·endcgocallback(g1); m->sched = oldsched; + g1->sched = oldg1sched; } void -·Cgocalls(int64 ret) +runtime·Cgocalls(int64 ret) { ret = ncgocall; FLUSH(&ret); @@ -91,22 +95,22 @@ void (*_cgo_malloc)(void*); void (*_cgo_free)(void*); void* -cmalloc(uintptr n) +runtime·cmalloc(uintptr n) { - struct a { + struct { uint64 n; void *ret; } a; a.n = n; a.ret = nil; - cgocall(_cgo_malloc, &a); + runtime·cgocall(_cgo_malloc, &a); return a.ret; } void -cfree(void *p) +runtime·cfree(void *p) { - cgocall(_cgo_free, p); + runtime·cgocall(_cgo_free, p); } |