-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Sunday 02 September 2001 21:49, Josef Spillner wrote:
Hallo,
Ist zwar schon spät, aber das Problem hat mich heute den ganzen Tag begleitet, also frag ich hier mal nach.
Es geht darum, daß ich Daten aus Dateien auslese und diese in einen Cache schreibe, damit nicht immer wieder die ganze Datei geparst werden muß. Weil diese Funktionalität von einigen Plugins benötigt wird, steckt sie in einer Bibliothek. Da die Plugins sich ändern können/sollen (deshalb sind's ja welche), hat das Hauptprogramm keine Kenntnis von dem Cache. Nun werden aber Shared Libraries in Instanzen geladen, d.h. bei zwei Plugins habe ich zwei verschiedene Caches im Speicher, die voneinander nichts wissen, und (das ist fatal) beim Rückschreiben sich gegenseitig die Daten kaputtmachen.
Wie kann man das verhindern, ohne auf Shared Memory zurückgreifen zu müssen? Ideal wäre es, wenn man erzwingen könnte, daß es nur eine Instanz von bestimmten Bibliotheken im Speicher gibt.
Momentchen.... was ist bei Dir ein PlugIn? Ein Shared Object, dass in den Speicher geladen und über irgendein Symbol gestartet wird oder ein eigener Prozess?
SO: Bibliotheken werden _grundsätzlich_ nur einmal geladen, wenn Du sie ein zweites Mal anforderst wird nur der Counter hochgezählt, damit sie auch erst nach dem zweiten entladen wirklich gelöscht wird. Demnach existieren Code und Daten einer Bibliothek auch nur exakt 1x im Speicher. Zumindest gilt das, wenn Du Dich auf den automagischen Loader der libc (ldlinux.so.2) oder libdl verläßt. Wenn Du libelf oder was selbstgebrautes nimmst: selbst schuld.
Prozess: Dir bleibt nix anderes als kräftiges SystemV-IPC (Shared Mem und Semaphore).
Konrad
- -- Another dream that failed. There's nothing sadder. -- Kirk, "This side of Paradise", stardate 3417.3