Changeset 446 for trunk/kernel/kern/process.c
- Timestamp:
- Jun 19, 2018, 5:12:57 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/kern/process.c
r445 r446 392 392 cxy_t parent_cxy; 393 393 xptr_t children_lock_xp; 394 xptr_t children_nr_xp; 394 395 395 396 pid_t pid = process->pid; … … 421 422 // get extended pointer on children_lock in parent process 422 423 children_lock_xp = XPTR( parent_cxy , &parent_ptr->children_lock ); 424 children_nr_xp = XPTR( parent_cxy , &parent_ptr->children_nr ); 423 425 424 426 // remove process from children_list 425 427 remote_spinlock_lock( children_lock_xp ); 426 428 xlist_unlink( XPTR( local_cxy , &process->children_list ) ); 429 hal_remote_atomic_add( children_nr_xp , -1 ); 427 430 remote_spinlock_unlock( children_lock_xp ); 428 431 } … … 1237 1240 thread_t * new_thread; // local pointer on new thread 1238 1241 xptr_t parent_xp; // extended pointer on parent process 1242 process_t * parent_ptr; // local pointer on parent process 1243 cxy_t parent_cxy; // parent process cluster identifier 1244 xptr_t children_lock_xp; // extended pointer on children lock in parent 1245 xptr_t children_root_xp; // extended pointer on children root in parent 1246 xptr_t children_nr_xp; // extended pointer on children number in parent 1247 thread_t * parent_main_ptr; // local pointer on parent main thread 1248 xptr_t parent_main_xp; // extended pointer on parent main thread 1239 1249 pthread_attr_t attr; // new thread attributes 1240 1250 lid_t lid; // selected core local index 1241 1251 error_t error; // value returned by called functions 1242 1252 1243 // get old_thread / old_process / PID / parent_xp1253 // get old_thread, old_process & PID 1244 1254 old_thread = CURRENT_THREAD; 1245 1255 old_process = old_thread->process; 1246 1256 pid = old_process->pid; 1247 parent_xp = old_process->parent_xp; 1248 1257 1249 1258 // get .elf pathname from exec_info 1250 path 1259 path = exec_info->path; 1251 1260 1252 1261 // this function must be executed by a thread running in owner cluster … … 1260 1269 uint32_t cycle = (uint32_t)hal_get_cycles(); 1261 1270 if( DEBUG_PROCESS_MAKE_EXEC < cycle ) 1262 printk("\n[DBG] %s : thread %x enters for process %x / %s / cycle %d\n", 1263 __FUNCTION__, old_thread, pid, path, cycle ); 1264 #endif 1271 printk("\n[DBG] %s : thread %x in process %x enters / path %s / cycle %d\n", 1272 __FUNCTION__, old_thread->trdid, pid, path, cycle ); 1273 #endif 1274 1275 // get parent process pointers 1276 parent_xp = old_process->parent_xp; 1277 parent_cxy = GET_CXY( parent_xp ); 1278 parent_ptr = GET_PTR( parent_xp ); 1279 1280 #if (DEBUG_PROCESS_MAKE_EXEC & 1) 1281 if( DEBUG_PROCESS_MAKE_EXEC < cycle ) 1282 printk("\n[DBG] %s : thread %x in process %x get parent process %x in cluster %x\n", 1283 __FUNCTION__, old_thread->trdid, pid, parent_ptr, parent_cxy ); 1284 #endif 1285 1286 // get extended pointers on parent children_root, children_lock and children_nr 1287 children_root_xp = XPTR( parent_cxy , &parent_ptr->children_root ); 1288 children_lock_xp = XPTR( parent_cxy , &parent_ptr->children_lock ); 1289 children_nr_xp = XPTR( parent_cxy , &parent_ptr->children_nr ); 1290 1291 // get pointers on the parent process main thread 1292 parent_main_ptr = hal_remote_lpt( XPTR( parent_cxy , &parent_ptr->th_tbl[0] ) ); 1293 parent_main_xp = XPTR( parent_cxy , parent_main_ptr ); 1265 1294 1266 1295 // allocate memory for new_process descriptor … … 1298 1327 cycle = (uint32_t)hal_get_cycles(); 1299 1328 if( DEBUG_PROCESS_MAKE_EXEC < cycle ) 1300 printk("\n[DBG] %s : thread %x created new process %x / cycle %d\n",1301 __FUNCTION__ , old_thread , new_process , cycle);1329 printk("\n[DBG] %s : thread %x in process %x created new process %x\n", 1330 __FUNCTION__ , old_thread->trdid, pid, new_process ); 1302 1331 #endif 1303 1332 … … 1358 1387 #endif 1359 1388 1360 // get cluster and local pointer on parent process1361 process_t * parent_ptr = GET_PTR( parent_xp );1362 cxy_t parent_cxy = GET_CXY( parent_xp );1363 1364 // get extended pointers on parent children_root, children_lock and children_nr1365 xptr_t root_xp = XPTR( parent_cxy , &parent_ptr->children_root );1366 xptr_t lock_xp = XPTR( parent_cxy , &parent_ptr->children_lock );1367 xptr_t nr_xp = XPTR( parent_cxy , &parent_ptr->children_nr );1368 1369 1389 // register new_process in parent children list 1370 remote_spinlock_lock( lock_xp );1371 xlist_add_last( root_xp , XPTR( local_cxy , &new_process->children_list ) );1372 hal_remote_atomic_add( nr_xp , 1 );1373 remote_spinlock_unlock( lock_xp );1390 remote_spinlock_lock( children_lock_xp ); 1391 xlist_add_last( children_root_xp , XPTR( local_cxy , &new_process->children_list ) ); 1392 hal_remote_atomic_add( children_nr_xp , 1 ); 1393 remote_spinlock_unlock( children_lock_xp ); 1374 1394 1375 1395 // activate new thread … … 1379 1399 process_txt_detach( XPTR( local_cxy , old_process ) ); 1380 1400 1381 // block thisold_thread1401 // block old_thread 1382 1402 thread_block( XPTR( local_cxy , old_thread ) , THREAD_BLOCKED_GLOBAL ); 1383 1403 1384 // atomically update old_process descriptor term_state to ask 1385 // the parent process (wait() function) to delete this old_thread 1404 // atomically update old_process termination state 1386 1405 hal_atomic_or( &old_process->term_state , PROCESS_TERM_EXIT ); 1406 1407 // take the children lock and unblock the parent process main thread 1408 remote_spinlock_lock( children_lock_xp ); 1409 thread_unblock( parent_main_xp , THREAD_BLOCKED_WAIT ); 1410 remote_spinlock_unlock( children_lock_xp ); 1387 1411 1388 1412 hal_fence(); … … 1621 1645 if( txt_owner_xp == process_xp ) 1622 1646 { 1623 nolock_printk("PID %X | PPID %X | STS %X | %s (FG) | %X | %d | %s\n",1647 nolock_printk("PID %X | PPID %X | TS %X | %s (FG) | %X | %d | %s\n", 1624 1648 pid, ppid, state, txt_name, process_ptr, th_nr, elf_name ); 1625 1649 } 1626 1650 else 1627 1651 { 1628 nolock_printk("PID %X | PPID %X | STS %X | %s (BG) | %X | %d | %s\n",1652 nolock_printk("PID %X | PPID %X | TS %X | %s (BG) | %X | %d | %s\n", 1629 1653 pid, ppid, state, txt_name, process_ptr, th_nr, elf_name ); 1630 1654 } … … 1676 1700 xptr_t lock_xp; // extended pointer on list lock in chdev 1677 1701 1678 #if DEBUG_PROCESS_TXT _ATTACH1702 #if DEBUG_PROCESS_TXT 1679 1703 uint32_t cycle = (uint32_t)hal_get_cycles(); 1680 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1704 if( DEBUG_PROCESS_TXT < cycle ) 1681 1705 printk("\n[DBG] %s : thread %x enter for process %x / txt_id = %d / cycle %d\n", 1682 1706 __FUNCTION__, CURRENT_THREAD, process->pid, txt_id, cycle ); … … 1705 1729 remote_spinlock_unlock( lock_xp ); 1706 1730 1707 #if DEBUG_PROCESS_TXT _ATTACH1708 cycle = (uint32_t)hal_get_cycles(); 1709 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1731 #if DEBUG_PROCESS_TXT 1732 cycle = (uint32_t)hal_get_cycles(); 1733 if( DEBUG_PROCESS_TXT < cycle ) 1710 1734 printk("\n[DBG] %s : thread %x exit for process %x / txt_id = %d / cycle %d\n", 1711 1735 __FUNCTION__, CURRENT_THREAD, process->pid, txt_id , cycle ); … … 1735 1759 "process descriptor not in owner cluster" ); 1736 1760 1737 #if DEBUG_PROCESS_TXT _ATTACH1761 #if DEBUG_PROCESS_TXT 1738 1762 uint32_t cycle = (uint32_t)hal_get_cycles(); 1739 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1763 if( DEBUG_PROCESS_TXT < cycle ) 1740 1764 printk("\n[DBG] %s : thread %x enter for process %x / cycle %d\n", 1741 1765 __FUNCTION__, CURRENT_THREAD, process_pid, cycle ); … … 1761 1785 remote_spinlock_unlock( lock_xp ); 1762 1786 1763 #if DEBUG_PROCESS_TXT _ATTACH1787 #if DEBUG_PROCESS_TXT 1764 1788 cycle = (uint32_t)hal_get_cycles(); 1765 1789 uint32_t txt_id = hal_remote_lw( XPTR( chdev_cxy , &chdev_ptr->channel ) ); 1766 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1790 if( DEBUG_PROCESS_TXT < cycle ) 1767 1791 printk("\n[DBG] %s : thread %x exit / process %x detached from TXT %d / cycle %d\n", 1768 1792 __FUNCTION__, CURRENT_THREAD, process_pid, txt_id, cycle ); … … 1793 1817 "process descriptor not in owner cluster\n" ); 1794 1818 1795 #if DEBUG_PROCESS_TXT _ATTACH1819 #if DEBUG_PROCESS_TXT 1796 1820 uint32_t cycle = (uint32_t)hal_get_cycles(); 1797 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1821 if( DEBUG_PROCESS_TXT < cycle ) 1798 1822 printk("\n[DBG] %s : thread %x enter for process %x / cycle %d\n", 1799 1823 __FUNCTION__, CURRENT_THREAD, process_pid, cycle ); … … 1811 1835 hal_remote_swd( XPTR( txt_cxy , &txt_ptr->ext.txt.owner_xp ) , process_xp ); 1812 1836 1813 #if DEBUG_PROCESS_TXT _ATTACH1814 cycle = (uint32_t)hal_get_cycles(); 1815 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1837 #if DEBUG_PROCESS_TXT 1838 cycle = (uint32_t)hal_get_cycles(); 1839 if( DEBUG_PROCESS_TXT < cycle ) 1816 1840 printk("\n[DBG] %s : thread %x exit for process %x / cycle %d\n", 1817 1841 __FUNCTION__, CURRENT_THREAD, process_pid, cycle ); … … 1850 1874 "process descriptor not in owner cluster\n" ); 1851 1875 1852 #if DEBUG_PROCESS_TXT _ATTACH1876 #if DEBUG_PROCESS_TXT 1853 1877 uint32_t cycle = (uint32_t)hal_get_cycles(); 1854 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1878 if( DEBUG_PROCESS_TXT < cycle ) 1855 1879 printk("\n[DBG] %s : thread %x enter / process %x / cycle %d\n", 1856 1880 __FUNCTION__, CURRENT_THREAD, process_pid, cycle ); … … 1869 1893 txt_id = hal_remote_lw ( XPTR( txt_cxy , &txt_ptr->channel ) ); 1870 1894 1871 #if( DEBUG_PROCESS_TXT _ATTACH& 1 )1872 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1895 #if( DEBUG_PROCESS_TXT & 1 ) 1896 if( DEBUG_PROCESS_TXT < cycle ) 1873 1897 printk("\n[DBG] %s : file_ptr %x / txt_ptr %x / txt_id %d / owner_ptr = %x\n", 1874 1898 __FUNCTION__, GET_PTR(file_xp), txt_ptr, txt_id, GET_PTR(owner_xp) ); … … 1888 1912 { 1889 1913 1890 #if( DEBUG_PROCESS_TXT _ATTACH& 1 )1891 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1914 #if( DEBUG_PROCESS_TXT & 1 ) 1915 if( DEBUG_PROCESS_TXT < cycle ) 1892 1916 printk("\n[DBG] %s : process is not the KSH process => search the KSH\n", __FUNCTION__ ); 1893 1917 #endif … … 1907 1931 hal_remote_swd( XPTR( txt_cxy , &txt_ptr->ext.txt.owner_xp ) , current_xp ); 1908 1932 1909 #if DEBUG_PROCESS_TXT _ATTACH1910 cycle = (uint32_t)hal_get_cycles(); 1911 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1933 #if DEBUG_PROCESS_TXT 1934 cycle = (uint32_t)hal_get_cycles(); 1935 if( DEBUG_PROCESS_TXT < cycle ) 1912 1936 printk("\n[DBG] %s : thread %x exit / process %x to KSH process %x / cycle %d\n", 1913 1937 __FUNCTION__, CURRENT_THREAD, process_pid, … … 1929 1953 { 1930 1954 1931 #if( DEBUG_PROCESS_TXT _ATTACH& 1 )1932 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1955 #if( DEBUG_PROCESS_TXT & 1 ) 1956 if( DEBUG_PROCESS_TXT < cycle ) 1933 1957 printk("\n[DBG] %s : process is the KSH process => search another\n", __FUNCTION__ ); 1934 1958 #endif … … 1949 1973 hal_remote_swd( XPTR( txt_cxy , &txt_ptr->ext.txt.owner_xp ) , current_xp ); 1950 1974 1951 #if DEBUG_PROCESS_TXT _ATTACH1952 cycle = (uint32_t)hal_get_cycles(); 1953 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1975 #if DEBUG_PROCESS_TXT 1976 cycle = (uint32_t)hal_get_cycles(); 1977 if( DEBUG_PROCESS_TXT < cycle ) 1954 1978 printk("\n[DBG] %s : thread %x exit / KSH process %x to process %x / cycle %d\n", 1955 1979 __FUNCTION__, CURRENT_THREAD, process_pid, … … 1966 1990 hal_remote_swd( XPTR( txt_cxy , &txt_ptr->ext.txt.owner_xp ) , XPTR_NULL ); 1967 1991 1968 #if DEBUG_PROCESS_TXT _ATTACH1969 cycle = (uint32_t)hal_get_cycles(); 1970 if( DEBUG_PROCESS_TXT _ATTACH< cycle )1992 #if DEBUG_PROCESS_TXT 1993 cycle = (uint32_t)hal_get_cycles(); 1994 if( DEBUG_PROCESS_TXT < cycle ) 1971 1995 printk("\n[DBG] %s : thread %x exit / KSH process %x to nobody / cycle %d\n", 1972 1996 __FUNCTION__, CURRENT_THREAD, process_pid, cycle ); … … 1978 2002 { 1979 2003 1980 #if DEBUG_PROCESS_TXT _ATTACH1981 cycle = (uint32_t)hal_get_cycles(); 1982 if( DEBUG_PROCESS_TXT _ATTACH< cycle )2004 #if DEBUG_PROCESS_TXT 2005 cycle = (uint32_t)hal_get_cycles(); 2006 if( DEBUG_PROCESS_TXT < cycle ) 1983 2007 printk("\n[DBG] %s : thread %x exit / process %x is not TXT owner / cycle %d\n", 1984 2008 __FUNCTION__, CURRENT_THREAD, process_pid, cycle );
Note: See TracChangeset
for help on using the changeset viewer.