summaryrefslogtreecommitdiff
path: root/doc/progs/server1.go
diff options
context:
space:
mode:
authorOndřej Surý <ondrej@sury.org>2011-09-13 13:13:40 +0200
committerOndřej Surý <ondrej@sury.org>2011-09-13 13:13:40 +0200
commit5ff4c17907d5b19510a62e08fd8d3b11e62b431d (patch)
treec0650497e988f47be9c6f2324fa692a52dea82e1 /doc/progs/server1.go
parent80f18fc933cf3f3e829c5455a1023d69f7b86e52 (diff)
downloadgolang-5ff4c17907d5b19510a62e08fd8d3b11e62b431d.tar.gz
Imported Upstream version 60upstream/60
Diffstat (limited to 'doc/progs/server1.go')
-rw-r--r--doc/progs/server1.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/doc/progs/server1.go b/doc/progs/server1.go
new file mode 100644
index 000000000..a4093924b
--- /dev/null
+++ b/doc/progs/server1.go
@@ -0,0 +1,56 @@
+// 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 "fmt"
+
+type request struct {
+ a, b int
+ replyc chan int
+}
+
+type binOp func(a, b int) int
+
+func run(op binOp, req *request) {
+ reply := op(req.a, req.b)
+ req.replyc <- reply
+}
+
+func server(op binOp, service chan *request, quit chan bool) {
+ for {
+ select {
+ case req := <-service:
+ go run(op, req) // don't wait for it
+ case <-quit:
+ return
+ }
+ }
+}
+
+func startServer(op binOp) (service chan *request, quit chan bool) {
+ service = make(chan *request)
+ quit = make(chan bool)
+ go server(op, service, quit)
+ return service, quit
+}
+
+func main() {
+ adder, quit := startServer(func(a, b int) int { return a + b })
+ const N = 100
+ var reqs [N]request
+ for i := 0; i < N; i++ {
+ req := &reqs[i]
+ req.a = i
+ req.b = i + N
+ req.replyc = make(chan int)
+ adder <- req
+ }
+ for i := N - 1; i >= 0; i-- { // doesn't matter what order
+ if <-reqs[i].replyc != N+2*i {
+ fmt.Println("fail at", i)
+ }
+ }
+ quit <- true
+}