All program locks are listed below. Also the order shown is also locking order. That is if you need to hold more than one lock, you may only grab them in the order shown. A lock is necessary to obtain for any access (read or write) of the rest of the structure, unless otherwise noted. Also, access to the lock itself does not require a lock beforehand. And condition variables (which are within the structure) also do not need a lock obtained beforehand. state_info.lock display_info.lock As above, and any call to ncurses (such as getch() or wgetyx() ). database_info.lock As above, note this is a read/write lock instead of a regular mutex. song_queue.lock past_queue.lock player_info.lock player_command.lock frame_buffer.lock spectrum_info.lock spectrum_ring.lock log_info.lock You do not need to use this lock. It is only used by the internal _squash_error() and _squash_log() functions. Use the squash_error() and squash_log() macros instead. status_info.lock You do not need to use this lock. It is only used by the main() and internal _squash_error() functions. Use the squash_error() macro instead.