summaryrefslogtreecommitdiff
path: root/misc/cgo
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-10-03 10:37:12 -0700
committerRuss Cox <rsc@golang.org>2009-10-03 10:37:12 -0700
commit1bb8f19f5e9016a9eb118b8aba2b5689b4505812 (patch)
tree7b69b0974f4999bac76d11abed2071a2dc9e97aa /misc/cgo
parent6b7539d607f26a1b1cd3eda71fc123ad4d52a133 (diff)
downloadgolang-1bb8f19f5e9016a9eb118b8aba2b5689b4505812.tar.gz
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
Diffstat (limited to 'misc/cgo')
-rw-r--r--misc/cgo/gmp/Makefile21
-rw-r--r--misc/cgo/gmp/fib.go43
-rw-r--r--misc/cgo/gmp/pi.go (renamed from misc/cgo/gmp/pidigits.go)0
-rw-r--r--misc/cgo/stdio/Makefile17
-rw-r--r--misc/cgo/stdio/fib.go47
-rw-r--r--misc/cgo/stdio/file.go43
-rw-r--r--misc/cgo/stdio/hello.go12
7 files changed, 177 insertions, 6 deletions
diff --git a/misc/cgo/gmp/Makefile b/misc/cgo/gmp/Makefile
index b261ff235..c92458c90 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 @@ CGO_LDFLAGS=-lgmp
# 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
+
+# Computes 1000 digits of pi; single-threaded.
+pi: install pi.go
+ $(GC) pi.go
+ $(LD) -o $@ pi.$O
-pidigits.$O: install pidigits.go
- $(GC) pidigits.go
+# Computes 200 Fibonacci numbers; multi-threaded.
+fib: install fib.go
+ $(GC) fib.go
+ $(LD) -o $@ fib.$O
-pidigits: pidigits.$O
- $(LD) -o $@ pidigits.$O
diff --git a/misc/cgo/gmp/fib.go b/misc/cgo/gmp/fib.go
new file mode 100644
index 000000000..02b98b108
--- /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
index d22bbc653..d22bbc653 100644
--- a/misc/cgo/gmp/pidigits.go
+++ b/misc/cgo/gmp/pi.go
diff --git a/misc/cgo/stdio/Makefile b/misc/cgo/stdio/Makefile
new file mode 100644
index 000000000..010e17974
--- /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 000000000..972057e11
--- /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 000000000..7935f8f4d
--- /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 000000000..8809c9a9c
--- /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");
+}