Ich erstelle ein FFI-Modul zu einer Bibliothek in C, das eine einmalige nicht-reentrante Funktion aufrufen möchte, bevor alles andere aufgerufen wird. Dieser Anruf ist idempotent, aber statusbehaftet, also könnte ich ihn bei jedem Haskell-Anruf anrufen. Aber es ist langsam und aufgrund der Nichtreentry kann es zu Konflikten kommen.unsafePerformIO- und FFI-Bibliotheksinitialisierung
Ist dies der richtige Zeitpunkt für unsafePerformIO? Ich könnte ein Bool in eine unsichere IORef oder MVar wickeln, um diese Initialisierungsaufrufe idempotent zu machen, indem ich nachfolgende Aufrufe ignoriere (Aufrufe, bei denen der globale, versteckte IORef-Status Falsch ist).
Wenn nicht, was ist der richtige Weg?
Eine Alternative, die Verwendung ist der 'withX' Wrapper um Haupt gesehen hat. Dies gibt keine statischen Garantien, ich sage nur, dass es Vorrang hat (zB "withSocketsDo" aus dem Netzwerk-Paket). –
Ah ja, guter Punkt. Einfacher als die 'withToken $ \ t ->', aber keine Garantien. –
Ahh, ausgezeichnet! Dies ist eine viel bessere Lösung. Ich hatte mir Sorgen gemacht, wie der globale Staat mit Multithreading interagieren würde (ist ein unsicherer MVar-Thread lokal, Laufzeit lokal?). Dadurch wird auch der Initialisierungsfehler in der Haskell-Laufzeit lokalisierbar anstatt nur implizit und versteckt. –