patch some bug fix:part 2
This commit is contained in:
52
deps/oblib/src/lib/lock/ob_scond.h
vendored
52
deps/oblib/src/lib/lock/ob_scond.h
vendored
@ -137,22 +137,21 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
struct SCond {
|
||||
template <int PRIO>
|
||||
struct SCondTemp {
|
||||
public:
|
||||
typedef SimpleCond CondPerCpu;
|
||||
typedef SCondReadyFlag Lock;
|
||||
typedef SCondCounter Counter;
|
||||
typedef SCondSimpleIdGen IdGen;
|
||||
enum { CPU_COUNT = OB_MAX_CPU_NUM, COND_COUNT = CPU_COUNT, LOOP_LIMIT = 8 };
|
||||
SCond()
|
||||
{}
|
||||
~SCond()
|
||||
{}
|
||||
void signal(uint32_t x = 1)
|
||||
void signal(uint32_t x = 1, int prio=0)
|
||||
{
|
||||
uint32_t v = conds_[id_gen_.get() % COND_COUNT].signal(x);
|
||||
if (v < x) {
|
||||
n2wakeup_.add(x - v);
|
||||
for (int p = PRIO-1; p >= prio && x > 0; p--) {
|
||||
x -= conds_[id_gen_.get() % COND_COUNT][p].signal(x);
|
||||
}
|
||||
if (x > 0) {
|
||||
n2wakeup_.add(x);
|
||||
lock_.set_ready();
|
||||
int64_t loop_cnt = 0;
|
||||
while (loop_cnt++ < LOOP_LIMIT && lock_.lock()) {
|
||||
@ -164,11 +163,12 @@ public:
|
||||
}
|
||||
}
|
||||
}
|
||||
void prepare()
|
||||
void prepare(int prio=0)
|
||||
{
|
||||
uint32_t id = 0;
|
||||
uint32_t key = get_key(id);
|
||||
get_wait_key() = ((uint64_t)id << 32) + key;
|
||||
uint32_t key = get_key(prio, id);
|
||||
id += (prio << 16);
|
||||
get_wait_key() = ((uint64_t)id<<32) + key;
|
||||
}
|
||||
void wait(int64_t timeout)
|
||||
{
|
||||
@ -177,15 +177,14 @@ public:
|
||||
}
|
||||
|
||||
protected:
|
||||
uint32_t get_key(uint32_t& id)
|
||||
{
|
||||
return conds_[id = (id_gen_.next() % COND_COUNT)].get_key();
|
||||
uint32_t get_key(int prio, uint32_t& id)
|
||||
{
|
||||
return conds_[id = (id_gen_.next() % COND_COUNT)][prio].get_key();
|
||||
}
|
||||
void wait(uint32_t id, uint32_t key, int64_t timeout)
|
||||
{
|
||||
conds_[id % COND_COUNT].wait(key, timeout);
|
||||
conds_[((uint16_t)id) % COND_COUNT][id >> 16].wait(key, timeout);
|
||||
}
|
||||
|
||||
private:
|
||||
static uint64_t& get_wait_key()
|
||||
{
|
||||
@ -194,20 +193,27 @@ private:
|
||||
}
|
||||
void do_wakeup()
|
||||
{
|
||||
uint32_t n2wakeup = n2wakeup_.fetch();
|
||||
for (int i = 0; n2wakeup > 0 && i < COND_COUNT; i++) {
|
||||
n2wakeup -= conds_[i].signal(n2wakeup);
|
||||
uint32_t n2wakeup = 0;
|
||||
//for (int p = PRIO - 1; p >= 0; p--) {
|
||||
n2wakeup = n2wakeup_.fetch();
|
||||
// }
|
||||
for (int p = PRIO - 1; n2wakeup > 0 && p >= 0; p--) {
|
||||
for(int i = 0; n2wakeup > 0 && i < COND_COUNT; i++) {
|
||||
n2wakeup -= conds_[i][p].signal(n2wakeup);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
Lock lock_ CACHE_ALIGNED;
|
||||
CondPerCpu conds_[COND_COUNT];
|
||||
CondPerCpu conds_[COND_COUNT][PRIO];
|
||||
Counter n2wakeup_;
|
||||
IdGen id_gen_;
|
||||
};
|
||||
|
||||
}; // end namespace common
|
||||
}; // end namespace oceanbase
|
||||
using SCond = SCondTemp<1>;
|
||||
|
||||
}; // end namespace common
|
||||
}; // end namespace oceanbase
|
||||
|
||||
#endif /* OCEANBASE_LOCK_OB_SCOND_H_ */
|
||||
|
||||
74
deps/oblib/src/lib/queue/ob_priority_queue.h
vendored
74
deps/oblib/src/lib/queue/ob_priority_queue.h
vendored
@ -107,10 +107,10 @@ private:
|
||||
DISALLOW_COPY_AND_ASSIGN(ObPriorityQueue);
|
||||
};
|
||||
|
||||
template <int HIGH_PRIOS, int LOW_PRIOS>
|
||||
template <int HIGH_HIGH_PRIOS, int HIGH_PRIOS=0, int LOW_PRIOS=0>
|
||||
class ObPriorityQueue2 {
|
||||
public:
|
||||
enum { PRIO_CNT = HIGH_PRIOS + LOW_PRIOS };
|
||||
enum { PRIO_CNT = HIGH_HIGH_PRIOS + HIGH_PRIOS + LOW_PRIOS };
|
||||
|
||||
ObPriorityQueue2() : queue_(), size_(0), limit_(INT64_MAX)
|
||||
{}
|
||||
@ -150,10 +150,13 @@ public:
|
||||
} else if (OB_FAIL(queue_[priority].push(data))) {
|
||||
// do nothing
|
||||
} else {
|
||||
cond_.signal();
|
||||
// if (priority < HIGH_PRIOS) {
|
||||
// high_cond_.signal();
|
||||
// }
|
||||
if (priority < HIGH_HIGH_PRIOS) {
|
||||
cond_.signal(1, 0);
|
||||
} else if (priority < HIGH_PRIOS + HIGH_HIGH_PRIOS) {
|
||||
cond_.signal(1, 1);
|
||||
} else {
|
||||
cond_.signal(1, 2);
|
||||
}
|
||||
}
|
||||
|
||||
if (OB_FAIL(ret)) {
|
||||
@ -162,29 +165,6 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline int do_pop(ObLink*& data, int64_t plimit, int64_t timeout_us)
|
||||
{
|
||||
int ret = OB_ENTRY_NOT_EXIST;
|
||||
if (OB_UNLIKELY(timeout_us < 0)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
COMMON_LOG(ERROR, "timeout is invalid", K(ret), K(timeout_us));
|
||||
} else {
|
||||
cond_.prepare();
|
||||
for (int i = 0; OB_ENTRY_NOT_EXIST == ret && i < plimit; i++) {
|
||||
if (OB_SUCCESS == queue_[i].pop(data)) {
|
||||
ret = OB_SUCCESS;
|
||||
}
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
cond_.wait(timeout_us);
|
||||
data = NULL;
|
||||
} else {
|
||||
(void)ATOMIC_FAA(&size_, -1);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int pop(ObLink*& data, int64_t timeout_us)
|
||||
{
|
||||
return do_pop(data, PRIO_CNT, timeout_us);
|
||||
@ -195,8 +175,42 @@ public:
|
||||
return do_pop(data, HIGH_PRIOS, timeout_us);
|
||||
}
|
||||
|
||||
int pop_high_high(ObLink*& data, int64_t timeout_us)
|
||||
{
|
||||
return do_pop(data, HIGH_HIGH_PRIOS, timeout_us);
|
||||
}
|
||||
|
||||
private:
|
||||
SCond cond_;
|
||||
inline int do_pop(ObLink*& data, int64_t plimit, int64_t timeout_us)
|
||||
{
|
||||
int ret = OB_ENTRY_NOT_EXIST;
|
||||
if (OB_UNLIKELY(timeout_us < 0)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
COMMON_LOG(ERROR, "timeout is invalid", K(ret), K(timeout_us));
|
||||
} else {
|
||||
if (plimit <= HIGH_HIGH_PRIOS) {
|
||||
cond_.prepare(0);
|
||||
} else if (plimit <= HIGH_PRIOS + HIGH_HIGH_PRIOS) {
|
||||
cond_.prepare(1);
|
||||
} else {
|
||||
cond_.prepare(2);
|
||||
}
|
||||
for (int i = 0; OB_ENTRY_NOT_EXIST == ret && i < plimit; i++) {
|
||||
if (OB_SUCCESS == queue_[i].pop(data)) {
|
||||
ret = OB_SUCCESS;
|
||||
}
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
cond_.wait(timeout_us);
|
||||
data = NULL;
|
||||
} else {
|
||||
(void)ATOMIC_FAA(&size_, -1);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
SCondTemp<3> cond_;
|
||||
ObLinkQueue queue_[PRIO_CNT];
|
||||
int64_t size_ CACHE_ALIGNED;
|
||||
int64_t limit_ CACHE_ALIGNED;
|
||||
|
||||
Reference in New Issue
Block a user