Changeset 433 for trunk/kernel/kern/process.c
- Timestamp:
- Feb 14, 2018, 3:40:19 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/kern/process.c
r428 r433 4 4 * Authors Ghassan Almaless (2008,2009,2010,2011,2012) 5 5 * Mohamed Lamine Karaoui (2015) 6 * Alain Greiner (2016,2017 )6 * Alain Greiner (2016,2017,2018) 7 7 * 8 8 * Copyright (c) UPMC Sorbonne Universites … … 124 124 model_pid = hal_remote_lw( XPTR( model_cxy , &model_ptr->pid ) ); 125 125 126 process_dmsg("\n[DBG] %s : core[%x,%d] enters / pid = %x / ppid = %x / model_pid = %x\n", 127 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , pid , parent_pid , model_pid ); 126 #if CONFIG_DEBUG_PROCESS_REFERENCE_INIT 127 uint32_t cycle = (uint32_t)hal_get_cycles(); 128 if( CONFIG_DEBUG_PROCESS_REFERENCE_INIT ) 129 printk("\n[DBG] %s : thread %x enter / pid = %x / ppid = %x / model_pid = %x / cycle %d\n", 130 __FUNCTION__ , CURRENT_THREAD , pid , parent_pid , model_pid , cycle ); 131 #endif 128 132 129 133 // initialize PID, REF_XP, PARENT_XP, and STATE 130 process->pid = pid;131 process->ref_xp = XPTR( local_cxy , process );132 process->parent_xp = parent_xp;133 process-> state = PROCESS_STATE_RUNNING;134 process->pid = pid; 135 process->ref_xp = XPTR( local_cxy , process ); 136 process->parent_xp = parent_xp; 137 process->term_state = 0; 134 138 135 139 // initialize vmm as empty … … 137 141 assert( (error == 0) , __FUNCTION__ , "cannot initialize VMM\n" ); 138 142 139 process_dmsg("\n[DBG] %s : core[%x,%d] / vmm inialised as empty for process %x\n", 140 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , pid ); 143 #if (CONFIG_DEBUG_PROCESS_REFERENCE_INIT & 1) 144 cycle = (uint32_t)hal_get_cycles(); 145 if( CONFIG_DEBUG_PROCESS_REFERENCE_INIT ) 146 printk("\n[DBG] %s : thread %x / vmm empty for process %x / cycle %d\n", 147 __FUNCTION__ , CURRENT_THREAD , pid , cycle ); 148 #endif 141 149 142 150 // initialize fd_array as empty … … 224 232 remote_rwlock_init( XPTR( local_cxy , &process->cwd_lock ) ); 225 233 226 process_dmsg("\n[DBG] %s : core[%x,%d] / fd array initialised for process %x\n", 227 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , pid ); 234 #if (CONFIG_DEBUG_PROCESS_REFERENCE_INIT & 1) 235 cycle = (uint32_t)hal_get_cycles(); 236 if( CONFIG_DEBUG_PROCESS_REFERENCE_INIT ) 237 printk("\n[DBG] %s : thread %x / fd_array for process %x / cycle %d\n", 238 __FUNCTION__ , CURRENT_THREAD , pid , cycle ); 239 #endif 228 240 229 241 // reset children list root … … 260 272 hal_fence(); 261 273 262 process_dmsg("\n[DBG] %s : core[%x,%d] exit for process %x\n", 263 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , pid ); 274 #if (CONFIG_DEBUG_PROCESS_REFERENCE_INIT & 1) 275 cycle = (uint32_t)hal_get_cycles(); 276 if( CONFIG_DEBUG_PROCESS_REFERENCE_INIT ) 277 printk("\n[DBG] %s : thread %x exit / process %x / cycle %d\n", 278 __FUNCTION__ , CURRENT_THREAD , pid , cycle ); 279 #endif 264 280 265 281 } // process_reference_init() … … 276 292 277 293 // initialize PID, REF_XP, PARENT_XP, and STATE 278 local_process->pid = hal_remote_lw( XPTR( ref_cxy , &ref_ptr->pid ) ); 279 local_process->parent_xp = hal_remote_lwd( XPTR( ref_cxy , &ref_ptr->parent_xp ) ); 280 local_process->ref_xp = reference_process_xp; 281 local_process->state = PROCESS_STATE_RUNNING; 282 283 process_dmsg("\n[DBG] %s : core[%x,%d] enters for process %x\n", 284 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , local_process->pid ); 294 local_process->pid = hal_remote_lw( XPTR( ref_cxy , &ref_ptr->pid ) ); 295 local_process->parent_xp = hal_remote_lwd( XPTR( ref_cxy , &ref_ptr->parent_xp ) ); 296 local_process->ref_xp = reference_process_xp; 297 local_process->term_state = 0; 298 299 #if CONFIG_DEBUG_PROCESS_COPY_INIT 300 uint32_t cycle = (uint32_t)hal_get_cycles(); 301 if( CONFIG_DEBUG_PROCESS_COPY_INIT ) 302 printk("\n[DBG] %s : thread %x enter for process %x\n", 303 __FUNCTION__ , CURRENT_THREAD , local_process->pid ); 304 #endif 285 305 286 306 // reset local process vmm … … 327 347 hal_fence(); 328 348 329 process_dmsg("\n[DBG] %s : core[%x,%d] exit for process %x\n", 330 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , local_process->pid ); 349 #if CONFIG_DEBUG_PROCESS_COPY_INIT 350 cycle = (uint32_t)hal_get_cycles(); 351 if( CONFIG_DEBUG_PROCESS_COPY_INIT ) 352 printk("\n[DBG] %s : thread %x exit for process %x\n", 353 __FUNCTION__ , CURRENT_THREAD , local_process->pid ); 354 #endif 331 355 332 356 return 0; … … 347 371 "process %x in cluster %x has still active threads", process->pid , local_cxy ); 348 372 349 process_dmsg("\n[DBG] %s : core[%x,%d] enter for process %x\n", 350 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , process->pid ); 373 #if CONFIG_DEBUG_PROCESS_DESTROY 374 uint32_t cycle = (uint32_t)hal_get_cycles(); 375 if( CONFIG_DEBUG_PROCESS_DESTROY ) 376 printk("\n[DBG] %s : thread %x enter to destroy process %x (pid = %x) / cycle %d\n", 377 __FUNCTION__ , CURRENT_THREAD , process, process->pid , cycle ); 378 #endif 351 379 352 380 // get local process manager pointer … … 386 414 xlist_unlink( XPTR( local_cxy , &process->children_list ) ); 387 415 remote_spinlock_unlock( children_lock_xp ); 388 389 // get extende pointer on parent main thread390 parent_thread_xp = XPTR( parent_cxy ,391 hal_remote_lpt( XPTR( parent_cxy , &parent_ptr->th_tbl[1] )));392 393 // unblock parent process main thread394 thread_unblock( parent_thread_xp , THREAD_BLOCKED_WAIT );395 416 } 396 417 … … 411 432 process_free( process ); 412 433 413 process_dmsg("\n[DBG] %s : core[%x,%d] exit for process %x\n", 414 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , process->pid ); 434 #if CONFIG_DEBUG_PROCESS_DESTROY 435 cycle = (uint32_t)hal_get_cycles(); 436 if( CONFIG_DEBUG_PROCESS_DESTROY ) 437 printk("\n[DBG] %s : thread %x exit / destroyed process %x (pid = %x) / cycle %d\n", 438 __FUNCTION__ , CURRENT_THREAD , process, process->pid, cycle ); 439 #endif 415 440 416 441 } // end process_destroy() … … 440 465 uint32_t responses; // number of remote process copies 441 466 uint32_t rsp_count; // used to assert number of copies 442 443 467 rpc_desc_t rpc; // rpc descriptor allocated in stack 444 468 445 process_dmsg("\n[DBG] %s : enter to %s process %x in cluster %x\n", 446 __FUNCTION__ , process_action_str( action_type ) , process->pid , local_cxy ); 469 #if CONFIG_DEBUG_PROCESS_SIGACTION 470 uint32_t cycle = (uint32_t)hal_get_cycles(); 471 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 472 printk("\n[DBG] %s : thread %x enter to %s process %x in cluster %x / cycle %d\n", 473 __FUNCTION__ , CURRENT_THREAD, process_action_str( action_type ) , 474 process->pid , local_cxy , cycle ); 475 #endif 447 476 448 477 thread_t * client = CURRENT_THREAD; 449 xptr_t client_xp = XPTR( local_cxy , client );450 478 451 479 // get local pointer on local cluster manager … … 492 520 { 493 521 494 process_dmsg("\n[DBG] %s : send RPC to remote cluster %x\n", 495 __FUNCTION__ , process_cxy ); 522 #if CONFIG_DEBUG_PROCESS_SIGACTION 523 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 524 printk("\n[DBG] %s : send RPC to remote cluster %x\n", __FUNCTION__ , process_cxy ); 525 #endif 496 526 497 527 rpc.args[0] = (uint64_t)action_type; … … 517 547 } 518 548 519 process_dmsg("\n[DBG] %s : make action in owner cluster %x\n", 520 __FUNCTION__ , local_cxy ); 521 549 #if CONFIG_DEBUG_PROCESS_SIGACTION 550 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 551 printk("\n[DBG] %s : make action in owner cluster %x\n", __FUNCTION__ , local_cxy ); 552 #endif 522 553 523 554 // call directly the relevant function in local owner cluster 524 if (action_type == DELETE_ALL_THREADS ) process_delete_threads ( process , client_xp ); 525 else if (action_type == BLOCK_ALL_THREADS ) process_block_threads ( process , client_xp ); 526 else if (action_type == UNBLOCK_ALL_THREADS ) process_unblock_threads( process ); 527 528 process_dmsg("\n[DBG] %s : exit after %s process %x in cluster %x\n", 529 __FUNCTION__ , process_action_str( action_type ) , process->pid , local_cxy ); 555 if (action_type == DELETE_ALL_THREADS ) process_delete_threads ( process ); 556 else if (action_type == BLOCK_ALL_THREADS ) process_block_threads ( process ); 557 else if (action_type == UNBLOCK_ALL_THREADS ) process_unblock_threads( process ); 558 559 #if CONFIG_DEBUG_PROCESS_SIGACTION 560 cycle = (uint32_t)hal_get_cycles(); 561 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 562 printk("\n[DBG] %s : thread %x exit after %s process %x in cluster %x / cycle %d\n", 563 __FUNCTION__ , CURRENT_THREAD, process_action_str( action_type ) , 564 process->pid , local_cxy , cycle ); 565 #endif 530 566 531 567 } // end process_sigaction() 532 568 533 //////////////////////////////////////////////// 534 void process_block_threads( process_t * process, 535 xptr_t client_xp ) 569 ///////////////////////////////////////////////// 570 void process_block_threads( process_t * process ) 536 571 { 537 572 thread_t * target; // pointer on target thread 573 thread_t * this; // pointer on calling thread 538 574 uint32_t ltid; // index in process th_tbl 539 thread_t * requester; // requesting thread pointer540 575 uint32_t count; // requests counter 541 576 volatile uint32_t rsp_count; // responses counter 542 577 543 578 // get calling thread pointer 544 requester = CURRENT_THREAD; 545 546 sigaction_dmsg("\n[DBG] %s : enter for process %x in cluster %x\n", 547 __FUNCTION__ , process->pid , local_cxy ); 579 this = CURRENT_THREAD; 580 581 #if CONFIG_DEBUG_PROCESS_SIGACTION 582 uint32_t cycle = (uint32_t)hal_get_cycles(); 583 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 584 printk("\n[DBG] %s : thread %x enter for process %x in cluster %x / cycle %d\n", 585 __FUNCTION__ , this , process->pid , local_cxy , cycle ); 586 #endif 548 587 549 588 // get lock protecting process th_tbl[] … … 559 598 target = process->th_tbl[ltid]; 560 599 600 assert( (target != this) , __FUNCTION__ , "calling thread cannot be a target\n" ); 601 561 602 if( target != NULL ) // thread found 562 603 { 563 604 count++; 564 605 565 // - if the target thread is the client thread, we do nothing,566 // and we simply decrement the responses counter.567 606 // - if the calling thread and the target thread are on the same core, 568 607 // we block the target thread, we don't need confirmation from scheduler, … … 572 611 // to be sure that the target thread is not running. 573 612 574 if( XPTR( local_cxy , target ) == client_xp ) 575 { 576 // decrement responses counter 577 hal_atomic_add( (void *)&rsp_count , -1 ); 578 } 579 else if( requester->core->lid == target->core->lid ) 613 if( this->core->lid == target->core->lid ) 580 614 { 581 615 // set the global blocked bit in target thread descriptor. … … 612 646 } 613 647 614 sigaction_dmsg("\n[DBG] %s : exit for process %x in cluster %x / %d threads blocked\n", 615 __FUNCTION__ , process->pid , local_cxy , count ); 648 #if CONFIG_DEBUG_PROCESS_SIGACTION 649 cycle = (uint32_t)hal_get_cycles(); 650 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 651 printk("\n[DBG] %s : thread %x exit for process %x in cluster %x / cycle %d\n", 652 __FUNCTION__ , this , process->pid , local_cxy , cycle ); 653 #endif 616 654 617 655 } // end process_block_threads() … … 621 659 { 622 660 thread_t * target; // pointer on target thead 661 thread_t * this; // pointer on calling thread 623 662 uint32_t ltid; // index in process th_tbl 624 663 uint32_t count; // requests counter 625 664 626 sigaction_dmsg("\n[DBG] %s : enter for process %x in cluster %x\n", 627 __FUNCTION__ , process->pid , local_cxy ); 665 // get calling thread pointer 666 this = CURRENT_THREAD; 667 668 #if CONFIG_DEBUG_PROCESS_SIGACTION 669 uint32_t cycle = (uint32_t)hal_get_cycles(); 670 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 671 printk("\n[DBG] %s : thread %x enter for process %x in cluster %x / cycle %d\n", 672 __FUNCTION__ , this , process->pid , local_cxy , cycle ); 673 #endif 628 674 629 675 // get lock protecting process th_tbl[] … … 636 682 target = process->th_tbl[ltid]; 637 683 684 assert( (target != this) , __FUNCTION__ , "calling thread cannot be a target\n" ); 685 638 686 if( target != NULL ) // thread found 639 687 { … … 648 696 spinlock_unlock( &process->th_lock ); 649 697 650 sigaction_dmsg("\n[DBG] %s : exit for process %x in cluster %x / %d threads blocked\n", 651 __FUNCTION__ , process->pid , local_cxy , count ); 698 #if CONFIG_DEBUG_PROCESS_SIGACTION 699 cycle = (uint32_t)hal_get_cycles(); 700 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 701 printk("\n[DBG] %s : thread %x exit for process %x in cluster %x / cycle %d\n", 702 __FUNCTION__ , this , process->pid , local_cxy , cycle ); 703 #endif 652 704 653 705 } // end process_unblock_threads() 654 706 655 ///////////////////////////////////////////////// 656 void process_delete_threads( process_t * process, 657 xptr_t client_xp ) 707 ////////////////////////////////////////////////// 708 void process_delete_threads( process_t * process ) 658 709 { 659 710 thread_t * target; // pointer on target thread 711 thread_t * this; // pointer on calling thread 660 712 uint32_t ltid; // index in process th_tbl 661 713 uint32_t count; // request counter 662 663 sigaction_dmsg("\n[DBG] %s : enter for process %x in cluster %x at cycle %d\n", 664 __FUNCTION__ , process->pid , local_cxy , (uint32_t)hal_get_cycles() ); 714 cxy_t owner_cxy; // owner cluster identifier 715 716 // get calling thread pointer 717 this = CURRENT_THREAD; 718 owner_cxy = CXY_FROM_PID( process->pid ); 719 720 #if CONFIG_DEBUG_PROCESS_SIGACTION 721 uint32_t cycle = (uint32_t)hal_get_cycles(); 722 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 723 printk("\n[DBG] %s : thread %x enter for process %x in cluster %x / cycle %d\n", 724 __FUNCTION__ , this , process->pid , local_cxy , cycle ); 725 #endif 665 726 666 727 // get lock protecting process th_tbl[] … … 673 734 target = process->th_tbl[ltid]; 674 735 675 if( target != NULL ) // thread found 736 assert( (target != this) , __FUNCTION__ , "calling thread cannot be a target\n" ); 737 738 if( target != NULL ) // thread found 676 739 { 677 740 count++; 678 679 // delete only if the target is not the client680 if( XPTR( local_cxy , target ) != client_xp )681 { 741 742 // the main thread should not be deleted 743 if( (owner_cxy != local_cxy) || (ltid != 0) ) 744 { 682 745 hal_atomic_or( &target->flags , THREAD_FLAG_REQ_DELETE ); 683 746 } … … 688 751 spinlock_unlock( &process->th_lock ); 689 752 690 sigaction_dmsg("\n[DBG] %s : exit for process %x in cluster %x at cycle %d\n", 691 __FUNCTION__ , process->pid , local_cxy , (uint32_t)hal_get_cycles() ); 753 #if CONFIG_DEBUG_PROCESS_SIGACTION 754 cycle = (uint32_t)hal_get_cycles(); 755 if( CONFIG_DEBUG_PROCESS_SIGACTION < cycle ) 756 printk("\n[DBG] %s : thread %x exit for process %x in cluster %x / cycle %d\n", 757 __FUNCTION__ , this , process->pid , local_cxy , cycle ); 758 #endif 692 759 693 760 } // end process_delete_threads() … … 988 1055 "parent process must be the reference process\n" ); 989 1056 990 fork_dmsg("\n[DBG] %s : core[%x,%d] enter at cycle %d\n", 991 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid , (uint32_t)hal_get_cycles() ); 1057 #if CONFIG_DEBUG_PROCESS_MAKE_FORK 1058 uint32_t cycle = (uint32_t)hal_get_cycles(); 1059 if( CONFIG_DEBUG_PROCESS_MAKE_FORK < cycle ) 1060 printk("\n[DBG] %s : thread %x enter for process %x / cycle %d\n", 1061 __FUNCTION__, CURRENT_THREAD, parent_pid, cycle ); 1062 #endif 992 1063 993 1064 // allocate a process descriptor … … 999 1070 return -1; 1000 1071 } 1001 1002 fork_dmsg("\n[DBG] %s : core[%x,%d] created child process %x at cycle %d\n",1003 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, process, (uint32_t)hal_get_cycles() );1004 1072 1005 1073 // allocate a child PID from local cluster … … 1012 1080 return -1; 1013 1081 } 1014 1015 fork_dmsg("\n[DBG] %s : core[%x, %d] child process PID = %x at cycle %d\n",1016 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid, new_pid , (uint32_t)hal_get_cycles() );1017 1082 1018 1083 // initializes child process descriptor from parent process descriptor … … 1022 1087 parent_process_xp ); 1023 1088 1024 fork_dmsg("\n[DBG] %s : core[%x, %d] child process initialised at cycle %d\n", 1025 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid, hal_get_cycles() ); 1089 #if CONFIG_DEBUG_PROCESS_MAKE_FORK 1090 cycle = (uint32_t)hal_get_cycles(); 1091 if( CONFIG_DEBUG_PROCESS_MAKE_FORK < cycle ) 1092 printk("\n[DBG] %s : thread %x created child_process %x / child_pid %x / cycle %d\n", 1093 __FUNCTION__, CURRENT_THREAD, process, new_pid, cycle ); 1094 #endif 1026 1095 1027 1096 // copy VMM from parent descriptor to child descriptor … … 1037 1106 } 1038 1107 1039 fork_dmsg("\n[DBG] %s : core[%x, %d] child process VMM copied at cycle %d\n", 1040 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid, (uint32_t)hal_get_cycles() ); 1108 #if CONFIG_DEBUG_PROCESS_MAKE_FORK 1109 cycle = (uint32_t)hal_get_cycles(); 1110 if( CONFIG_DEBUG_PROCESS_MAKE_FORK < cycle ) 1111 printk("\n[DBG] %s : thread %x copied VMM from parent %x to child %x / cycle %d\n", 1112 __FUNCTION__ , CURRENT_THREAD , parent_pid, new_pid, cycle ); 1113 #endif 1041 1114 1042 1115 // update extended pointer on .elf file … … 1059 1132 assert( (thread->trdid == 0) , __FUNCTION__ , "main thread must have index 0\n" ); 1060 1133 1061 fork_dmsg("\n[DBG] %s : core[%x,%d] child thread created at cycle %d\n", 1062 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid, (uint32_t)hal_get_cycles() ); 1063 1064 // update parent process GPT to set Copy_On_Write for shared data vsegs 1134 #if CONFIG_DEBUG_PROCESS_MAKE_FORK 1135 cycle = (uint32_t)hal_get_cycles(); 1136 if( CONFIG_DEBUG_PROCESS_MAKE_FORK < cycle ) 1137 printk("\n[DBG] %s : thread %x created child thread %x / cycle %d\n", 1138 __FUNCTION__ , CURRENT_THREAD, thread, cycle ); 1139 #endif 1140 1141 // set Copy_On_Write flag in parent process GPT 1065 1142 // this includes all replicated GPT copies 1066 1143 if( parent_process_cxy == local_cxy ) // reference is local … … 1074 1151 } 1075 1152 1076 fork_dmsg("\n[DBG] %s : core[%x,%d] COW set in parent_process at cycle %d\n", 1077 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid, (uint32_t)hal_get_cycles() ); 1153 // set Copy_On_Write flag in child process GPT 1154 vmm_set_cow( process ); 1155 1156 #if CONFIG_DEBUG_PROCESS_MAKE_FORK 1157 cycle = (uint32_t)hal_get_cycles(); 1158 if( CONFIG_DEBUG_PROCESS_MAKE_FORK < cycle ) 1159 printk("\n[DBG] %s : thread %x set COW in parent and child / cycle %d\n", 1160 __FUNCTION__ , CURRENT_THREAD, cycle ); 1161 #endif 1078 1162 1079 1163 // get extended pointers on parent children_root, children_lock and children_nr … … 1092 1176 *child_pid = new_pid; 1093 1177 1094 1095 fork_dmsg("\n[DBG] %s : core[%x,%d] exit at cycle %d\n", 1096 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, (uint32_t)hal_get_cycles() ); 1178 #if CONFIG_DEBUG_PROCESS_MAKE_FORK 1179 cycle = (uint32_t)hal_get_cycles(); 1180 if( CONFIG_DEBUG_PROCESS_MAKE_FORK < cycle ) 1181 printk("\n[DBG] %s : thread %x exit / cycle %d\n", 1182 __FUNCTION__, CURRENT_THREAD, cycle ); 1183 #endif 1097 1184 1098 1185 return 0; … … 1105 1192 { 1106 1193 char * path; // pathname to .elf file 1107 pid_t pid; // old_process PID given to new_process1108 pid_t temp_pid; // temporary PID given to old_process1194 pid_t pid; // old_process PID / given to new_process 1195 pid_t temp_pid; // temporary PID / given to old_process 1109 1196 process_t * old_process; // local pointer on old process 1197 thread_t * old_thread; // local pointer on old thread 1110 1198 process_t * new_process; // local pointer on new process 1111 thread_t * new_thread; // local pointer on main thread 1112 pthread_attr_t attr; // main thread attributes 1199 thread_t * new_thread; // local pointer on new thread 1200 xptr_t parent_xp; // extended pointer on parent process 1201 pthread_attr_t attr; // new thread attributes 1113 1202 lid_t lid; // selected core local index 1114 1203 error_t error; 1115 1204 1116 // get .elf pathname and PID from exec_info 1205 // get old_thread / old_process / PID / parent_xp 1206 old_thread = CURRENT_THREAD; 1207 old_process = old_thread->process; 1208 pid = old_process->pid; 1209 parent_xp = old_process->parent_xp; 1210 1211 // get .elf pathname from exec_info 1117 1212 path = exec_info->path; 1118 pid = exec_info->pid;1119 1213 1120 1214 // this function must be executed by a thread running in owner cluster 1121 1215 assert( (CXY_FROM_PID( pid ) == local_cxy), __FUNCTION__, 1122 "local cluster %x is not owner for process %x\n", local_cxy, pid ); 1123 1124 exec_dmsg("\n[DBG] %s : core[%x,%d] enters for process %x / %s / cycle %d\n", 1125 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, pid, path, (uint32_t)hal_get_cycles() ); 1126 1127 // get old_process local pointer 1128 old_process = (process_t *)cluster_get_local_process_from_pid( pid ); 1129 1130 if( old_process == NULL ) 1131 { 1132 printk("\n[ERROR] in %s : cannot get old process descriptor\n", __FUNCTION__ ); 1133 return -1; 1134 } 1216 "local_cluster must be owner_cluster\n" ); 1217 1218 assert( (LTID_FROM_TRDID( old_thread->trdid ) == 0) , __FUNCTION__, 1219 "must be called by the main thread\n" ); 1220 1221 #if CONFIG_DEBUG_PROCESS_MAKE_EXEC 1222 uint32_t cycle = (uint32_t)hal_get_cycles(); 1223 if( CONFIG_DEBUG_PROCESS_MAKE_EXEC < cycle ) 1224 printk("\n[DBG] %s : thread %x enters for process %x / %s / cycle %d\n", 1225 __FUNCTION__, old_thread, pid, path, cycle ); 1226 #endif 1135 1227 1136 1228 // allocate memory for new_process descriptor … … 1144 1236 } 1145 1237 1146 // get a newPID for old_process1238 // get a temporary PID for old_process 1147 1239 error = cluster_pid_alloc( old_process , &temp_pid ); 1148 1240 if( error ) … … 1154 1246 } 1155 1247 1156 // request blocking for all threads in old_process (but the calling thread) 1157 process_sigaction( old_process , BLOCK_ALL_THREADS ); 1158 1159 // request destruction for all threads in old_process (but the calling thread) 1160 process_sigaction( old_process , DELETE_ALL_THREADS ); 1161 1162 exec_dmsg("\n[DBG] %s : core[%x,%d] marked old threads for destruction / cycle %d\n", 1163 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid , (uint32_t)hal_get_cycles() ); 1164 1165 // set new PID to old_process 1248 // set temporary PID to old_process 1166 1249 old_process->pid = temp_pid; 1167 1250 … … 1169 1252 process_reference_init( new_process, 1170 1253 pid, 1171 old_process->parent_xp,// parent_process_xp1172 XPTR(local_cxy , old_process) ); // model_process _xp1254 parent_xp, // parent_process_xp 1255 XPTR(local_cxy , old_process) ); // model_process 1173 1256 1174 1257 // give TXT ownership to new_process 1175 1258 process_txt_set_ownership( XPTR( local_cxy , new_process ) ); 1176 1259 1177 exec_dmsg("\n[DBG] %s : core[%x,%d] initialised new process %x / cycle %d \n", 1178 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, new_process, (uint32_t)hal_get_cycles() ); 1260 #if CONFIG_DEBUG_PROCESS_MAKE_EXEC 1261 cycle = (uint32_t)hal_get_cycles(); 1262 if( CONFIG_DEBUG_PROCESS_MAKE_EXEC < cycle ) 1263 printk("\n[DBG] %s : thread %x created new process %x / cycle %d \n", 1264 __FUNCTION__ , old_thread , new_process , cycle ); 1265 #endif 1179 1266 1180 1267 // register code & data vsegs as well as entry-point in new process VMM, … … 1188 1275 } 1189 1276 1190 exec_dmsg("\n[DBG] %s : core[%x,%d] vsegs registered in new process %x / cycle %d\n", 1191 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, new_process, (uint32_t)hal_get_cycles() ); 1277 #if CONFIG_DEBUG_PROCESS_MAKE_EXEC 1278 cycle = (uint32_t)hal_get_cycles(); 1279 if( CONFIG_DEBUG_PROCESS_MAKE_EXEC < cycle ) 1280 printk("\n[DBG] %s : thread %x registered code/data vsegs in new process %x / cycle %d\n", 1281 __FUNCTION__, old_thread , new_process->pid , cycle ); 1282 #endif 1192 1283 1193 1284 // select a core in local cluster to execute the main thread … … 1216 1307 assert( (new_thread->trdid == 0) , __FUNCTION__ , "main thread must have index 0\n" ); 1217 1308 1218 exec_dmsg("\n[DBG] %s : core[%x,%d] created new_process main thread / cycle %d\n", 1219 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid, (uint32_t)hal_get_cycles() ); 1220 1221 // get pointers on parent process 1222 xptr_t parent_xp = new_process->parent_xp; 1309 #if CONFIG_DEBUG_PROCESS_MAKE_EXEC 1310 cycle = (uint32_t)hal_get_cycles(); 1311 if( CONFIG_DEBUG_PROCESS_MAKE_EXEC < cycle ) 1312 printk("\n[DBG] %s : thread %x created new_process main thread %x / cycle %d\n", 1313 __FUNCTION__ , old_thread , new_thread , cycle ); 1314 #endif 1315 1316 // get cluster and local pointer on parent process 1223 1317 process_t * parent_ptr = GET_PTR( parent_xp ); 1224 1318 cxy_t parent_cxy = GET_CXY( parent_xp ); … … 1235 1329 remote_spinlock_unlock( lock_xp ); 1236 1330 1237 exec_dmsg("\n[DBG] %s : core[%x,%d] updated parent process children list / cycle %d\n",1238 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid, (uint32_t)hal_get_cycles() );1239 1240 // block and mark calling thread for deletion1241 // only when it is an user thread1242 thread_t * this = CURRENT_THREAD;1243 if( this->type == THREAD_USER )1244 {1245 thread_block( this , THREAD_BLOCKED_GLOBAL );1246 hal_atomic_or( &this->flags , THREAD_FLAG_REQ_DELETE );1247 }1248 1249 1331 // activate new thread 1250 1332 thread_unblock( XPTR( local_cxy , new_thread ) , THREAD_BLOCKED_GLOBAL ); 1251 1333 1334 // request old_thread destruction => old_process destruction 1335 thread_block( old_thread , THREAD_BLOCKED_GLOBAL ); 1336 hal_atomic_or( &old_thread->flags , THREAD_FLAG_REQ_DELETE ); 1337 1252 1338 hal_fence(); 1253 1339 1254 exec_dmsg("\n[DBG] %s : core[%x,%d] exit for path = %s / cycle %d\n", 1255 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, path , (uint32_t)hal_get_cycles() ); 1256 1340 #if CONFIG_DEBUG_PROCESS_MAKE_EXEC 1341 cycle = (uint32_t)hal_get_cycles(); 1342 if( CONFIG_DEBUG_PROCESS_MAKE_EXEC < cycle ) 1343 printk("\n[DBG] %s : old_thread %x blocked / new_thread %x activated / cycle %d\n", 1344 __FUNCTION__ , old_thread , new_thread , cycle ); 1345 #endif 1346 1257 1347 return 0; 1258 1348 1259 1349 } // end process_make_exec() 1260 1350 1261 /////////////////////////////////////// 1262 void process_make_kill( pid_t pid, 1263 uint32_t sig_id ) 1264 { 1265 // this function must be executed by a thread running in owner cluster 1266 assert( (CXY_FROM_PID( pid ) == local_cxy) , __FUNCTION__ , 1267 "must execute in owner cluster" ); 1268 1351 //////////////////////////////////////////// 1352 void process_make_kill( process_t * process, 1353 bool_t is_exit, 1354 uint32_t exit_status ) 1355 { 1269 1356 thread_t * this = CURRENT_THREAD; 1270 1357 1271 kill_dmsg("\n[DBG] %s : core[%x,%d] enter / process %x / sig %d\n", 1272 __FUNCTION__, local_cxy, this->core->lid, pid , sig_id ); 1273 1274 // get pointer on local target process descriptor 1275 process_t * process = process_get_local_copy( pid ); 1276 1277 // does nothing if process does not exist 1278 if( process == NULL ) 1279 { 1280 printk("\n[WARNING] %s : process %x does not exist => do nothing\n", 1281 __FUNCTION__ , pid ); 1282 return; 1283 } 1284 1285 // analyse signal type 1286 switch( sig_id ) 1287 { 1288 case SIGSTOP: 1289 { 1290 // block all threads in all clusters 1291 process_sigaction( process , BLOCK_ALL_THREADS ); 1292 1293 // remove TXT ownership to target process 1294 process_txt_reset_ownership( XPTR( local_cxy , process ) ); 1295 } 1296 break; 1297 case SIGCONT: // unblock all threads in all clusters 1298 { 1299 process_sigaction( process , UNBLOCK_ALL_THREADS ); 1300 } 1301 break; 1302 case SIGKILL: // block all threads, then delete all threads 1303 { 1304 // block all threads in all clusters 1305 process_sigaction( process , BLOCK_ALL_THREADS ); 1306 1307 // remove TXT ownership to target process 1308 process_txt_reset_ownership( XPTR( local_cxy , process ) ); 1309 1310 // delete all threads (but the calling thread) 1311 process_sigaction( process , DELETE_ALL_THREADS ); 1312 1313 // delete the calling thread if required 1314 if( CURRENT_THREAD->process == process ) 1315 { 1316 // set REQ_DELETE flag 1317 hal_atomic_or( &this->flags , THREAD_FLAG_REQ_DELETE ); 1318 1319 // deschedule 1320 sched_yield( "suicide after kill" ); 1321 } 1322 } 1323 break; 1324 } 1325 1326 kill_dmsg("\n[DBG] %s : core[%x,%d] exit / process %x / sig %d \n", 1327 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, pid , sig_id ); 1358 assert( (CXY_FROM_PID( process->pid ) == local_cxy) , __FUNCTION__ , 1359 "must be executed in process owner cluster\n" ); 1360 1361 assert( ( this->type == THREAD_RPC ) , __FUNCTION__ , 1362 "must be executed by an RPC thread\n" ); 1363 1364 #if CONFIG_DEBUG_PROCESS_MAKE_KILL 1365 uint32_t cycle = (uint32_t)hal_get_cycles(); 1366 if( CONFIG_DEBUG_PROCESS_MAKE_KILL < cycle ) 1367 printk("\n[DBG] %s : thread %x enter for process %x / cycle %d\n", 1368 __FUNCTION__, this , process->pid , cycle ); 1369 #endif 1370 1371 // register exit_status in owner process descriptor 1372 if( is_exit ) process->term_state = exit_status; 1373 1374 // atomically update owner process descriptor flags 1375 if( is_exit ) hal_atomic_or( &process->term_state , PROCESS_FLAG_EXIT ); 1376 else hal_atomic_or( &process->term_state , PROCESS_FLAG_KILL ); 1377 1378 // remove TXT ownership from owner process descriptor 1379 process_txt_reset_ownership( XPTR( local_cxy , process ) ); 1380 1381 // block all process threads in all clusters 1382 process_sigaction( process , BLOCK_ALL_THREADS ); 1383 1384 // mark all process threads in all clusters for delete 1385 process_sigaction( process , DELETE_ALL_THREADS ); 1386 1387 /* unused if sys_wait deschedules without blocking [AG] 1388 1389 // get cluster and pointers on reference parent process 1390 xptr_t parent_xp = process->parent_xp; 1391 process_t * parent_ptr = GET_PTR( parent_xp ); 1392 cxy_t parent_cxy = GET_CXY( parent_xp ); 1393 1394 // get loal pointer on parent main thread 1395 thread_t * main_ptr = hal_remote_lpt( XPTR( parent_cxy , &parent_ptr->th_tbl[0] ) ); 1396 1397 // reset THREAD_BLOCKED_WAIT bit in parent process main thread 1398 thread_unblock( XPTR( parent_cxy , main_ptr ) , THREAD_BLOCKED_WAIT ); 1399 */ 1400 1401 #if CONFIG_DEBUG_PROCESS_MAKE_KILL 1402 cycle = (uint32_t)hal_get_cycles(); 1403 if( CONFIG_DEBUG_PROCESS_MAKE_KILL < cycle ) 1404 printk("\n[DBG] %s : thread %x exit for process %x / cycle %d\n", 1405 __FUNCTION__, this, process->pid , cycle ); 1406 #endif 1328 1407 1329 1408 } // end process_make_kill() 1330 1331 /////////////////////////////////////////1332 void process_make_exit( pid_t pid,1333 uint32_t status )1334 {1335 // this function must be executed by a thread running in owner cluster1336 assert( (CXY_FROM_PID( pid ) == local_cxy) , __FUNCTION__ ,1337 "must execute in owner cluster" );1338 1339 // get pointer on local process descriptor1340 process_t * process = process_get_local_copy( pid );1341 1342 // does nothing if process does not exist1343 if( process == NULL )1344 {1345 printk("\n[WARNING] %s : process %x does not exist => do nothing\n",1346 __FUNCTION__ , pid );1347 return;1348 }1349 1350 // block all threads in all clusters (but the calling thread)1351 process_sigaction( process , BLOCK_ALL_THREADS );1352 1353 // delete all threads in all clusters (but the calling thread)1354 process_sigaction( process , DELETE_ALL_THREADS );1355 1356 // delete the calling thread1357 hal_atomic_or( &CURRENT_THREAD->flags , THREAD_FLAG_REQ_DELETE );1358 1359 // deschedule1360 sched_yield( "suicide after exit" );1361 1362 } // end process_make_exit()1363 1409 1364 1410 /////////////////////////////////////////////// … … 1366 1412 { 1367 1413 1368 process_dmsg("\n[DBG] %s : core[%x,%d] enter at cycle %d\n", 1369 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, (uint32_t)hal_get_cycles() ); 1414 #if CONFIG_DEBUG_PROCESS_ZERO_CREATE 1415 uint32_t cycle = (uint32_t)hal_get_cycles(); 1416 if( CONFIG_DEBUG_PROCESS_ZERO_CREATE < cycle ) 1417 printk("\n[DBG] %s : thread %x enter / cycle %d\n", __FUNCTION__, CURRENT_THREAD, cycle ); 1418 #endif 1370 1419 1371 1420 // initialize PID, REF_XP, PARENT_XP, and STATE 1372 process->pid = 0;1373 process->ref_xp = XPTR( local_cxy , process );1374 process->parent_xp = XPTR_NULL;1375 process-> state = PROCESS_STATE_RUNNING;1421 process->pid = 0; 1422 process->ref_xp = XPTR( local_cxy , process ); 1423 process->parent_xp = XPTR_NULL; 1424 process->term_state = 0; 1376 1425 1377 1426 // reset th_tbl[] array as empty … … 1391 1440 hal_fence(); 1392 1441 1393 process_dmsg("\n[DBG] %s : core[%x,%d] exit at cycle %d\n", 1394 __FUNCTION__ , local_cxy , CURRENT_THREAD->core->lid , (uint32_t)hal_get_cycles() ); 1442 #if CONFIG_DEBUG_PROCESS_ZERO_CREATE 1443 cycle = (uint32_t)hal_get_cycles(); 1444 if( CONFIG_DEBUG_PROCESS_ZERO_CREATE < cycle ) 1445 printk("\n[DBG] %s : thread %x exit / cycle %d\n", __FUNCTION__, CURRENT_THREAD, cycle ); 1446 #endif 1395 1447 1396 1448 } // end process_zero_init() … … 1406 1458 error_t error; 1407 1459 1408 process_dmsg("\n[DBG] %s : core[%x,%d] enters at cycle %d\n", 1409 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid ); 1460 #if CONFIG_DEBUG_PROCESS_INIT_CREATE 1461 uint32_t cycle = (uint32_t)hal_get_cycles(); 1462 if( CONFIG_DEBUG_PROCESS_INIT_CREATE < cycle ) 1463 printk("\n[DBG] %s : thread %x enter / cycle %d\n", __FUNCTION__, CURRENT_THREAD, cycle ); 1464 #endif 1410 1465 1411 1466 // allocates memory for process descriptor from local cluster … … 1434 1489 XPTR( local_cxy , &process_zero ), // parent 1435 1490 XPTR( local_cxy , &process_zero ) ); // model 1436 1437 process_dmsg("\n[DBG] %s : core[%x,%d] / initialisation done\n",1438 __FUNCTION__ , local_cxy, CURRENT_THREAD->core->lid );1439 1491 1440 1492 // register "code" and "data" vsegs as well as entry-point … … 1446 1498 process_destroy( process ); 1447 1499 } 1448 1449 process_dmsg("\n[DBG] %s : core[%x,%d] vsegs registered / path = %s\n",1450 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, CONFIG_PROCESS_INIT_PATH );1451 1500 1452 1501 // get extended pointers on process_zero children_root, children_lock … … 1489 1538 hal_fence(); 1490 1539 1491 process_dmsg("\n[DBG] %s : core[%x,%d] exit / main thread = %x\n", 1492 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, thread ); 1540 #if CONFIG_DEBUG_PROCESS_INIT_CREATE 1541 cycle = (uint32_t)hal_get_cycles(); 1542 if( CONFIG_DEBUG_PROCESS_INIT_CREATE < cycle ) 1543 printk("\n[DBG] %s : thread %x exit / cycle %d\n", __FUNCTION__, CURRENT_THREAD, cycle ); 1544 #endif 1493 1545 1494 1546 } // end process_init_create() 1495 1496 //////////////////////////////////////////1497 char * process_state_str( uint32_t state )1498 {1499 if ( state == PROCESS_STATE_RUNNING ) return "RUNNING";1500 else if( state == PROCESS_STATE_KILLED ) return "KILLED";1501 else if( state == PROCESS_STATE_EXITED ) return "EXITED";1502 else return "undefined";1503 }1504 1547 1505 1548 ///////////////////////////////////////// … … 1542 1585 // get PID and state 1543 1586 pid = hal_remote_lw( XPTR( process_cxy , &process_ptr->pid ) ); 1544 state = hal_remote_lw( XPTR( process_cxy , &process_ptr-> state ) );1587 state = hal_remote_lw( XPTR( process_cxy , &process_ptr->term_state ) ); 1545 1588 1546 1589 // get PPID … … 1577 1620 if( owner_xp == process_xp ) 1578 1621 { 1579 printk("PID %X | PPID %X | %s\t| %s (FG) | %X | %d | %s\n",1580 pid, ppid, process_state_str(state), txt_name, process_ptr, th_nr, elf_name );1622 printk("PID %X | PPID %X | STS %X | %s (FG) | %X | %d | %s\n", 1623 pid, ppid, state, txt_name, process_ptr, th_nr, elf_name ); 1581 1624 } 1582 1625 else 1583 1626 { 1584 printk("PID %X | PPID %X | %s\t| %s (BG) | %X | %d | %s\n",1585 pid, ppid, process_state_str(state), txt_name, process_ptr, th_nr, elf_name );1627 printk("PID %X | PPID %X | STS %X | %s (BG) | %X | %d | %s\n", 1628 pid, ppid, state, txt_name, process_ptr, th_nr, elf_name ); 1586 1629 } 1587 1630 } // end process_display() … … 1632 1675 xptr_t lock_xp; // extended pointer on list lock in chdev 1633 1676 1634 process_dmsg("\n[DBG] %s : core[%x,%d] enter for process %x at cycle\n", 1635 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, process->pid, (uint32_t)hal_get_cycles() ); 1677 #if CONFIG_DEBUG_PROCESS_TXT_ATTACH 1678 uint32_t cycle = (uint32_t)hal_get_cycles(); 1679 if( CONFIG_DEBUG_PROCESS_TXT_ATTACH < cycle ) 1680 printk("\n[DBG] %s : thread %x enter for process %x / txt_id = %d / cycle %d\n", 1681 __FUNCTION__, CURRENT_THREAD, process->pid, txt_id, cycle ); 1682 #endif 1636 1683 1637 1684 // check process is reference … … 1657 1704 remote_spinlock_unlock( lock_xp ); 1658 1705 1659 process_dmsg("\n[DBG] %s : core[%x,%d] exit for process %x at cycle\n", 1660 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, process->pid, (uint32_t)hal_get_cycles() ); 1706 #if CONFIG_DEBUG_PROCESS_TXT_ATTACH 1707 cycle = (uint32_t)hal_get_cycles(); 1708 if( CONFIG_DEBUG_PROCESS_TXT_ATTACH < cycle ) 1709 printk("\n[DBG] %s : thread %x exit for process %x / txt_id = %d / cycle %d\n", 1710 __FUNCTION__, CURRENT_THREAD, process->pid, txt_id , cycle ); 1711 #endif 1661 1712 1662 1713 } // end process_txt_attach() … … 1670 1721 xptr_t lock_xp; // extended pointer on list lock in chdev 1671 1722 1672 process_dmsg("\n[DBG] %s : core[%x,%d] enter for process %x at cycle\n", 1673 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, process->pid, (uint32_t)hal_get_cycles() ); 1723 #if CONFIG_DEBUG_PROCESS_TXT_DETACH 1724 uint32_t cycle = (uint32_t)hal_get_cycles(); 1725 if( CONFIG_DEBUG_PROCESS_TXT_DETACH < cycle ) 1726 printk("\n[DBG] %s : thread %x enter for process %x / cycle %d\n", 1727 __FUNCTION__, CURRENT_THREAD, process->pid , cycle ); 1728 #endif 1674 1729 1675 1730 // check process is reference … … 1690 1745 remote_spinlock_unlock( lock_xp ); 1691 1746 1692 process_dmsg("\n[DBG] %s : core[%x,%d] exit for process %x at cycle %d\n", 1693 __FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, process->pid, (uint32_t)hal_get_cycles() ); 1747 #if CONFIG_DEBUG_PROCESS_TXT_DETACH 1748 cycle = (uint32_t)hal_get_cycles(); 1749 if( CONFIG_DEBUG_PROCESS_TXT_DETACH < cycle ) 1750 printk("\n[DBG] %s : thread %x exit for process %x / cycle %d\n", 1751 __FUNCTION__, CURRENT_THREAD, process->pid, cycle ); 1752 #endif 1694 1753 1695 1754 } // end process_txt_detach() … … 1732 1791 xptr_t file_xp; // extended pointer on TXT_RX pseudo file 1733 1792 xptr_t txt_xp; // extended pointer on TXT_RX chdev 1734 chdev_t * txt_ptr; 1735 cxy_t txt_cxy; 1793 chdev_t * txt_ptr; // local pointer on TXT_RX chdev 1794 cxy_t txt_cxy; // cluster of TXT_RX chdev 1795 uint32_t txt_id; // TXT_RX channel 1736 1796 xptr_t owner_xp; // extended pointer on current TXT_RX owner 1737 1797 xptr_t root_xp; // extended pointer on root of attached process list 1738 1798 xptr_t iter_xp; // iterator for xlist 1739 1799 xptr_t current_xp; // extended pointer on current process 1740 process_t * current_ptr; 1741 cxy_t current_cxy; 1742 pid_t ppid; 1800 process_t * current_ptr; // local pointer on current process 1801 cxy_t current_cxy; // cluster for current process 1802 pid_t ppid; // parent process identifier for current process 1743 1803 1744 1804 // get cluster and local pointer on process … … 1752 1812 txt_xp = chdev_from_file( file_xp ); 1753 1813 txt_cxy = GET_CXY( txt_xp ); 1754 txt_ptr = (chdev_t *)GET_PTR( txt_xp );1755 1756 // get extended pointer on TXT_RX owner 1814 txt_ptr = GET_PTR( txt_xp ); 1815 1816 // get extended pointer on TXT_RX owner and TXT channel 1757 1817 owner_xp = hal_remote_lwd( XPTR( txt_cxy , &txt_ptr->ext.txt.owner_xp ) ); 1818 txt_id = hal_remote_lw ( XPTR( txt_cxy , &txt_ptr->channel ) ); 1758 1819 1759 1820 // transfer ownership to KSH if required 1760 if( owner_xp == process_xp)1821 if( (owner_xp == process_xp) && (txt_id > 0) ) 1761 1822 { 1762 1823 // get extended pointer on root of list of attached processes … … 1782 1843 } 1783 1844 } 1784 } 1785 1786 assert( false , __FUNCTION__ , "KSH process not found" ); 1787 1845 1846 assert( false , __FUNCTION__ , "KSH process not found" ); 1847 } 1788 1848 } // end process_txt_reset_ownership() 1789 1849
Note: See TracChangeset
for help on using the changeset viewer.