annotate foosdk/sdk/pfc/threadSafeObj.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 template<typename obj_t_, typename mutex_t_>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 struct threadSafeObjCommon {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 typedef mutex_t_ mutex_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 typedef obj_t_ obj_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 template<typename ... arg_t> threadSafeObjCommon( arg_t && ... arg ) : m_obj(std::forward<arg_t>(arg) ... ) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 mutex_t m_mutex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 obj_t m_obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 template<typename common_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 class threadSafeObjLock {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 typedef threadSafeObjLock<common_t> self_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 common_t & m_common;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 typename common_t::obj_t & operator*() { return m_common.m_obj; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 typename common_t::obj_t * operator->() { return & m_common.m_obj; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 threadSafeObjLock( common_t & arg ) : m_common(arg) { m_common.m_mutex.lock(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 ~threadSafeObjLock( ) { m_common.m_mutex.unlock(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 threadSafeObjLock( const self_t & ) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 void operator=( const self_t & ) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 template<typename obj_t, typename mutex_t = pfc::mutex>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 class threadSafeObj {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 typedef threadSafeObjCommon<obj_t, mutex_t> common_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 typedef threadSafeObjLock<common_t> lock_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 common_t m_common;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 template<typename ... arg_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 threadSafeObj( arg_t && ... arg ) : m_common( std::forward<arg_t>(arg) ... ) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 lock_t get() { return lock_t(m_common); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }