@@ -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
130130type CallbackContext = object
131131 connectionLost: ConnectionLost
132132 messageArrived: MessageArrived
133133 deliveryComplete: DeliveryComplete
134134
135135proc 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
141142proc 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
154157proc 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
162166proc 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
0 commit comments