X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fsegment.hpp;h=f4601d0444c0a9bab0aa88dd9efe3e1996dde9e4;hp=f1ff0f527370a80bbf6137d3291ee53715e6698d;hb=HEAD;hpb=c70e34649be658e7a443d5e68abe16dd55d53bf2 diff --git a/pv/data/segment.hpp b/pv/data/segment.hpp index f1ff0f52..f4601d04 100644 --- a/pv/data/segment.hpp +++ b/pv/data/segment.hpp @@ -23,9 +23,17 @@ #include "pv/util.hpp" -#include +#include +#include #include -#include +#include +#include + +#include + +using std::atomic; +using std::recursive_mutex; +using std::deque; namespace SegmentTest { struct SmallSize8Single; @@ -36,8 +44,9 @@ struct MediumSize32Single; struct MaxSize32Single; struct MediumSize32Multi; struct MaxSize32Multi; +struct MaxSize32MultiAtOnce; struct MaxSize32MultiIterated; -} +} // namespace SegmentTest namespace pv { namespace data { @@ -45,16 +54,17 @@ namespace data { typedef struct { uint64_t sample_index, chunk_num, chunk_offs; uint8_t* chunk; - uint8_t* value; -} SegmentRawDataIterator; +} SegmentDataIterator; -class Segment +class Segment : public QObject { + Q_OBJECT + private: static const uint64_t MaxChunkSize; public: - Segment(uint64_t samplerate, unsigned int unit_size); + Segment(uint32_t segment_id, uint64_t samplerate, unsigned int unit_size); virtual ~Segment(); @@ -67,28 +77,41 @@ public: unsigned int unit_size() const; + uint32_t segment_id() const; + + void set_complete(); + bool is_complete() const; + void free_unused_memory(); +Q_SIGNALS: + void completed(); + protected: void append_single_sample(void *data); void append_samples(void *data, uint64_t samples); - uint8_t* get_raw_samples(uint64_t start, uint64_t count) const; - - SegmentRawDataIterator* begin_raw_sample_iteration(uint64_t start); - void continue_raw_sample_iteration(SegmentRawDataIterator* it, uint64_t increase); - void end_raw_sample_iteration(SegmentRawDataIterator* it); - - mutable std::recursive_mutex mutex_; - std::vector data_chunks_; + const uint8_t* get_raw_sample(uint64_t sample_num) const; + void get_raw_samples(uint64_t start, uint64_t count, uint8_t *dest) const; + + SegmentDataIterator* begin_sample_iteration(uint64_t start); + void continue_sample_iteration(SegmentDataIterator* it, uint64_t increase); + void end_sample_iteration(SegmentDataIterator* it); + uint8_t* get_iterator_value(SegmentDataIterator* it); + uint64_t get_iterator_valid_length(SegmentDataIterator* it); + + uint32_t segment_id_; + mutable recursive_mutex mutex_; + deque data_chunks_; uint8_t* current_chunk_; uint64_t used_samples_, unused_samples_; - uint64_t sample_count_; + atomic sample_count_; pv::util::Timestamp start_time_; double samplerate_; uint64_t chunk_size_; unsigned int unit_size_; int iterator_count_; bool mem_optimization_requested_; + bool is_complete_; friend struct SegmentTest::SmallSize8Single; friend struct SegmentTest::MediumSize8Single; @@ -98,10 +121,15 @@ protected: friend struct SegmentTest::MaxSize32Single; friend struct SegmentTest::MediumSize32Multi; friend struct SegmentTest::MaxSize32Multi; + friend struct SegmentTest::MaxSize32MultiAtOnce; friend struct SegmentTest::MaxSize32MultiIterated; }; } // namespace data } // namespace pv +typedef std::shared_ptr SharedPtrToSegment; + +Q_DECLARE_METATYPE(SharedPtrToSegment); + #endif // PULSEVIEW_PV_DATA_SEGMENT_HPP