This commit is contained in:
aozhiwei 2019-12-16 21:15:04 +08:00
parent 7cfe69fdcd
commit ea394ad9a9
2 changed files with 63 additions and 20 deletions

View File

@ -1,33 +1,38 @@
package a6; package a6;
public class ListHead { public final class ListHead {
public ListHead next; public ListHead next;
public ListHead prev; public ListHead prev;
public Object data; public Object data;
public ListHead() { public ListHead() {
next = this; init();
prev = this;
} }
public void del() { public final void del() {
next.prev = prev;
prev.next = next;
init();
} }
public void delInit() { public final void delInit() {
del();
} }
public void addTail(ListHead newNode) { public final void addTail(ListHead pnew) {
ListHead tmp_prev = prev;
prev = pnew;
pnew.next = this;
pnew.prev = tmp_prev;
tmp_prev.next = pnew;
} }
public Object firstEntry() { public final Object firstEntry() {
return next.data; return next.data;
} }
public void replace(ListHead pnew) { public final void replace(ListHead pnew) {
pnew.next = next; pnew.next = next;
pnew.next.prev = pnew; pnew.next.prev = pnew;
pnew.prev = prev; pnew.prev = prev;
@ -35,17 +40,18 @@ public class ListHead {
pnew.data = data; pnew.data = data;
} }
public void replaceInit(ListHead pnew) { public final void replaceInit(ListHead pnew) {
replace(pnew); replace(pnew);
init(); init();
} }
public boolean empty() { public final boolean empty() {
return next == this; return next == this;
} }
public void init() { public final void init() {
next = this;
prev = this;
} }
} }

View File

@ -69,6 +69,7 @@ public class Timer {
private ListHead[] tv4 = new ListHead[TVN_SIZE]; private ListHead[] tv4 = new ListHead[TVN_SIZE];
private ListHead[] tv5 = new ListHead[TVN_SIZE]; private ListHead[] tv5 = new ListHead[TVN_SIZE];
private ListHead workList = new ListHead(); private ListHead workList = new ListHead();
private ListHead cascadeList = new ListHead();
public void init(IGetTickCountFunc func, Object content, int gc_time, int cache_timer_num) { public void init(IGetTickCountFunc func, Object content, int gc_time, int cache_timer_num) {
this.getTickCount = func; this.getTickCount = func;
@ -86,11 +87,11 @@ public class Timer {
int index = (int)(timerTick & TVR_MASK); int index = (int)(timerTick & TVR_MASK);
if (index == 0 && if (index == 0 &&
cascade(tv2, (int)((timerTick >> (TVR_BITS + 0 * TVN_BITS)) & TVN_MASK)) == 0 && cascade(tv2, getTimerIndex(index)) == 0 &&
cascade(tv3, (int)((timerTick >> (TVR_BITS + 1 * TVN_BITS)) & TVN_MASK)) == 0 && cascade(tv3, getTimerIndex(index)) == 0 &&
cascade(tv4, (int)((timerTick >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK)) == 0 cascade(tv4, getTimerIndex(index)) == 0
) { ) {
cascade(tv5, (int)((timerTick >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK)); cascade(tv5, getTimerIndex(index));
} }
++timerTick; ++timerTick;
@ -227,7 +228,43 @@ public class Timer {
} }
private int cascade(ListHead[] tv, int index) { private int cascade(ListHead[] tv, int index) {
return 0; tv[index].replaceInit(cascadeList);
while (!cascadeList.empty()) {
// internalAddTimer();
}
cascadeList.init();
return index;
}
private final int getTimerIndex(int index) {
return (int)((timerTick >> (TVR_BITS + index * TVN_BITS)) & TVN_MASK);
}
private final void internalAddTimer(TimerList timer) {
long expires = timer.expires;
long idx = expires - timerTick;
ListHead vec;
if (idx < 0) {
vec = tv1[(int)(timerTick & TVR_MASK)];
} else if (idx < TVR_SIZE) {
int i = (int)(expires & TVR_MASK);
vec = tv1[i];
} else if (idx < (1 << (TVR_BITS + TVN_BITS))) {
int i = (int)(expires >> TVR_BITS) & TVN_MASK;
vec = tv2[i];
} else if (idx < (1 << (TVR_BITS + 2 * TVN_BITS))) {
int i = (int)(expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
vec = tv3[i];
} else if (idx < (1 << (TVR_BITS + 3 * TVN_BITS))) {
int i = (int)(expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK;
vec = tv4[i];
} else {
int i = (int)(expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
vec = tv5[i];
}
vec.addTail(vec);
} }
} }