[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Lost] [PATCH 2/2] kernel2: Shared Memory



Am Samstag, 1. November 2008 22:56:03 schrieb Antoine Kaufmann:
> On Sat, Oct 25 23:05, Kevin Wolf wrote:
> > + kernel2: Shared Memory
> > diff --git a/src/kernel2/src/mm/shm.c b/src/kernel2/src/mm/shm.c
> > new file mode 100644
> > index 0000000..b48defc
> > --- /dev/null
> > +++ b/src/kernel2/src/mm/shm.c
> > @@ -0,0 +1,171 @@
> > ...
> > +struct shm_desc {
> > +    uint64_t            id;
>
> Aber unten werden immer nur 32-Bit Ids verwendet, oder sehe ich das
> falsch?

Der Schlüssel ist bei AVL-Bäumen per definitionem 64 Bit lang. Es gab sogar 
irgendeinen Grund, warum ich hier trotzdem nur 32 Bit davon verwende, aber er 
fällt mir gerade nicht mehr ein...

>
> > +    struct tree_item    tree_item;
> > +
> > +    paddr_t             paddr;
> > +    size_t              num_pages;
> > +    list_t*             processes;
> > +};
> > ...
> > +uint32_t shm_create(size_t size)
> > +{
> > +    // FIXME Die Pages muessen nicht physisch zusammenhaengend sein
> > +    paddr_t shm_phys = pmm_alloc(NUM_PAGES(size));
> > +    uint32_t id = ++shm_last_id;
> > +    struct shm_desc* shm;
> > +
> > +    while (tree_search(shms, id)) {
> > +        id++;
> > +    }
>
> Warum ist das denn notwendig? Müsste ++shm_last_id nicht sowieso noch
> frei sein?

Außer nach einem Overflow ja.

> > +    shm = calloc(1, sizeof(*shm));
> > +    shm->id = id;
> > +    shm->num_pages = NUM_PAGES(size);
> > +    shm->paddr = shm_phys;
> > +    shm->processes = list_create();
> > +
> > +    tree_insert(shms, shm);
> > +
> > +    return id;
> > +}
> >...
> > diff --git a/src/kernel2/src/tasks/pm.c b/src/kernel2/src/tasks/pm.c
> > index e47a11c..64a814c 100644
> > --- a/src/kernel2/src/tasks/pm.c
> > +++ b/src/kernel2/src/tasks/pm.c
> > @@ -166,6 +166,8 @@ void pm_destroy(pm_process_t* process)
> >      // TODO Die einzelnen Listenglieder freigeben
> >      list_destroy(process->rpcs);
> >
> > +    // TODO Alle SHMs freigeben
> > +
> >      // Den Prozess aus der Liste entfernen
> >      pm_process_t* _proc;
> >      int i = 0;
>
> Das TODO ist aber nicht gerade schön... ;-) Aber jo wenn es tut, dann
> kann es zumindest mal rein. ;-)

Tasks beenden ist in kernel2 sowieso noch total kaputt, glaube ich.