@@ -67,7 +67,6 @@ impl TaskControlBlock {
6767 . translate ( VirtAddr :: from ( TRAP_CONTEXT ) . into ( ) )
6868 . unwrap ( )
6969 . ppn ( ) ;
70- let task_status = TaskStatus :: Ready ;
7170 // alloc a pid and a kernel stack in kernel space
7271 let pid_handle = pid_alloc ( ) ;
7372 let kernel_stack = KernelStack :: new ( & pid_handle) ;
@@ -81,7 +80,7 @@ impl TaskControlBlock {
8180 trap_cx_ppn,
8281 base_size : user_sp,
8382 task_cx_ptr : task_cx_ptr as usize ,
84- task_status,
83+ task_status : TaskStatus :: Ready ,
8584 memory_set,
8685 parent : None ,
8786 children : Vec :: new ( ) ,
@@ -97,9 +96,7 @@ impl TaskControlBlock {
9796 } ) ,
9897 } ;
9998 // prepare TrapContext in user space
100- // ---- acquire child PCB lock
10199 let trap_cx = task_control_block. acquire_inner_lock ( ) . get_trap_cx ( ) ;
102- // ---- release child PCB lock
103100 * trap_cx = TrapContext :: app_init_context (
104101 entry_point,
105102 user_sp,
@@ -118,29 +115,25 @@ impl TaskControlBlock {
118115 . ppn ( ) ;
119116
120117 // **** hold current PCB lock
121- let mut inner = self . inner . lock ( ) ;
118+ let mut inner = self . acquire_inner_lock ( ) ;
122119 // substitute memory_set
123120 inner. memory_set = memory_set;
124121 // update trap_cx ppn
125122 inner. trap_cx_ppn = trap_cx_ppn;
126- drop ( inner) ;
127- // **** release current PCB lock manually
128-
129123 // initialize trap_cx
130- // **** acquire current PCB lock
131- let trap_cx = self . acquire_inner_lock ( ) . get_trap_cx ( ) ;
132- // **** release current PCB lock
124+ let trap_cx = inner. get_trap_cx ( ) ;
133125 * trap_cx = TrapContext :: app_init_context (
134126 entry_point,
135127 user_sp,
136128 KERNEL_SPACE . lock ( ) . token ( ) ,
137129 self . kernel_stack . get_top ( ) ,
138130 trap_handler as usize ,
139131 ) ;
132+ // **** release current PCB lock
140133 }
141134 pub fn fork ( self : & Arc < TaskControlBlock > ) -> Arc < TaskControlBlock > {
142135 // ---- hold parent PCB lock
143- let mut parent_inner = self . inner . lock ( ) ;
136+ let mut parent_inner = self . acquire_inner_lock ( ) ;
144137 // copy user space(include trap context)
145138 let memory_set = MemorySet :: from_existed_user (
146139 & parent_inner. memory_set
@@ -149,7 +142,6 @@ impl TaskControlBlock {
149142 . translate ( VirtAddr :: from ( TRAP_CONTEXT ) . into ( ) )
150143 . unwrap ( )
151144 . ppn ( ) ;
152- let task_status = TaskStatus :: Ready ;
153145 // alloc a pid and a kernel stack in kernel space
154146 let pid_handle = pid_alloc ( ) ;
155147 let kernel_stack = KernelStack :: new ( & pid_handle) ;
@@ -172,7 +164,7 @@ impl TaskControlBlock {
172164 trap_cx_ppn,
173165 base_size : parent_inner. base_size ,
174166 task_cx_ptr : task_cx_ptr as usize ,
175- task_status,
167+ task_status : TaskStatus :: Ready ,
176168 memory_set,
177169 parent : Some ( Arc :: downgrade ( self ) ) ,
178170 children : Vec :: new ( ) ,
0 commit comments