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

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [common/] [async_tqueue.cpp] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 sergeykhbr
/*
2
 *  Copyright 2018 Sergey Khabarov, sergeykhbr@gmail.com
3
 *
4
 *  Licensed under the Apache License, Version 2.0 (the "License");
5
 *  you may not use this file except in compliance with the License.
6
 *  You may obtain a copy of the License at
7
 *
8
 *      http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 *  Unless required by applicable law or agreed to in writing, software
11
 *  distributed under the License is distributed on an "AS IS" BASIS,
12
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 *  See the License for the specific language governing permissions and
14
 *  limitations under the License.
15 3 sergeykhbr
 */
16
 
17 4 sergeykhbr
#include <api_utils.h>
18
#include <async_tqueue.h>
19 3 sergeykhbr
 
20
namespace debugger {
21
 
22
AsyncTQueueType::AsyncTQueueType() {
23
    stepPreQueued_.make_list(0);
24
    stepQueue_.make_list(16);   /** it will be auto reallocated if needed */
25
    RISCV_mutex_init(&mutex_);
26 4 sergeykhbr
    hardReset();
27 3 sergeykhbr
}
28
 
29
AsyncTQueueType::~AsyncTQueueType() {
30
    RISCV_mutex_destroy(&mutex_);
31
}
32
 
33 4 sergeykhbr
void AsyncTQueueType::hardReset() {
34
    preLen_ = 0;
35
    curLen_ = 0;
36
    curIdx_ = 0;
37
}
38
 
39
void AsyncTQueueType::put(AttributeType *item) {
40 3 sergeykhbr
    if (preLen_ == stepPreQueued_.size()) {
41
        unsigned new_sz = 2 * stepPreQueued_.size();
42
        if (new_sz == 0) {
43
            new_sz = 1;
44
        }
45
        stepPreQueued_.realloc_list(new_sz);
46
    }
47
    stepPreQueued_[preLen_].attr_free();
48 4 sergeykhbr
    stepPreQueued_[preLen_] = *item;
49 3 sergeykhbr
    preLen_++;
50
}
51 4 sergeykhbr
 
52 3 sergeykhbr
void AsyncTQueueType::pushPreQueued() {
53
    if (preLen_ == 0) {
54
        return;
55
    }
56
    RISCV_mutex_lock(&mutex_);
57
    for (unsigned i = 0; i < preLen_; i++) {
58
        if (curLen_ < stepQueue_.size()) {
59
            stepQueue_[curLen_].attr_free();
60
            stepQueue_[curLen_] = stepPreQueued_[i];
61
        } else {
62
            stepQueue_.add_to_list(&stepPreQueued_[i]);
63
        }
64
        curLen_++;
65
    }
66 4 sergeykhbr
    preLen_ = 0;
67 3 sergeykhbr
    RISCV_mutex_unlock(&mutex_);
68
}
69
 
70
void AsyncTQueueType::initProc() {
71
    curIdx_ = 0;
72
}
73
 
74 4 sergeykhbr
/** Clock queue */
75
ClockAsyncTQueueType::ClockAsyncTQueueType() : AsyncTQueueType() {
76
    item_.make_list(Queue_Total);
77
}
78
 
79
void ClockAsyncTQueueType::put(uint64_t time, IFace *cb) {
80
    RISCV_mutex_lock(&mutex_);
81
    item_[Queue_Time].make_uint64(time);
82
    item_[Queue_IFace].make_iface(cb);
83
 
84
    AsyncTQueueType::put(&item_);
85
    RISCV_mutex_unlock(&mutex_);
86
}
87
 
88
IFace *ClockAsyncTQueueType::getNext(uint64_t step_cnt) {
89 3 sergeykhbr
    IFace *ret = 0;
90
    if (curIdx_ >= curLen_) {
91
        return ret;
92
    }
93
    for (unsigned i = curIdx_; i < curLen_; i++) {
94
        uint64_t ev_time = stepQueue_[i][Queue_Time].to_uint64();
95
 
96 4 sergeykhbr
        curIdx_ = i;
97 3 sergeykhbr
        if (step_cnt < ev_time) {
98
            continue;
99
        }
100
        ret = stepQueue_[i][Queue_IFace].to_iface();
101
 
102
        // remove item from list using swap function to avoid usage
103
        // of allocation/deallocation calls.
104 4 sergeykhbr
        if (i < (curLen_ - 1)) {
105
            stepQueue_.swap_list_item(i, curLen_ - 1);
106
        }
107 3 sergeykhbr
        curLen_--;
108
        break;
109
    }
110
    return ret;
111
}
112
 
113 4 sergeykhbr
 
114
/** GUI queue */
115
GuiAsyncTQueueType::GuiAsyncTQueueType() : AsyncTQueueType() {
116
    item_.make_list(Queue_Total);
117
    dbg_cnt_ = 0;
118
}
119
 
120
void GuiAsyncTQueueType::put(IFace *src, AttributeType *cmd, bool silent) {
121
    RISCV_mutex_lock(&mutex_);
122
    item_[Queue_Source].make_iface(src);
123
    item_[Queue_Command] = *cmd;
124
    item_[Queue_Silent].make_boolean(silent);
125
 
126
    AsyncTQueueType::put(&item_);
127
    dbg_cnt_++;
128
    RISCV_mutex_unlock(&mutex_);
129
}
130
 
131
bool GuiAsyncTQueueType::getNext(IFace **src, AttributeType &cmd,
132
                                 bool &silent) {
133
    *src = 0;
134
    if (curIdx_ >= curLen_) {
135
        curIdx_ = 0;
136
        curLen_ = 0;
137
        return false;
138
    }
139
    AttributeType &item = stepQueue_[curIdx_++];
140
    dbg_cnt_--;
141
 
142
    *src = item[Queue_Source].to_iface();
143
    cmd = item[Queue_Command];
144
    silent = item[Queue_Silent].to_bool();
145
    return true;
146
}
147
 
148
void GuiAsyncTQueueType::remove(IFace *src) {
149
    RISCV_mutex_lock(&mutex_);
150
    for (unsigned i = 0; i < preLen_; i++) {
151
        AttributeType &item = stepPreQueued_[i];
152
        if (item[Queue_Source].to_iface() == src) {
153
            item[Queue_Source].make_iface(0);
154
        }
155
    }
156
    for (unsigned i = 0; i < curLen_; i++) {
157
        AttributeType &item = stepQueue_[i];
158
        if (item[Queue_Source].to_iface() == src) {
159
            item[Queue_Source].make_iface(0);
160
        }
161
    }
162
    RISCV_mutex_unlock(&mutex_);
163
}
164
 
165 3 sergeykhbr
}  // namespace debugger
166
 

powered by: WebSVN 2.1.0

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