Skip to content

Commit 224160f

Browse files
committed
Hack to try getting callbacks to work with threads
1 parent 8eac94d commit 224160f

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

src/mqtt.nim

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,22 +123,24 @@ proc receive*(client: MQTTClient, topicName: var string, message: var MQTTMessag
123123
MQTTClient_freeMessage(addr cmessage)
124124
MQTTClient_free(cTopicName)
125125

126-
type MessageArrived* = proc (topicName: string; message: MQTTMessage): cint
127-
type DeliveryComplete* = proc (dt: MQTTClient_deliveryToken)
128-
type ConnectionLost* = proc (cause: string)
126+
type MessageArrived* = proc (topicName: string; message: MQTTMessage): cint {.gcsafe.}
127+
type DeliveryComplete* = proc (dt: MQTTClient_deliveryToken) {.gcsafe.}
128+
type ConnectionLost* = proc (cause: string) {.gcsafe.}
129129

130130
type CallbackContext = object
131131
connectionLost: ConnectionLost
132132
messageArrived: MessageArrived
133133
deliveryComplete: DeliveryComplete
134134

135135
proc connectionLost(context: pointer, cause: cstring) {.cdecl.} =
136+
system.setupForeignThreadGc()
136137
var context = cast[ptr CallbackContext](context)
137138
if context.connectionLost != nil:
138139
var cause = $cause
139140
context.connectionLost(cause)
140141

141142
proc messageArrived(context: pointer, topicName: cstring, topicLen: cint, cmessage: ptr MQTTClient_message): cint {.cdecl.} =
143+
system.setupForeignThreadGc()
142144
var context = cast[ptr CallbackContext](context)
143145
if context.messageArrived != nil:
144146
# length is only sent if the string contains nulls, otherwise it is a null-terminated cstring
@@ -149,20 +151,23 @@ proc messageArrived(context: pointer, topicName: cstring, topicLen: cint, cmessa
149151
message.payload = cast[cstring](cmessage.payload) $ cmessage.payloadlen
150152
message.qos = QOS cmessage.qos
151153
message.retained = cmessage.retained != 0
154+
echo "All good"
152155
result = context.messageArrived(topic, message)
153156

154157
proc deliveryComplete(context: pointer, dt: MQTTDeliveryToken) {.cdecl.} =
158+
system.setupForeignThreadGc()
155159
var context = cast[ptr CallbackContext](context)
156160
if context.deliveryComplete != nil:
157161
context.deliveryComplete(dt)
158162

159-
# global holding context callbacks
160-
var context = CallbackContext()
163+
# Thread var holding context callbacks
164+
#var context {.threadvar.}: ptr CallbackContext
161165

162166
proc setCallbacks*(client: MQTTClient,
163167
cl: ConnectionLost,
164168
ma: MessageArrived,
165169
dc: DeliveryComplete) {.raises: [MQTTError, Exception].} =
170+
var context = cast[ptr CallbackContext](allocShared0(sizeof(CallbackContext)))
166171
context.connectionLost = cl
167172
context.messageArrived = ma
168173
context.deliveryComplete = dc

src/mqtt.nim.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
--threads:on

0 commit comments

Comments
 (0)