OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [socsim_plugin/] [ringbuf.h] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sergeykhbr
/**
2
 * @file
3
 * @copyright  Copyright 2016 GNSS Sensor Ltd. All right reserved.
4
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
5
 * @brief      Ringbuffer implementation.
6
 */
7
 
8
#ifndef __DEBUGGER_RINGBUF_H__
9
#define __DEBUGGER_RINGBUF_H__
10
 
11
#include <inttypes.h>
12
#include <string>
13
 
14
namespace debugger {
15
 
16
class RingBufferType {
17
public:
18
    explicit RingBufferType(int sz) {
19
        size_ = sz + 1;
20
        rdpos_ = buf_ = new uint8_t[2 * size_];
21
        wrpos_ = rdpos_ + 1;
22
    }
23
    ~RingBufferType() {
24
        delete buf_;
25
    }
26
 
27
    uint8_t *put(uint8_t *buf, int sz) {
28
        uint8_t *ret = wrpos_;
29
        if (&buf_[size_] >= wrpos_ + sz) {
30
            memcpy(wrpos_, buf, sz);
31
            memcpy(wrpos_ + size_, buf, sz);
32
            wrpos_ += sz;
33
        } else {
34
            int part = static_cast<int>(&buf_[size_] - wrpos_);
35
            memcpy(wrpos_, buf, part);
36
            memcpy(wrpos_ + size_, buf, part);
37
            int part2 = sz - part;
38
            memcpy(buf_, &buf[part], part2);
39
            memcpy(buf_+ size_, &buf[part], part2);
40
            wrpos_ += (sz - size_);
41
        }
42
        return ret;
43
    }
44
 
45
    int get(uint8_t *obuf, int sz) {
46
        int ret = sz;
47
        if (ret > size()) {
48
            ret = size();
49
        }
50
        /// do not modificate rdpos_ pointer before data reading complete.
51
        if (rdpos_ == &buf_[size_ - 1]) {
52
            memcpy(obuf, buf_, ret);
53
        } else {
54
            memcpy(obuf, rdpos_ + 1, ret);
55
        }
56
        rdpos_ += sz;
57
        if (rdpos_ >= &buf_[size_]) {
58
            rdpos_ -= size_;
59
        }
60
        return ret;
61
    }
62
 
63
    int size() {
64
        int t1 = static_cast<int>(wrpos_ - rdpos_) - 1;
65
        if (t1 < 0) {
66
            t1 += size_;
67
        }
68
        return t1;
69
    }
70
 
71
private:
72
    uint8_t *buf_;
73
    uint8_t *wrpos_;
74
    uint8_t *rdpos_;
75
    int size_;
76
};
77
 
78
}  // namespace debugger
79
 
80
#endif  // __DEBUGGER_RINGBUF_H__

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.