aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
blob: 252be57063dd90fd84f45138c591db88510a382e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230

Jau Support Library (C++, Java, ...)

Original document location.

Git Repository

This project's canonical repositories is hosted on Gothel Software.

Goals

This project aims to provide general C++ and Java collections, algorithms and utilities - as well as basic concepts to support a Java JNI binding.

This project was extracted from Direct-BT to enable general use and enforce better encapsulation.

API Documentation

Up to date API documentation can be found:

Examples

See Direct-BT C++ API Doc.

Supported Platforms

C++17 and better.

Building Binaries

It is advised to include this library into your main project, e.g. as a git-submodule.

Then add jaulib/include/ to your C++ include-path and also add the C++ source files under jaulib/src/ into your build recipe.

The produced Java libraries are fully functional.

This library's build recipe are functional though, but currently only intended to support unit testing and to produce a Doxygen API doc.

The project requires CMake 3.13+ for building and a Java JDK >= 11.

Installing build dependencies on Debian (10 or 11):

apt install git
apt install build-essential g++ gcc libc-dev libpthread-stubs0-dev 
apt install libunwind8 libunwind-dev
apt install openjdk-11-jdk openjdk-11-jre junit4
apt install cmake cmake-extras extra-cmake-modules
apt install doxygen graphviz

For a generic build use:

CPU_COUNT=`getconf _NPROCESSORS_ONLN`
git clone https://jausoft.com/cgit/jaulib.git
cd jaulib
mkdir build
cd build
cmake -DBUILDJAVA=ON -DBUILDEXAMPLES=ON -DBUILD_TESTING=ON ..
make -j $CPU_COUNT install test doc

The install target of the last command will create the include/ and lib/ directories with a copy of the headers and library objects respectively in your build location. Note that doing an out-of-source build may cause issues when rebuilding later on.

Our cmake configure has a number of options, cmake-gui or ccmake can show you all the options. The interesting ones are detailed below:

Changing install path from /usr/local to /usr

-DCMAKE_INSTALL_PREFIX=/usr

Building debug build:

-DDEBUG=ON

Disable stripping native lib even in non debug build:

-DUSE_STRIP=OFF

Override default javac debug arguments source,lines:

-DJAVAC_DEBUG_ARGS="source,lines,vars"

-DJAVAC_DEBUG_ARGS="none"

Building debug and instrumentation (sanitizer) build:

-DDEBUG=ON -DINSTRUMENTATION=ON

Using clang instead of gcc:

-DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++

Cross-compiling on a different system:

-DCMAKE_CXX_FLAGS:STRING=-m32 -march=i586
-DCMAKE_C_FLAGS:STRING=-m32 -march=i586

To build Java bindings:

-DBUILDJAVA=ON

To build documentation run:

make doc

Changes

1.0.0

  • First stable release (TODO)

0.7.8

  • Added jau::service_runner, a reusable dedicated thread performing custom user services.
  • Fix jau::ringbuffer (conditional variable lock)
  • Fix jau::latch (conditional variable lock) and test_latch01.cpp

0.7.3

  • Add to_string(const ordered_atomic<>&), allowing to skip manual '.load()' using jau::to_string() etc.
  • Add jau::latch
  • ringbuffer: Remove locking mutex before notify_all, avoid re-block of notified wait() threads.

0.7.2

  • Add helper_jni: checkAndGetObject(..)
  • Refine API doc and add build-doc.sh helper script etc

0.7.0

  • ringbuffer: Add notion of operating threading mode for more efficancy:
    • One producer-thread and one consumer-thread (default)
    • Multiple producer-threads and multiple consumer-threads See getMultiPCEnabled() and setMultiPCEnabled()
  • ringbuffer API change: Drop whole NullValue angle, simplifying.
    • Drop Value_type [get|peek]*(), use bool [get|peek]*(Value_type&) instead
    • Drop NullValue_type template type param and NullValue_type ctor argument.
    • Simplifies and unifies single and multi get and put, as well as testing (motivation).
    • Adding multi-threading tests w/ value checks in test_lfringbuffer_a.hpp for test_lfringbuffer[01-04]
  • ringbuffer: Drop use_memset non-type template param, simply use use_memcpy having same semantics of TriviallyCopyable.
  • darray: Refine API doc for use_memmove using TriviallyCopyable and Trivial destructor ...

0.6.1

  • TOctets: Add convenient memmove, memset and bzero methods; Ensure all memory ops are either std:: or global namespace ::

0.6.0

  • Bump minor version due to API change (darray, cow_darray and ringbuffer)
  • Add darray and cow_darray initializer list construction using move-semantics, instead of copy-semantics (std::initializer_list).
  • Fix cow_darray::push_back( InputIt first, InputIt last ): On storage growth path, push_back must happen on new storage.
  • Revised Non-Type Template Parameter (NTTP) of darray, cow_darray and ringbuffer
    • Dropped use_realloc, as it is fully deducted
    • Renamed sec_mem to use_secmem
    • Enable type traits in user Value_type to deduce use_memmove and use_secmem
    • Ringbuffer also uses darray's NTTP use_memmove and use_secmem
  • Ringbuffer uses placement-new for better efficacy (dropped C++ array default init)
  • Use explicit constexpr if: darray, ringbuffer, endian conversion [le|be|cpu]_to_[le|be|cpu]() and bit_cast().
  • POctet: Add explicit copy-ctor with given capacity and add TROOctets default ctor
  • EUI48[Sub] C++/Java and POctets: Better API doc re byte order

0.5.0

  • Bump minor version due to API change
  • EUI48Sub: Add required endian conversion for byte stream ctor (C++ and Java)
  • EUI48[Sub]: Add endian awareness, also fixes indexOf() semantics (C++ and Java)
  • Octets: Enhance API doc
  • Octets/ringbuffer: Use std method names for sizes
  • Octets: Expose endian awareness, pass either endian::little or endian::big at ctor
  • darray: Support immutable type, i.e. 'const Type'

0.4.7

  • Add uuid_t::equivalent(..) method fo relaxed comparison on different uuid_t types
  • Added uuid_t::getTypeSizeString()
  • Fix jau::get_backtrace(..) and adjusted ERR_PRINT and ABORT

0.4.3

  • Moved EUI48, EUI48Sub (C++/Java) and uuid_t, Octets (C++) from Direct-BT for general use.

0.4.1

  • ringbuffer: Added block access, fast-path for integral types, bool get*(Value_type& v), ..
  • ringbuffer: Special NullValue_type template type and value (ctor) handling
  • ringbuffer: Add 'Size_type waitForElements(..)' and fix 'Size_type waitForFreeSlots(..)'
  • ringbuffer: get() and getBlocking() takes size of dest buffer and minimum count to wait for, return received elements.
  • ringbuffer: syncWrite and syncRead member semantic cleanup,
  • Added uint64_t getWallClockSeconds()

0.3.0

  • Consolidate conversion to hex and decimal string: to_hexstring(Type) and to_decstring(Type), dropped <type>[Hex|Dec]String(..)
  • All get/set functions are exposed as overloaded templates [get|put]_value(..), so is to_hex_string(..).
  • All byte-order conversion and get/set functions are of 'constexpr' now.
  • Add constexpr 'enum class endian', 'pointer_cast()' and 'bit_cast()'.
  • Offering JaulibSetup.cmake for parent projects for aligned setup.
  • Java: Working JNI-Lib bootstraping w/ fat-jar. Passing all unit tests.
  • Java: Generating jar and source-zip packages (normal + fat); Enable full junit testing.
  • Finalized jau::cow_darray and its iterator API. All write API entries were added to the mutable iterator.
  • Introduce jau::callocator for jau::darray to support realloc instead of alloc, copy and dtor
  • Passed gcc-10, gcc-11, clang-9 and clang-11
  • Passed detailed cow_iterator test.
  • jau::cow_vector is marked deprecated, as only jau::cow_darray can give certain guarantees using jau::darray
  • jau::cow_vector is aligned to jau::cow_darray and also uses jau::cow_ro_iterator and jau::cow_rw_iterator
  • Added jau::darray and jau::cow_darray (using jau::cow_ro_iterator and jau::cow_rw_iterator)
  • Test: Using imported Catch2 (v3-devel) for C++ unit testing
  • Reduced ringbuffer to single implementation, adding move-operations
  • Added basic_types.hpp: 'to_decimal_string(..)' implementing DecString() inlines.
  • Use nsize_t and snsize_t where appropriate for smaller footprint
  • Have ringbuffer's Size_type parameterized
  • Bugfixes and added cow_array

0.2.1

  • Added cow_vector and sc_atomic_critical
  • Passed GCC all warnings, compile clean
  • Passed GCC sanitizer runtime checks
  • Passed valgrind's memcheck, helgrind and drd validating no memory leak nor data race or deadlock using dbt_scanner10
  • Added native de-mangled backtrace support using libunwind and and abi::__cxa_demangle

0.1.0

  • Extraction from Direct-BT