nfc
nfc copied to clipboard
thread safety?
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).
Quite honestly: I don't. This library is likely to explode horribly in your face if you use it concurrently.
i'm trying to create a network layer over the lib and it seems the Target/handle become invalid when changing context...
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.
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 may I know what is your use case ? Do you use more than one nfc reader handled by the same app ?
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 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.
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.