Changeset 446 for trunk/kernel/kern/thread.c
- Timestamp:
- Jun 19, 2018, 5:12:57 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/kern/thread.c
r443 r446 42 42 #include <ppm.h> 43 43 #include <thread.h> 44 #include <rpc.h> 44 45 45 46 ////////////////////////////////////////////////////////////////////////////////////// … … 799 800 uint32_t cycle = (uint32_t)hal_get_cycles(); 800 801 if( DEBUG_THREAD_BLOCK < cycle ) 801 printk("\n[ DBG] %s : thread %x blocked thread%x / cause %x / cycle %d\n",802 __FUNCTION__ , CURRENT_THREAD , ptr, cause , cycle );802 printk("\n[@@@] %s : thread %x in cxy %x blocked thread %x in cxy %x / cause %x / cycle %d\n", 803 __FUNCTION__ , CURRENT_THREAD , local_cxy , ptr , cxy , cause , cycle ); 803 804 #endif 804 805 805 806 #if (DEBUG_THREAD_BLOCK & 1) 806 807 if( DEBUG_THREAD_BLOCK < cycle ) 807 sched_display( ptr->core->lid ); 808 { 809 if( cxy == local_cxy) 810 { 811 sched_display( ptr->core->lid ); 812 } 813 else 814 { 815 core_t * core = hal_remote_lpt( XPTR( cxy , &ptr->core ) ); 816 lid_t lid = hal_remote_lw ( XPTR( cxy , &core->lid ) ); 817 rpc_sched_display_client( cxy , lid ); 818 } 819 } 808 820 #endif 809 821 … … 825 837 uint32_t cycle = (uint32_t)hal_get_cycles(); 826 838 if( DEBUG_THREAD_BLOCK < cycle ) 827 printk("\n[ DBG] %s : thread %x unblocked thread%x / cause %x / cycle %d\n",828 __FUNCTION__ , CURRENT_THREAD , ptr, cause , cycle );839 printk("\n[@@@] %s : thread %x in cxy %x unblocked thread %x in cxy %x / cause %x / cycle %d\n", 840 __FUNCTION__ , CURRENT_THREAD , local_cxy , ptr , cxy , cause , cycle ); 829 841 #endif 830 842 831 843 #if (DEBUG_THREAD_BLOCK & 1) 832 844 if( DEBUG_THREAD_BLOCK < cycle ) 833 sched_display( ptr->core->lid ); 845 { 846 if( cxy == local_cxy) 847 { 848 sched_display( ptr->core->lid ); 849 } 850 else 851 { 852 core_t * core = hal_remote_lpt( XPTR( cxy , &ptr->core ) ); 853 lid_t lid = hal_remote_lw ( XPTR( cxy , &core->lid ) ); 854 rpc_sched_display_client( cxy , lid ); 855 } 856 } 834 857 #endif 835 858 … … 838 861 839 862 } // end thread_unblock() 840 841 /*842 843 ////////////////////////////////////844 void thread_kill( xptr_t target_xp,845 bool_t is_exit,846 bool_t is_forced )847 {848 reg_t save_sr; // for critical section849 bool_t attached; // target thread in attached mode850 bool_t join_done; // joining thread arrived first851 xptr_t killer_xp; // extended pointer on killer thread (this)852 thread_t * killer_ptr; // pointer on killer thread (this)853 cxy_t target_cxy; // target thread cluster854 thread_t * target_ptr; // pointer on target thread855 xptr_t joining_xp; // extended pointer on joining thread856 thread_t * joining_ptr; // pointer on joining thread857 cxy_t joining_cxy; // joining thread cluster858 pid_t target_pid; // target process PID859 cxy_t owner_cxy; // target process owner cluster860 trdid_t target_trdid; // target thread identifier861 ltid_t target_ltid; // target thread local index862 xptr_t process_state_xp; // extended pointer on <term_state> in process863 864 xptr_t target_flags_xp; // extended pointer on target thread <flags>865 xptr_t target_join_lock_xp; // extended pointer on target thread <join_lock>866 xptr_t target_join_xp_xp; // extended pointer on target thread <join_xp>867 xptr_t target_process_xp; // extended pointer on target thread <process>868 869 process_t * target_process; // pointer on target thread process870 871 // get target thread pointer and cluster872 target_cxy = GET_CXY( target_xp );873 target_ptr = GET_PTR( target_xp );874 875 // get killer thread pointers876 killer_ptr = CURRENT_THREAD;877 killer_xp = XPTR( local_cxy , killer_ptr );878 879 #if DEBUG_THREAD_DELETE880 uint32_t cycle = (uint32_t)hal_get_cycles;881 if( DEBUG_THREAD_DELETE < cycle )882 printk("\n[DBG] %s : thread %x enter for target thread %x / cycle %d\n",883 __FUNCTION__, killer_ptr, target_ptr, cycle );884 #endif885 886 // block the target thread887 thread_block( target_xp , THREAD_BLOCKED_GLOBAL );888 889 // get target thread attached mode890 target_flags_xp = XPTR( target_cxy , &target_ptr->flags );891 attached = ((hal_remote_lw( target_flags_xp ) & THREAD_FLAG_DETACHED) == 0);892 893 // synchronize with the joining thread894 // if the target thread is attached && not forced895 896 if( attached && (is_forced == false) )897 {898 // build extended pointers on target thread join fields899 target_join_lock_xp = XPTR( target_cxy , &target_ptr->join_lock );900 target_join_xp_xp = XPTR( target_cxy , &target_ptr->join_xp );901 902 // enter critical section903 hal_disable_irq( &save_sr );904 905 // take the join_lock in target thread descriptor906 remote_spinlock_lock( target_join_lock_xp );907 908 // get join_done from target thread descriptor909 join_done = ((hal_remote_lw( target_flags_xp ) & THREAD_FLAG_JOIN_DONE) != 0);910 911 if( join_done ) // joining thread arrived first912 {913 // get extended pointer on joining thread914 joining_xp = (xptr_t)hal_remote_lwd( target_join_xp_xp );915 joining_ptr = GET_PTR( joining_xp );916 joining_cxy = GET_CXY( joining_xp );917 918 // reset the join_done flag in target thread919 hal_remote_atomic_and( target_flags_xp , ~THREAD_FLAG_JOIN_DONE );920 921 // unblock the joining thread922 thread_unblock( joining_xp , THREAD_BLOCKED_JOIN );923 924 // release the join_lock in target thread descriptor925 remote_spinlock_unlock( target_join_lock_xp );926 927 // restore IRQs928 hal_restore_irq( save_sr );929 }930 else // this thread arrived first931 {932 // set the kill_done flag in target thread933 hal_remote_atomic_or( target_flags_xp , THREAD_FLAG_KILL_DONE );934 935 // block this thread on BLOCKED_JOIN936 thread_block( killer_xp , THREAD_BLOCKED_JOIN );937 938 // set extended pointer on killer thread in target thread939 hal_remote_swd( target_join_xp_xp , killer_xp );940 941 // release the join_lock in target thread descriptor942 remote_spinlock_unlock( target_join_lock_xp );943 944 // deschedule945 sched_yield( "killer thread wait joining thread" );946 947 // restore IRQs948 hal_restore_irq( save_sr );949 }950 } // end if attached951 952 // - if the target thread is the main thread953 // => synchronize with the parent process main thread954 // - if the target thread is not the main thread955 // => simply mark the target thread for delete956 957 // get pointer on target thread process958 target_process_xp = XPTR( target_cxy , &target_ptr->process );959 target_process = (process_t *)hal_remote_lpt( target_process_xp );960 961 // get target process owner cluster962 target_pid = hal_remote_lw( XPTR( target_cxy , &target_process->pid ) );963 owner_cxy = CXY_FROM_PID( target_pid );964 965 // get target thread local index966 target_trdid = hal_remote_lw( XPTR( target_cxy , &target_ptr->trdid ) );967 target_ltid = LTID_FROM_TRDID( target_trdid );968 969 if( (owner_cxy == target_cxy) && (target_ltid == 0) ) // main thread970 {971 // get extended pointer on term_state in target process owner cluster972 process_state_xp = XPTR( owner_cxy , &target_process->term_state );973 974 // set termination info in target process owner975 if( is_exit ) hal_remote_atomic_or( process_state_xp , PROCESS_TERM_EXIT );976 else hal_remote_atomic_or( process_state_xp , PROCESS_TERM_KILL );977 978 #if DEBUG_THREAD_DELETE979 cycle = (uint32_t)hal_get_cycles;980 if( DEBUG_THREAD_DELETE < cycle )981 printk("\n[DBG] %s : thread %x exit for thread %x / main thread / cycle %d\n",982 __FUNCTION__, killer_ptr, target_ptr, cycle );983 #endif984 985 }986 else // main thread987 {988 // set the REQ_DELETE flag in target thread descriptor989 hal_remote_atomic_or( target_flags_xp , THREAD_FLAG_REQ_DELETE );990 991 #if DEBUG_THREAD_DELETE992 cycle = (uint32_t)hal_get_cycles;993 if( DEBUG_THREAD_DELETE < cycle )994 printk("\n[DBG] %s : thread %x exit for thread %x / not the main thread / cycle %d\n",995 __FUNCTION__, killer_ptr, target_ptr, cycle );996 #endif997 998 }999 1000 } // end thread_kill()1001 1002 */1003 863 1004 864 ////////////////////////////////////// … … 1131 991 void thread_idle_func() 1132 992 { 993 994 #if DEBUG_THREAD_IDLE 995 uint32_t cycle; 996 #endif 997 1133 998 while( 1 ) 1134 999 { … … 1140 1005 { 1141 1006 1142 #if DEBUG_THREAD_IDLE 1143 uint32_t cycle = (uint32_t)hal_get_cycles; 1144 thread_t * this = CURRENT_THREAD; 1145 if( DEBUG_THREAD_IDLE < cycle ) 1146 printk("\n[DBG] %s : idle thread %x on core[%x,%d] goes to sleep / cycle %d\n", 1147 __FUNCTION__, this, local_cxy, this->core->lid, cycle ); 1148 #endif 1149 1150 hal_core_sleep(); 1151 1152 #if DEBUG_THREAD_IDLE 1007 #if (DEBUG_THREAD_IDLE & 1) 1153 1008 cycle = (uint32_t)hal_get_cycles; 1154 1009 if( DEBUG_THREAD_IDLE < cycle ) 1155 printk("\n[DBG] %s : idle thread %x on core[%x,%d] wake up / cycle %d\n", 1010 printk("\n[DBG] %s : idle thread on core[%x,%d] goes to sleep / cycle %d\n", 1011 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, cycle ); 1012 #endif 1013 1014 hal_core_sleep(); 1015 1016 #if (DEBUG_THREAD_IDLE & 1) 1017 cycle = (uint32_t)hal_get_cycles; 1018 if( DEBUG_THREAD_IDLE < cycle ) 1019 printk("\n[DBG] %s : idle thread on core[%x,%d] wake up / cycle %d\n", 1156 1020 __FUNCTION__, this, local_cxy, this->core->lid, cycle ); 1157 1021 #endif 1158 1022 1159 1023 } 1024 1025 #if DEBUG_THREAD_IDLE 1026 sched_display( CURRENT_THREAD->core->lid ); 1027 #endif 1160 1028 1161 1029 // search a runable thread
Note: See TracChangeset
for help on using the changeset viewer.