annotate foosdk/sdk/pfc/lockless.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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #ifdef _MSC_VER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <intrin.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 class threadSafeInt {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 typedef long val_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 typedef val_t t_val;
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 threadSafeInt(t_val p_val = 0) : m_val(p_val) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 long operator++() throw() { return inc(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 long operator--() throw() { return dec(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 long operator++(int) throw() { return inc() - 1; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 long operator--(int) throw() { return dec() + 1; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 operator t_val() const throw() { return m_val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 static val_t exchangeHere( volatile val_t & here, val_t newVal ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 #ifdef _MSC_VER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 return InterlockedExchange(&here, newVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 return __sync_lock_test_and_set(&here, newVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 #endif
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 t_val exchange(t_val newVal) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 return exchangeHere( m_val, newVal );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 t_val inc() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 #ifdef _MSC_VER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 return _InterlockedIncrement(&m_val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 return __sync_add_and_fetch(&m_val, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 #endif
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 t_val dec() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 #ifdef _MSC_VER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 return _InterlockedDecrement(&m_val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 return __sync_sub_and_fetch(&m_val, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 volatile t_val m_val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 typedef threadSafeInt counter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 typedef threadSafeInt refcounter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 void yield(); // forward declaration
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }