execute takes nonnull of job, not ref, because harness might free job
This commit is contained in:
		
							parent
							
								
									cd4c5467ba
								
							
						
					
					
						commit
						c25b62ee3e
					
				| 
						 | 
					@ -739,17 +739,19 @@ mod job {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pub fn execute(&self, scope: &super::Scope) {
 | 
					        pub fn execute(job: NonNull<Self>, scope: &super::Scope) {
 | 
				
			||||||
            // SAFETY: self is non-null
 | 
					            // SAFETY: self is non-null
 | 
				
			||||||
            unsafe {
 | 
					            unsafe {
 | 
				
			||||||
                let (ptr, state) = self.harness_and_state.ptr_and_tag(Ordering::Relaxed);
 | 
					                let this = job.as_ref();
 | 
				
			||||||
                debug_assert_eq!(state, JobState::Pending as usize);
 | 
					                let (ptr, state) = this.harness_and_state.ptr_and_tag(Ordering::Relaxed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                debug_assert_eq!(state, JobState::Pending as usize);
 | 
				
			||||||
                let harness: unsafe fn(*const (), *const Self, scope: &super::Scope) =
 | 
					                let harness: unsafe fn(*const (), *const Self, scope: &super::Scope) =
 | 
				
			||||||
                    mem::transmute(ptr.as_ptr());
 | 
					                    mem::transmute(ptr.as_ptr());
 | 
				
			||||||
                let this = (*self.val_or_this.get()).this;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                harness(this.as_ptr().cast(), (self as *const Self).cast(), scope);
 | 
					                let this = (*this.val_or_this.get()).this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                harness(this.as_ptr().cast(), job.as_ptr(), scope);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1096,9 +1098,9 @@ impl Scope {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[inline]
 | 
					    #[inline]
 | 
				
			||||||
    fn execute(&self, job: &Job) {
 | 
					    fn execute(&self, job: NonNull<Job>) {
 | 
				
			||||||
        self.tick();
 | 
					        self.tick();
 | 
				
			||||||
        job.execute(self);
 | 
					        Job::execute(job, self);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[cold]
 | 
					    #[cold]
 | 
				
			||||||
| 
						 | 
					@ -1125,9 +1127,7 @@ impl Scope {
 | 
				
			||||||
            if ptr.as_ptr() == &*job as *const _ as *mut _ {
 | 
					            if ptr.as_ptr() == &*job as *const _ as *mut _ {
 | 
				
			||||||
                return None;
 | 
					                return None;
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                unsafe {
 | 
					                self.execute(ptr);
 | 
				
			||||||
                    self.execute(ptr.as_ref());
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1148,9 +1148,7 @@ impl Scope {
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            unsafe {
 | 
					            self.execute(job);
 | 
				
			||||||
                self.execute(job.as_ref());
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // while job isn't done, run other jobs.
 | 
					        // while job isn't done, run other jobs.
 | 
				
			||||||
        Some(job.wait())
 | 
					        Some(job.wait())
 | 
				
			||||||
| 
						 | 
					@ -1279,9 +1277,7 @@ fn worker(ctx: Arc<Context>, barrier: Arc<std::sync::Barrier>) {
 | 
				
			||||||
    let mut job = ctx.shared.lock().jobs.pop_first();
 | 
					    let mut job = ctx.shared.lock().jobs.pop_first();
 | 
				
			||||||
    loop {
 | 
					    loop {
 | 
				
			||||||
        if let Some((_, job)) = job {
 | 
					        if let Some((_, job)) = job {
 | 
				
			||||||
            unsafe {
 | 
					            scope.execute(job);
 | 
				
			||||||
                scope.execute(job.as_ref());
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let mut guard = ctx.shared.lock();
 | 
					        let mut guard = ctx.shared.lock();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue