Jan schrieb:
> Ich möchte es gerne selber umsetzen. Mir fehlt da der richtige Ansatz.
> Ich möchte einen festen Speicherbereich mit einer festen Größe vorgeben.
> Das mit dem Pool ist mir nicht klar wie ich sowas in Ansi_C umsetzen
> muss.
'Muss' ist in dem Fall sowieso das falsche Wort. 'Kann' trifft es viel
besser.
Denn genauso wie es unzählige Möglichkeiten gibt, wie ein Hotelier seine
Zimmer verwaltet und bei Anforderung ausgibt, genauso gibt es viele
Möglichkeiten einen Pool zu bauen.
> Muss ich da den Speicherbereich nicht permannent vor anderen Zugriffen
> schützen (CriticalSection)?
Du denkst jetzt über Details nach, die völlig uninteressant sind.
Zumindest im Moment.
Postuliere eine struct, die du in einen Pool stecken willst. Dieser
struct verpasst do noch einen zusätzlichen Zeiger, den nennst du "next".
Seine Aufgabe ist es, die einzelnen Einträge im Array zu verketten, also
eine Liste innerhalb des Arrays aufzubauen.
Im Init verkettest du alle Arrayeinträge zu einer einzigen Liste und
nennst diese die 'Freelist'. Natürlich gibt es da noch einen Zeiger auf
den Anfang der Liste in einer static Variablen, nennen wir sie
pFreeList.
Kommt eine Anforderung, schaust du in pFreeList nach. Ist der Zeiger
nicht NULL, dann hat dein Pool einen Eintrag vorrätig. Du lieferst ihn
und setzt gleichzeitig den pFreeList auf den Nachfolger des Eintrags
(dazu brauchst du den next Pointer in der struct).
Wird eine struct zurückgegeben, so wird der next Zeiger dorthin gesetzt
wo der pFreeList zur Zeit hinzeigt und pFreeList wird auf die
zurückgegebene struct gesetzt.
Und das wars dann schon: Du hast einen Memory Pool gebaut, der viele
struct in einem vorallokierten Array verwalten kann.
Wenn ich jetzt noch mehr ins Detail gehe, dann schreib ich dir praktisch
schon deine Pool Verwaltung.