8c, 8l dynamic loading support.
better mach binaries.
cgo working on darwin+linux amd64+386.
eliminated context switches - pi is 30x faster.
add libcgo to build.
on snow leopard:
- non-cgo binaries work; all tests pass.
- cgo binaries work on amd64 but not 386.
R=r
DELTA=2031 (1316 added, 626 deleted, 89 changed)
OCL=35264
CL=35304
diff --git a/misc/cgo/gmp/Makefile b/misc/cgo/gmp/Makefile
index b261ff2..c92458c 100644
--- a/misc/cgo/gmp/Makefile
+++ b/misc/cgo/gmp/Makefile
@@ -5,6 +5,9 @@
include $(GOROOT)/src/Make.$(GOARCH)
TARG=gmp
+
+# Can have plain GOFILES too, but this example doesn't.
+
CGOFILES=\
gmp.go
@@ -15,15 +18,21 @@
# alternate installation of the library:
# CGO_CFLAGS=-I/home/rsc/gmp32/include
# CGO_LDFLAGS+=-L/home/rsc/gmp32/lib
+# Note the += on the second line.
-# Can have plain GOFILES too, but this example doesn't.
+CLEANFILES+=pi fib
include $(GOROOT)/src/Make.pkg
-# Simple test program
+# Simple test programs
-pidigits.$O: install pidigits.go
- $(GC) pidigits.go
+# Computes 1000 digits of pi; single-threaded.
+pi: install pi.go
+ $(GC) pi.go
+ $(LD) -o $@ pi.$O
-pidigits: pidigits.$O
- $(LD) -o $@ pidigits.$O
+# Computes 200 Fibonacci numbers; multi-threaded.
+fib: install fib.go
+ $(GC) fib.go
+ $(LD) -o $@ fib.$O
+
diff --git a/misc/cgo/gmp/fib.go b/misc/cgo/gmp/fib.go
new file mode 100644
index 0000000..02b98b1
--- /dev/null
+++ b/misc/cgo/gmp/fib.go
@@ -0,0 +1,43 @@
+// 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.
+
+// Compute Fibonacci numbers with two goroutines
+// that pass integers back and forth. No actual
+// concurrency, just threads and synchronization
+// and foreign code on multiple pthreads.
+
+package main
+
+import (
+ big "gmp";
+ "runtime";
+)
+
+func fibber(c chan *big.Int, out chan string, n int64) {
+ // Keep the fibbers in dedicated operating system
+ // threads, so that this program tests coordination
+ // between pthreads and not just goroutines.
+ runtime.LockOSThread();
+
+ i := big.NewInt(n);
+ if n == 0 {
+ c <- i;
+ }
+ for {
+ j := <-c;
+ out <- j.String();
+ i.Add(i, j);
+ c <- i;
+ }
+}
+
+func main() {
+ c := make(chan *big.Int);
+ out := make(chan string);
+ go fibber(c, out, 0);
+ go fibber(c, out, 1);
+ for i := 0; i < 200; i++ {
+ println(<-out);
+ }
+}
diff --git a/misc/cgo/gmp/pidigits.go b/misc/cgo/gmp/pi.go
similarity index 100%
rename from misc/cgo/gmp/pidigits.go
rename to misc/cgo/gmp/pi.go
diff --git a/misc/cgo/stdio/Makefile b/misc/cgo/stdio/Makefile
new file mode 100644
index 0000000..010e179
--- /dev/null
+++ b/misc/cgo/stdio/Makefile
@@ -0,0 +1,17 @@
+# 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 $(GOROOT)/src/Make.$(GOARCH)
+
+TARG=stdio
+CGOFILES=\
+ file.go
+
+CLEANFILES+=hello fib chain
+
+include $(GOROOT)/src/Make.pkg
+
+%: install %.go
+ $(GC) $*.go
+ $(LD) -o $@ $*.$O
diff --git a/misc/cgo/stdio/fib.go b/misc/cgo/stdio/fib.go
new file mode 100644
index 0000000..972057e
--- /dev/null
+++ b/misc/cgo/stdio/fib.go
@@ -0,0 +1,47 @@
+// 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.
+
+// Compute Fibonacci numbers with two goroutines
+// that pass integers back and forth. No actual
+// concurrency, just threads and synchronization
+// and foreign code on multiple pthreads.
+
+package main
+
+import (
+ "runtime";
+ "stdio";
+ "strconv";
+)
+
+func fibber(c, out chan int64, i int64) {
+ // Keep the fibbers in dedicated operating system
+ // threads, so that this program tests coordination
+ // between pthreads and not just goroutines.
+ runtime.LockOSThread();
+
+ if i == 0 {
+ c <- i;
+ }
+ for {
+ j := <-c;
+ stdio.Puts(strconv.Itoa64(j));
+ out <- j;
+ <-out;
+ i += j;
+ c <- i;
+ }
+}
+
+func main() {
+ c := make(chan int64);
+ out := make(chan int64);
+ go fibber(c, out, 0);
+ go fibber(c, out, 1);
+ <-out;
+ for i := 0; i < 90; i++ {
+ out <- 1;
+ <-out;
+ }
+}
diff --git a/misc/cgo/stdio/file.go b/misc/cgo/stdio/file.go
new file mode 100644
index 0000000..7935f8f
--- /dev/null
+++ b/misc/cgo/stdio/file.go
@@ -0,0 +1,43 @@
+// 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.
+
+/*
+A trivial example of wrapping a C library in Go.
+For a more complex example and explanation,
+see ../gmp/gmp.go.
+*/
+
+package stdio
+
+// TODO(rsc): Remove fflushstdout when C.fflush(C.stdout) works in cgo.
+
+/*
+#include <stdio.h>
+#include <stdlib.h>
+
+void fflushstdout(void) { fflush(stdout); }
+*/
+import "C"
+import "unsafe"
+
+/*
+type File C.FILE
+
+var Stdout = (*File)(C.stdout)
+var Stderr = (*File)(C.stderr)
+
+func (f *File) WriteString(s string) {
+ p := C.CString(s);
+ C.fputs(p, (*C.FILE)(f));
+ C.free(p);
+}
+*/
+
+func Puts(s string) {
+ p := C.CString(s);
+ C.puts(p);
+ C.free(unsafe.Pointer(p));
+ C.fflushstdout();
+}
+
diff --git a/misc/cgo/stdio/hello.go b/misc/cgo/stdio/hello.go
new file mode 100644
index 0000000..8809c9a
--- /dev/null
+++ b/misc/cgo/stdio/hello.go
@@ -0,0 +1,12 @@
+// 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.
+
+package main
+
+import "stdio"
+
+func main() {
+// stdio.Stdout.WriteString("hello, world\n");
+ stdio.Puts("hello, world");
+}