Skip to content

Commit

Permalink
Replace pending_tasks.merge with AtomicI32
Browse files Browse the repository at this point in the history
This change moves the `merge` field out of
`Rav1dFrameContext_task_thread_pending_tasks` into the parent struct,
`Rav1dFrameContext_task_thread`, in preparation to move the
`pending_tasks` field into a Mutex.
  • Loading branch information
rinon committed Jan 12, 2024
1 parent 220a1ba commit 8cdae04
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 10 deletions.
2 changes: 1 addition & 1 deletion src/internal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,6 @@ pub struct Rav1dFrameContext_lf {

#[repr(C)]
pub struct Rav1dFrameContext_task_thread_pending_tasks {
pub merge: atomic_int,
pub lock: pthread_mutex_t,
pub head: *mut Rav1dTask,
pub tail: *mut Rav1dTask,
Expand Down Expand Up @@ -442,6 +441,7 @@ pub(crate) struct Rav1dFrameContext_task_thread {
// [head;cur-1] when picking one for execution.
pub task_cur_prev: *mut Rav1dTask,
// async task insertion
pub pending_tasks_merge: AtomicI32,
pub pending_tasks: Rav1dFrameContext_task_thread_pending_tasks,
}

Expand Down
4 changes: 2 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ use std::mem;
use std::mem::MaybeUninit;
use std::process::abort;
use std::ptr::NonNull;
use std::sync::atomic::AtomicI32;
use std::sync::atomic::Ordering;
use std::sync::Arc;
use std::sync::Once;
Expand Down Expand Up @@ -896,8 +897,7 @@ pub(crate) unsafe fn rav1d_flush(c: *mut Rav1dContext) {
*fresh5 = 0 as *mut Rav1dTask;
*&mut (*((*c).fc).offset(i_1 as isize))
.task_thread
.pending_tasks
.merge = 0 as c_int;
.pending_tasks_merge = AtomicI32::new(0);
i_1 = i_1.wrapping_add(1);
}
*&mut (*c).task_thread.first = 0 as c_int as c_uint;
Expand Down
17 changes: 10 additions & 7 deletions src/thread_task.rs
Original file line number Diff line number Diff line change
Expand Up @@ -318,22 +318,23 @@ unsafe fn add_pending(f: *mut Rav1dFrameContext, t: *mut Rav1dTask) {
(*(*f).task_thread.pending_tasks.tail).next = t;
}
(*f).task_thread.pending_tasks.tail = t;
::core::intrinsics::atomic_store_seqcst(&mut (*f).task_thread.pending_tasks.merge, 1 as c_int);
(*f).task_thread
.pending_tasks_merge
.store(1, Ordering::SeqCst);
pthread_mutex_unlock(&mut (*f).task_thread.pending_tasks.lock);
}

#[inline]
unsafe fn merge_pending_frame(f: *mut Rav1dFrameContext) -> c_int {
let merge = ::core::intrinsics::atomic_load_seqcst(&mut (*f).task_thread.pending_tasks.merge);
let merge = (*f).task_thread.pending_tasks_merge.load(Ordering::SeqCst);
if merge != 0 {
pthread_mutex_lock(&mut (*f).task_thread.pending_tasks.lock);
let mut t: *mut Rav1dTask = (*f).task_thread.pending_tasks.head;
(*f).task_thread.pending_tasks.head = 0 as *mut Rav1dTask;
(*f).task_thread.pending_tasks.tail = 0 as *mut Rav1dTask;
::core::intrinsics::atomic_store_seqcst(
&mut (*f).task_thread.pending_tasks.merge,
0 as c_int,
);
(*f).task_thread
.pending_tasks_merge
.store(0, Ordering::SeqCst);
pthread_mutex_unlock(&mut (*f).task_thread.pending_tasks.lock);
while !t.is_null() {
let tmp: *mut Rav1dTask = (*t).next;
Expand Down Expand Up @@ -490,7 +491,9 @@ pub(crate) unsafe fn rav1d_task_create_tile_sbrow(
(*(*f).task_thread.pending_tasks.tail).next = &mut *tasks.offset(0) as *mut Rav1dTask;
}
(*f).task_thread.pending_tasks.tail = prev_t;
::core::intrinsics::atomic_store_seqcst(&mut (*f).task_thread.pending_tasks.merge, 1 as c_int);
(*f).task_thread
.pending_tasks_merge
.store(1, Ordering::SeqCst);
(*f).task_thread.init_done.store(1, Ordering::SeqCst);
pthread_mutex_unlock(&mut (*f).task_thread.pending_tasks.lock);
Ok(())
Expand Down

0 comments on commit 8cdae04

Please sign in to comment.