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.
Josef Spillner
-----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
On Saturday 08 September 2001 11:14, Konrad Rosenbaum wrote:
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?
Ein Plugin ist in dem Fall eine .so-Datei, die keinen eigenen Prozeß hat. Da kommt mir aber eine Idee: statt alle Plugins gegen die Bibliothek X zu linken, wird X auch zu einem Plugin und wird mit RTLD_GLOBAL vorgeladen. Dann müßte es gehen, daß es nur einmal im Speicher ist. Hm, mal schauen... (und dann muß ich Dependency-Konfigurationen schreiben, und schauen ob das auch auf BSD und Solaris geht, eeeeew...)
Josef Spillner
lug-dd@mailman.schlittermann.de