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

Re: [tyndur-devel] [Lost] [PATCH v2 07/10] kernel2: Syscall pm_exit_process



On Sat, Dec 20 23:49, Kevin Wolf wrote:
> + kernel2: Syscall pm_exit_process
> ---
>  src/kernel2/include/syscall.h  |    3 +++
>  src/kernel2/src/syscall.c      |    1 +
>  src/kernel2/src/syscalls/pm.c  |   24 ++++++++++++++++++++++++
>  src/kernel2/src/tasks/pm.c     |    6 ++++--
>  src/kernel2/src/tasks/thread.c |   11 ++++++-----
>  5 files changed, 38 insertions(+), 7 deletions(-)
> 
> diff --git a/src/kernel2/include/syscall.h b/src/kernel2/include/syscall.h
> index b30b389..160cbf3 100644
> --- a/src/kernel2/include/syscall.h
> +++ b/src/kernel2/include/syscall.h
> @@ -109,6 +109,9 @@ void syscall_pm_wait_for_rpc(void);
>  PID_T SYSCALL_PM_CREATE_PROCESS(VADDR_T START, UID_T UID,
>      const char* cmdline, pid_t parent_pid);
>  
> +/// Aktuellen Prozess beenden
> +void syscall_pm_exit_process(void);
> +
>  /// Speicher an einen anderen Prozess uebergeben
>  void syscall_init_child_page(pid_t pid, vaddr_t src, vaddr_t dest,
>      size_t size);
> diff --git a/src/kernel2/src/syscall.c b/src/kernel2/src/syscall.c
> index 836d1e7..1749c7e 100644
> --- a/src/kernel2/src/syscall.c
> +++ b/src/kernel2/src/syscall.c
> @@ -67,6 +67,7 @@ void syscall_init()
>  
>      syscall_register(SYSCALL_PM_CREATE_PROCESS, &syscall_pm_create_process, 4);
>      syscall_register(SYSCALL_PM_INIT_PAGE, &syscall_init_child_page, 4);
> +    syscall_register(SYSCALL_PM_EXIT_PROCESS, &syscall_pm_exit_process, 0);
>  
>      syscall_register(SYSCALL_SET_RPC_HANDLER, &syscall_set_rpc_handler, 1);
>  #if CONFIG_ARCH == ARCH_I386
> diff --git a/src/kernel2/src/syscalls/pm.c b/src/kernel2/src/syscalls/pm.c
> index 93845b3..34e1888 100644
> --- a/src/kernel2/src/syscalls/pm.c
> +++ b/src/kernel2/src/syscalls/pm.c
> @@ -64,6 +64,30 @@ pid_t syscall_pm_create_process(vaddr_t start, uid_t uid, const char* cmdline,
>      return process->pid;
>  }
>  
> +/**
> + * Beendet den aktuellen Prozess.
> + */
> +void syscall_pm_exit_process(void)
> +{
> +    pm_process_t* old_task = cpu_get_current()->thread->process;
> +    pm_thread_t* thread;
> +
> +    // Task abgeben
> +    pm_scheduler_push(cpu_get_current()->thread);
> +
> +    // Genau jetzt muss der Prozess geloescht werden: Der Thread ist nicht mehr
> +    // aktiv, und er darf auch nicht wieder aktiviert werden.
> +    pm_destroy(old_task);
> +
> +    // Einen neuen Task holen.
> +    // FIXME Da braucht es endlich eine Funktion dafuer
> +    thread = pm_scheduler_pop();
> +
> +    cpu_get_current()->tss.esp0 = (uintptr_t) thread->kernel_stack + sizeof(interrupt_stack_frame_t);
> +    cpu_get_current()->tss.ss0 = 2 << 3;
> +
> +    cpu_get_current()->thread = thread;

Hier wäre es nett, wenn das dann in der nächsten Zeit durch eine
Funktion ersetzt würde, irgendwie glaube ich nämlich, dass das
irgendwann zu seltsamen Bugs führt... ;-) Aber jo das ist was fuer einen
anderen Patch.

> +}
>  
>  /**
>   * PID des aktuellen Prozesses ausfindig machen
> diff --git a/src/kernel2/src/tasks/pm.c b/src/kernel2/src/tasks/pm.c
> index 3f43688..74a0f67 100644
> --- a/src/kernel2/src/tasks/pm.c
> +++ b/src/kernel2/src/tasks/pm.c
> @@ -221,11 +221,13 @@ bool pm_block(pm_process_t* process)
>  
>      // Die einzelnen Threads sperren
>      while ((thread = list_get_element_at(process->threads, i++))) {
> -        if (pm_thread_block(thread) != TRUE) {
> +        if ((thread->status != PM_STATUS_BLOCKED)
> +            && pm_thread_block(thread) != TRUE)
> +        {
>              result = FALSE;
>          }
>      }
> -    
> +
>      process->status = PM_STATUS_BLOCKED;
>  
>      return result;
> diff --git a/src/kernel2/src/tasks/thread.c b/src/kernel2/src/tasks/thread.c
> index 6324b2a..d869595 100644
> --- a/src/kernel2/src/tasks/thread.c
> +++ b/src/kernel2/src/tasks/thread.c
> @@ -143,8 +143,11 @@ void pm_thread_destroy(pm_thread_t* thread)
>      // TODO: Den Userspacestack auch freigeben
>  
>      // Kernelstack freigeben
> +    /*
> +     * FIXME Wieder freigeben, und dieses Mal dann auch physisch
>      mmc_unmap(&thread->process->context, thread->kernel_stack_bottom,
>          NUM_PAGES(thread->kernel_stack_size));
> +    */
>      
>      // Aus der Threadliste enfernen
>      pm_thread_t* thread_;
> @@ -177,8 +180,7 @@ bool pm_thread_block(pm_thread_t* thread)
>      // TODO: In SMP-Systemen sollte hier ein IPI kommen, falls der Thread auf
>      // einer anderen CPU am laufen ist, der sie dazu zwingt, den Thread
>      // abzugeben.
> -    bool result = FALSE;
> -    
> +
>      // Wenn der Thread gesperrt ist, muss garnicht weiter probiert werden
>      if (locked(&thread->lock) == TRUE) {
>          return FALSE;
> @@ -188,12 +190,11 @@ bool pm_thread_block(pm_thread_t* thread)
>  
>      if (thread->status == PM_STATUS_READY) {
>          thread->status = PM_STATUS_BLOCKED;
> -        result = TRUE;
>      }
> -    
> +
>      unlock(&thread->lock);
>  
> -    return result;
> +    return (thread->status == PM_STATUS_BLOCKED);
>  }
>  
>  /**

Sieht zwar nicht gut aus, kann aber rein. ;-)

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgpDsNdsosfJB.pgp
Description: PGP signature