-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathzmq_helper.tcl
103 lines (90 loc) · 1.91 KB
/
zmq_helper.tcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
namespace eval ::zmq {
namespace export *
namespace ensemble create
variable monitorid 0
proc monitor_callback {socket callback} {
if {[catch {$socket recv_monitor_event} d]} {
error $d
} else {
uplevel #0 [list $callback $d]
}
}
proc monitor {context sock callback {events ALL}} {
variable monitorid
set id monitor[incr monitorid]
$sock monitor "inproc://$id" $events
set socket [zmq socket $id $context PAIR]
$socket connect "inproc://$id"
$socket readable [list ::zmq::monitor_callback $socket $callback]
return $id
}
proc have_libsodium {} {
zmq context ctx
zmq socket s ctx PUB
if {[catch {s getsockopt CURVE_SERVER} msg]} {
set have_libsodium 0
} else {
set have_libsodium 1
}
s close
ctx term
return $have_libsodium
}
}
namespace eval ::zmsg {
namespace export *
namespace ensemble create
proc recv {socket} {
set rt [list]
lappend rt [$socket recv]
while {[$socket getsockopt RCVMORE]} {
lappend rt [$socket recv]
}
return $rt
}
proc send {socket msgl} {
foreach m [lrange $msgl 0 end-1] {
$socket sendmore $m
}
$socket send [lindex $msgl end]
}
proc unwrap {msglnm} {
upvar $msglnm msgl
set data ""
if {[llength $msgl]} {
set msgl [lassign $msgl data]
}
if {[llength $msgl] && [string length [lindex $msgl 0]] == 0} {
set msgl [lassign $msgl empty]
}
return $data
}
proc wrap {msgl data} {
return [list $data "" {*}$msgl]
}
proc push {msgl data} {
return [list $data {*}$msgl]
}
proc pop {msglnm} {
upvar $msglnm msgl
set msgl [lassign $msgl first]
return $first
}
proc add {msgl data} {
return [list {*}$msgl $data]
}
proc dump {msgl} {
set rt [list]
if {[llength $msgl]} {
set m .#[pid]
foreach data $msgl {
zmq message $m -data $data
lappend rt [$m dump]
$m close
}
} else {
lappend rt "NULL"
}
return $rt
}
}