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

Re: [tyndur-devel] [PATCH v2 2/7] kernel2: SHM beim Prozessende schliessen



On Sun, Jan 03 17:03, Kevin Wolf wrote:
> ! kernel2: Alle geoeffneten SHM-Bereiche beim Prozessende schliessen
> 
> Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
> ---
>  src/kernel2/include/tasks.h |    3 +++
>  src/kernel2/src/mm/shm.c    |   37 +++++++++++++++++++++++++++++++++++++
>  2 files changed, 40 insertions(+), 0 deletions(-)
> 
> diff --git a/src/kernel2/include/tasks.h b/src/kernel2/include/tasks.h
> index c8370f4..37d9714 100644
> --- a/src/kernel2/include/tasks.h
> +++ b/src/kernel2/include/tasks.h
> @@ -84,6 +84,9 @@ typedef struct pm_process {
>      /// Eine Liste von RPC-Backlinks
>      list_t* rpcs;
>  
> +    /// Eine Liste von geoeffneten SHM-Bereichen
> +    list_t* shm;
> +
>      /**
>       * Eine Liste von Eventhandlern, die beim Loeschen des Prozesses
>       * aufgerufen werden
> diff --git a/src/kernel2/src/mm/shm.c b/src/kernel2/src/mm/shm.c
> index d05de0e..b067d91 100644
> --- a/src/kernel2/src/mm/shm.c
> +++ b/src/kernel2/src/mm/shm.c
> @@ -51,6 +51,7 @@ struct shm_desc {
>  };
>  
>  struct shm_process {
> +    struct shm_desc*    shm;
>      pm_process_t*       process;
>      vaddr_t             vaddr;
>  };
> @@ -58,6 +59,8 @@ struct shm_process {
>  static tree_t* shms = NULL;
>  static uint32_t shm_last_id = 0;
>  
> +static void shm_destroy_task(pm_process_t* process, void* prv);
> +
>  /**
>   * Initialisiert die SHM-Verwaltung
>   */
> @@ -126,10 +129,17 @@ void* shm_attach(pm_process_t* process, uint32_t id)
>      }
>  
>      shm_proc = calloc(1, sizeof(*shm_proc));
> +    shm_proc->shm = shm;
>      shm_proc->process = process;
>      shm_proc->vaddr = ret;
>      list_push(shm->processes, shm_proc);
>  
> +    if (process->shm == NULL) {
> +        process->shm = list_create();
> +        pm_register_on_destroy(process, shm_destroy_task, NULL);
> +    }
> +    list_push(process->shm, shm_proc);
> +
>      return ret;
>  }
>  
> @@ -150,6 +160,15 @@ void shm_detach(pm_process_t* process, uint32_t id)
>          return;
>      }
>  
> +    // Aus der SHM-Liste des Prozesses austragen
> +    for (i = 0; (shm_proc = list_get_element_at(process->shm, i)); i++) {
> +        if (shm_proc->shm == shm) {
> +            list_remove(process->shm, i);
> +            break;
> +        }
> +    }
> +
> +    // Aus der Prozessliste des SHM austragen
>      for (i = 0; (shm_proc = list_get_element_at(shm->processes, i)); i++) {
>          if (shm_proc->process == process) {
>              list_remove(shm->processes, i);
> @@ -184,3 +203,21 @@ found:
>  
>      return;
>  }
> +
> +/**
> + * Schliesst alle SHM-Bereiche eines Prozesses
> + */
> +static void shm_destroy_task(pm_process_t* process, void* prv)
> +{
> +    struct shm_process* shm_proc;
> +
> +    if (process->shm == NULL) {
> +        return;
> +    }
> +
> +    while ((shm_proc = list_get_element_at(process->shm, 0))) {
> +        shm_detach(process, shm_proc->shm->id);
> +    }
> +
> +    list_destroy(process->shm);
> +}

Acked-by: Antoine Kaufmann <toni@xxxxxxxxxx>

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgpOUQLNCWJEc.pgp
Description: PGP signature