nfc icon indicating copy to clipboard operation
nfc copied to clipboard

thread safety?

Open draeron opened this issue 1 year ago • 8 comments

This is more of support question than an issue, but how would you manage multithreading with libnfc? Even with mutexes it seems the Target struct can't be reused in a different thread (ex: InitiatorTargetIsPresent return err Invalid Argument).

draeron avatar Jun 07 '24 16:06 draeron

Quite honestly: I don't. This library is likely to explode horribly in your face if you use it concurrently.

clausecker avatar Jun 07 '24 17:06 clausecker

i'm trying to create a network layer over the lib and it seems the Target/handle become invalid when changing context...

draeron avatar Jun 07 '24 17:06 draeron

Yes, that's very likely. The library is designed to only have a single global context for the application. I made this simplification as there seemed no point in having more than one context.

If you want to extend the code base to support multiple contexts, feel free to submit patches for review.

clausecker avatar Jun 07 '24 19:06 clausecker

honestly i woudn't know where to start... but I did manage to find a way to make polling for card presence workable by recalling InitiatorSelectPassiveTarget to get a new target instance and using https://github.com/golang-design/mainthread as a way to keep problem from appearing. So far so good...

draeron avatar Jun 07 '24 19:06 draeron

@draeron may I know what is your use case ? Do you use more than one nfc reader handled by the same app ?

Limezy avatar Nov 30 '24 04:11 Limezy

no, I just wanted to create a webservice over a card reader, seems to me the libNFC has strange behavior when being accessed from a different thread / go routine.

in the end I dropped the idea and bundle all logic inside the same process.

I wish there was some pure go layer for NFC in something like periph.io but what I could find wasn't very reliable.

draeron avatar Dec 02 '24 04:12 draeron

@draeron understood. I have also struggled a lot to have a NFC reader working well with pure Go, and had to fallback using libNFC through this library. Many thanks @clausecker by the way !

For what it's worth (not a lot), I'm also creating a webservice over a card reader. I managed (with some generative AI help) to get something that looks quite reliable here https://github.com/Cartophone/cartophone-server/tree/main. You can have a look at my dirty code there.

Limezy avatar Dec 02 '24 05:12 Limezy

I can look into making a v3 of the library that exposes the context structure of libnfc, allowing you to use it from more than one thread at once. But alas, I don't really do much with NFC these days, so it may take some time for me to get around to doing this.

clausecker avatar Dec 02 '24 07:12 clausecker