// Copyright 2009 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 "runtime.h" #include "cgocall.h" Cgo *cgo; /* filled in by dynamic linker when Cgo is available */ int64 ncgocall; void cgocall(void (*fn)(void*), void *arg) { CgoWork w; CgoServer *s; ncgocall++; if(cgo == nil) throw("cgocall unavailable"); noteclear(&w.note); w.next = nil; w.fn = fn; w.arg = arg; lock(&cgo->lock); if((s = cgo->idle) != nil) { cgo->idle = s->next; s->work = &w; unlock(&cgo->lock); notewakeup(&s->note); } else { if(cgo->whead == nil) { cgo->whead = &w; } else cgo->wtail->next = &w; cgo->wtail = &w; unlock(&cgo->lock); } notesleep(&w.note); } void runtime·Cgocalls(int64 ret) { ret = ncgocall; FLUSH(&ret); }