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");
+}