4b3b87d25eecb430989492beb5f2ec81dc634d11
[svn42.git] / go / door_client_zmq / zeromq.go
1 // (c) Bernhard Tittelbach, 2013
2
3 package main
4
5 import (
6     zmq "github.com/vaughan0/go-zmq"
7  )
8
9 // ---------- ZeroMQ Code -------------
10
11 func ZmqsInit(cmd_port, sub_port string)  (cmd_chans, pub_chans *zmq.Channels) {
12
13     cmd_ctx, err := zmq.NewContext()
14     if err != nil {
15         panic(err)
16     }
17     //close only on panic, otherwise leave open:
18     defer func(){ if r:= recover(); r != nil { cmd_ctx.Close(); panic(r) } }()
19
20     pub_ctx, err := zmq.NewContext()
21     if err != nil {
22         panic(err)
23     }
24     defer func() { if r:= recover(); r != nil { pub_ctx.Close(); panic(r) } }()
25
26     cmd_sock, err := cmd_ctx.Socket(zmq.Req)
27     if err != nil {
28         panic(err)
29     }
30     defer func() { if r:= recover(); r != nil { cmd_sock.Close(); panic(r) } }()
31
32     pub_sock, err := pub_ctx.Socket(zmq.Sub)
33     if err != nil {
34         panic(err)
35     }
36     defer func() { if r:= recover(); r != nil { pub_sock.Close(); panic(r) } }()
37
38     if err = cmd_sock.Bind(cmd_port); err != nil {
39         panic(err)
40     }
41
42     if err = pub_sock.Bind(sub_port); err != nil {
43         panic(err)
44     }
45
46     cmd_chans = cmd_sock.Channels()
47     pub_chans = cmd_sock.Channels()
48     go zmqsHandleError(cmd_chans, pub_chans)
49     return
50 }
51
52 func zmqsHandleError(cmd_chans, pub_chans *zmq.Channels) {
53     for {
54         select {
55             case cmd_error := <- cmd_chans.Errors():
56                 cmd_chans.Close()
57                 pub_chans.Close()
58                 panic(cmd_error)
59             case pub_error := <- pub_chans.Errors():
60                 cmd_chans.Close()
61                 pub_chans.Close()
62                 panic(pub_error)
63         }
64     }
65 }