LCOV - code coverage report
Current view: top level - home/runner/zephyrproject/zephyr/arch/posix/core - thread.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 44 48 91.7 %
Date: 2024-09-16 20:15:30 Functions: 4 4 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 6 10 60.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright (c) 2010-2015 Wind River Systems, Inc.
       3                 :            :  * Copyright (c) 2017 Oticon A/S
       4                 :            :  *
       5                 :            :  * SPDX-License-Identifier: Apache-2.0
       6                 :            :  */
       7                 :            : 
       8                 :            : /**
       9                 :            :  * @file
      10                 :            :  * @brief Thread support primitives
      11                 :            :  *
      12                 :            :  * This module provides core thread related primitives for the POSIX
      13                 :            :  * architecture
      14                 :            :  */
      15                 :            : 
      16                 :            : #include <stdio.h>
      17                 :            : #include <zephyr/toolchain.h>
      18                 :            : #include <zephyr/kernel_structs.h>
      19                 :            : #include <ksched.h>
      20                 :            : 
      21                 :            : #include "posix_core.h"
      22                 :            : #include <zephyr/arch/posix/posix_soc_if.h>
      23                 :            : 
      24                 :            : #ifdef CONFIG_TRACING
      25                 :            : #include <zephyr/tracing/tracing_macros.h>
      26                 :            : #include <zephyr/tracing/tracing.h>
      27                 :            : #endif
      28                 :            : 
      29                 :            : /* Note that in this arch we cheat quite a bit: we use as stack a normal
      30                 :            :  * pthreads stack and therefore we ignore the stack size
      31                 :            :  */
      32                 :         48 : void arch_new_thread(struct k_thread *thread, k_thread_stack_t *stack,
      33                 :            :                      char *stack_ptr, k_thread_entry_t entry,
      34                 :            :                      void *p1, void *p2, void *p3)
      35                 :            : {
      36                 :            : 
      37                 :         48 :         posix_thread_status_t *thread_status;
      38                 :            : 
      39                 :            :         /* We store it in the same place where normal archs store the
      40                 :            :          * "initial stack frame"
      41                 :            :          */
      42                 :         48 :         thread_status = Z_STACK_PTR_TO_FRAME(posix_thread_status_t, stack_ptr);
      43                 :            : 
      44                 :            :         /* z_thread_entry() arguments */
      45                 :         48 :         thread_status->entry_point = entry;
      46                 :         48 :         thread_status->arg1 = p1;
      47                 :         48 :         thread_status->arg2 = p2;
      48                 :         48 :         thread_status->arg3 = p3;
      49                 :            : #if defined(CONFIG_ARCH_HAS_THREAD_ABORT)
      50                 :         48 :         thread_status->aborted = 0;
      51                 :            : #endif
      52                 :            : 
      53                 :         48 :         thread->callee_saved.thread_status = thread_status;
      54                 :            : 
      55                 :         48 :         thread_status->thread_idx = posix_new_thread((void *)thread_status);
      56                 :         48 : }
      57                 :            : 
      58                 :         44 : int arch_thread_name_set(struct k_thread *thread, const char *str)
      59                 :            : {
      60                 :            : #define MAX_HOST_THREAD_NAME 16
      61                 :            : 
      62                 :         44 :         int ret;
      63                 :         44 :         int thread_index;
      64                 :         44 :         posix_thread_status_t *thread_status;
      65                 :         44 :         char th_name[MAX_HOST_THREAD_NAME];
      66                 :            : 
      67                 :         44 :         thread_status = thread->callee_saved.thread_status;
      68         [ +  - ]:         44 :         if (!thread_status) {
      69                 :            :                 return -EAGAIN;
      70                 :            :         }
      71                 :            : 
      72                 :         44 :         thread_index = thread_status->thread_idx;
      73                 :            : 
      74         [ +  - ]:         44 :         if (!str) {
      75                 :            :                 return -EAGAIN;
      76                 :            :         }
      77                 :            : 
      78                 :         44 :         snprintf(th_name, MAX_HOST_THREAD_NAME,
      79                 :            :         #if (CONFIG_NATIVE_SIMULATOR_NUMBER_MCUS > 1)
      80                 :            :                         STRINGIFY(CONFIG_NATIVE_SIMULATOR_MCU_N) ":"
      81                 :            :         #endif
      82                 :            :                 "%s", str);
      83                 :            : 
      84                 :         44 :         ret = posix_arch_thread_name_set(thread_index, th_name);
      85         [ -  + ]:         44 :         if (ret) {
      86                 :          0 :                 return -EAGAIN;
      87                 :            :         }
      88                 :            : 
      89                 :            :         return 0;
      90                 :            : }
      91                 :            : 
      92                 :         47 : void posix_arch_thread_entry(void *pa_thread_status)
      93                 :            : {
      94                 :         47 :         posix_thread_status_t *ptr = pa_thread_status;
      95                 :         47 :         posix_irq_full_unlock();
      96                 :         47 :         z_thread_entry(ptr->entry_point, ptr->arg1, ptr->arg2, ptr->arg3);
      97                 :            : }
      98                 :            : 
      99                 :            : #if defined(CONFIG_ARCH_HAS_THREAD_ABORT)
     100                 :         88 : void z_impl_k_thread_abort(k_tid_t thread)
     101                 :            : {
     102                 :         88 :         unsigned int key;
     103                 :         88 :         int thread_idx;
     104                 :            : 
     105                 :         88 :         SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_thread, abort, thread);
     106                 :            : 
     107                 :         88 :         posix_thread_status_t *tstatus =
     108                 :            :                                         (posix_thread_status_t *)
     109                 :            :                                         thread->callee_saved.thread_status;
     110                 :            : 
     111                 :         88 :         thread_idx = tstatus->thread_idx;
     112                 :            : 
     113                 :         88 :         key = irq_lock();
     114                 :            : 
     115         [ +  + ]:         88 :         if (_current == thread) {
     116                 :         46 :                 if (tstatus->aborted == 0) { /* LCOV_EXCL_BR_LINE */
     117                 :         46 :                         tstatus->aborted = 1;
     118                 :            :                 } else {
     119                 :            :                         posix_print_warning(/* LCOV_EXCL_LINE */
     120                 :            :                                 "POSIX arch: The kernel is trying to abort and swap "
     121                 :            :                                 "out of an already aborted thread %i. This "
     122                 :            :                                 "should NOT have happened\n",
     123                 :            :                                 thread_idx);
     124                 :            :                 }
     125                 :         46 :                 posix_abort_thread(thread_idx);
     126                 :            :         }
     127                 :            : 
     128                 :         88 :         z_thread_abort(thread);
     129                 :            : 
     130         [ -  + ]:         42 :         if (tstatus->aborted == 0) {
     131                 :            :                 PC_DEBUG("%s aborting now [%i] %i\n",
     132                 :            :                         __func__,
     133                 :            :                         posix_arch_get_unique_thread_id(thread_idx),
     134                 :          0 :                         thread_idx);
     135                 :            : 
     136                 :          0 :                 tstatus->aborted = 1;
     137                 :          0 :                 posix_abort_thread(thread_idx);
     138                 :            :         } else {
     139                 :            :                 PC_DEBUG("%s ignoring re_abort of [%i] "
     140                 :            :                         "%i\n",
     141                 :            :                         __func__,
     142                 :            :                         posix_arch_get_unique_thread_id(thread_idx),
     143                 :         42 :                         thread_idx);
     144                 :            :         }
     145                 :            : 
     146                 :            :         /* The abort handler might have altered the ready queue. */
     147                 :         42 :         z_reschedule_irqlock(key);
     148                 :            : 
     149                 :         42 :         SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_thread, abort, thread);
     150                 :         42 : }
     151                 :            : #endif

Generated by: LCOV version 1.14