1
0
mirror of https://github.com/wolfpld/tracy synced 2025-05-03 22:13:51 +00:00

Explain why there are two methods for filling serial queue.

This commit is contained in:
Bartosz Taudul 2019-08-12 13:19:10 +02:00
parent 7fbf2fa2ec
commit 760357d6ea

View File

@ -329,6 +329,8 @@ queue.commit_next();
lock.unlock(); lock.unlock();
\end{lstlisting} \end{lstlisting}
It is important to update the item count in the queue (\texttt{commit\_next()}) only after an item has been fully filled. Otherwise, for example if the \texttt{push\_next()} method is used instead of \texttt{prepare\_next()}, it is possible that a thread will be freezed mid-write during crash handling (see section~\ref{crashhandler}). Since the dequeue in crash handler doesn't lock the queue, as it may already be locked by a freezed thread and otherwise there are no threads left to compete for access, the non-ready items must not be marked as available.
\paragraph{FastVector class} \paragraph{FastVector class}
This custom vector class was designed to minimize the time spent holding a lock: adding items is performed only in-place and swapping two vectors is a matter of exchanging three pointers. The next item write position is always known and doesn't need to be calculated. This custom vector class was designed to minimize the time spent holding a lock: adding items is performed only in-place and swapping two vectors is a matter of exchanging three pointers. The next item write position is always known and doesn't need to be calculated.