JPL Spatial
Sound spatialization and propagation library
Loading...
Searching...
No Matches
JPL::RealtimeObject< T, Options > Class Template Reference

#include <JPLSpatial/Utilities/RealtimeObject.h>

Classes

class  ScopedAccess
 

Public Types

using allocator_type = std::pmr::polymorphic_allocator<>
 
using RealtimeAcquireReturnType = std::conditional_t< Options==RealtimeObjectOptions::nonRealtimeMutatable, const T, T >
 
using NonRealtimeAcquireReturnType = std::conditional_t< Options==RealtimeObjectOptions::realtimeMutatable, const T, T >
 

Public Member Functions

 RealtimeObject ()=default
 
 RealtimeObject (const T &obj, const allocator_type &allocator={})
 
 RealtimeObject (T &&obj, const allocator_type &allocator={})
 
 ~RealtimeObject ()=default
 
RealtimeAcquireReturnTyperealtimeAcquire () noexcept
 
void realtimeRelease () noexcept
 
template<typename... Args>
requires (Options == RealtimeObjectOptions::realtimeMutatable)
void realtimeReplace (Args &&... args) noexcept
 
NonRealtimeAcquireReturnTypenonRealtimeAcquire ()
 
void nonRealtimeRelease ()
 
template<typename... Args>
requires (Options == RealtimeObjectOptions::nonRealtimeMutatable)
void nonRealtimeReplace (Args &&... args)
 

Detailed Description

template<typename T, RealtimeObjectOptions Options>
class JPL::RealtimeObject< T, Options >

Useful class to synchronise access to an object from multiple threads with the additional feature that one designated thread will never wait to get access to the object.

Essentially Faiban Renn's RealtimeObject (https://github.com/hogliux/farbot), with some modifications:

  • memory is managed by polymorphic allocator instead of std::unique_ptr
  • asumed only one non-realtime thread will access the object

Member Typedef Documentation

◆ allocator_type

template<typename T , RealtimeObjectOptions Options>
using JPL::RealtimeObject< T, Options >::allocator_type = std::pmr::polymorphic_allocator<>

◆ NonRealtimeAcquireReturnType

template<typename T , RealtimeObjectOptions Options>
using JPL::RealtimeObject< T, Options >::NonRealtimeAcquireReturnType = std::conditional_t<Options == RealtimeObjectOptions::realtimeMutatable, const T, T>

◆ RealtimeAcquireReturnType

template<typename T , RealtimeObjectOptions Options>
using JPL::RealtimeObject< T, Options >::RealtimeAcquireReturnType = std::conditional_t<Options == RealtimeObjectOptions::nonRealtimeMutatable, const T, T>

Constructor & Destructor Documentation

◆ RealtimeObject() [1/3]

template<typename T , RealtimeObjectOptions Options>
JPL::RealtimeObject< T, Options >::RealtimeObject ( )
default

Creates a default constructed T

◆ RealtimeObject() [2/3]

template<typename T , RealtimeObjectOptions Options>
JPL::RealtimeObject< T, Options >::RealtimeObject ( const T &  obj,
const allocator_type allocator = {} 
)
inlineexplicit

Creates a copy of T

◆ RealtimeObject() [3/3]

template<typename T , RealtimeObjectOptions Options>
JPL::RealtimeObject< T, Options >::RealtimeObject ( T &&  obj,
const allocator_type allocator = {} 
)
inlineexplicit

Moves T into this realtime wrapper

◆ ~RealtimeObject()

template<typename T , RealtimeObjectOptions Options>
JPL::RealtimeObject< T, Options >::~RealtimeObject ( )
default

Member Function Documentation

◆ nonRealtimeAcquire()

template<typename T , RealtimeObjectOptions Options>
NonRealtimeAcquireReturnType & JPL::RealtimeObject< T, Options >::nonRealtimeAcquire ( )
inline

Returns a reference to T. Use this method on the non real-time thread. It must be matched by nonRealtimeRelease when you are finished using the object. Alternatively, use the ScopedAccess helper class below.

Multiple non-realtime threads can acquire an object at the same time.

This method uses a lock should not be used on a realtime thread.

◆ nonRealtimeRelease()

template<typename T , RealtimeObjectOptions Options>
void JPL::RealtimeObject< T, Options >::nonRealtimeRelease ( )
inline

Releases the lock on T previously acquired by nonRealtimeAcquire.

This method uses both a lock and a spin loop and should not be used on a realtime thread.

◆ nonRealtimeReplace()

template<typename T , RealtimeObjectOptions Options>
template<typename... Args>
requires (Options == RealtimeObjectOptions::nonRealtimeMutatable)
void JPL::RealtimeObject< T, Options >::nonRealtimeReplace ( Args &&...  args)
inline

Replace the underlying value with a new instance of T by forwarding the method's arguments to T's constructor

◆ realtimeAcquire()

template<typename T , RealtimeObjectOptions Options>
RealtimeAcquireReturnType & JPL::RealtimeObject< T, Options >::realtimeAcquire ( )
inlinenoexcept

Returns a reference to T. Use this method on the real-time thread. It must be matched by realtimeRelease when you are finished using the object. Alternatively, use the ScopedAccess helper class below.

Only a single real-time thread can acquire this object at once!

This method is wait- and lock-free.

◆ realtimeRelease()

template<typename T , RealtimeObjectOptions Options>
void JPL::RealtimeObject< T, Options >::realtimeRelease ( )
inlinenoexcept

Releases the lock on T previously acquired by realtimeAcquire.

This method is wait- and lock-free.

◆ realtimeReplace()

template<typename T , RealtimeObjectOptions Options>
template<typename... Args>
requires (Options == RealtimeObjectOptions::realtimeMutatable)
void JPL::RealtimeObject< T, Options >::realtimeReplace ( Args &&...  args)
inlinenoexcept

Replace the underlying value with a new instance of T by forwarding the method's arguments to T's constructor


The documentation for this class was generated from the following file: