18 #define leftlink left_ 19 #define rightlink right_ 20 #define uplink parent_ 26 #define nt_dt nrn_threads->_dt 47 for (i=0; i < level; ++
i) {
68 #if COLLECT_TQueue_STATISTICS 69 nmove = ninsert = nrem = nleast = nbal = ncmplxrem = 0;
70 nfastmove = ncompare = nleastsrch = nfind = nfindsrch = 0;
76 while((q =
spdeq(&sptree_->root)) !=
nil) {
80 for (q = binq_->first();
q; q = q2) {
100 for (
TQItem*
q = binq_->first();
q;
q = binq_->next(
q)) {
113 spscan(f, static_cast<TQItem*>(
nil), sptree_);
114 for (
TQItem*
q = binq_->first();
q;
q = binq_->next(
q)) {
126 TQItem* TQueue::second_least(
double t) {
129 if (b && b->
t_ == t) {
138 move_least_nolock(tnew);
149 least_ =
spdeq(&sptree_->root);
160 move_least_nolock(tnew);
161 }
else if (tnew < least_->
t_) {
164 spenq(least_, sptree_);
175 #if COLLECT_TQueue_STATISTICS 176 Printf(
"insertions=%lu moves=%lu removals=%lu calls to least=%lu\n",
177 ninsert, nmove, nrem, nleast);
178 Printf(
"calls to find=%lu\n",
180 Printf(
"comparisons=%d\n",
183 Printf(
"Turn on COLLECT_TQueue_STATISTICS_ in tqueue.h\n");
188 #if COLLECT_TQueue_STATISTICS 199 TQItem* i = tpool_->alloc();
203 if (
t < least_t_nolock()) {
218 TQItem* i = tpool_->alloc();
221 binq_->enqueue(td, i);
237 least_ =
spdeq(&sptree_->root);
241 }
else if (q->
cnt_ >= 0) {
254 if (least_ && least_->t_ <= tt) {
258 least_ =
spdeq(&sptree_->root);
272 if (t == least_t_nolock()) {
283 bins_ =
new TQItem*[nbin_];
284 for (
int i=0; i < nbin_; ++
i) { bins_[
i] = 0; }
287 #if COLLECT_TQueue_STATISTICS 288 nfenq = nfdeq = nfrem = 0;
293 for (
int i=0; i < nbin_; ++
i) {
305 for (i=nbin_; i < size; ++
i) { bins[
i] = 0; }
306 for (i=0, j=qpt_; i < nbin_; ++
i, ++
j) {
307 if (j >= nbin_) { j = 0; }
309 for (q = bins[i];
q; q = q->
left_) {
319 int idt = (
int)((td - tt_)/
nt_dt + 1.e-10);
322 (*nrn_binq_enqueue_error_handler)(td,
q);
333 if (idt >= nbin_) { idt -= nbin_; }
337 q->
left_ = bins_[idt];
339 #if COLLECT_TQueue_STATISTICS 346 bins_[qpt_] = q->
left_;
347 #if COLLECT_TQueue_STATISTICS 356 for (
int i = 0; i < nbin_; ++
i) {
359 int j = (qpt_ +
i)%nbin_;
370 for (
int i = (q->
cnt_ + 1)%nbin_; i != qpt_; i = (i + 1)%nbin_) {
385 for (q2 = q1->
left_; q2; q1 = q2, q2 = q2->
left_) {
SPBLK * spdeq(SPBLK **np)
void spdelete(SPBLK *n, SPTREE< SPBLK > *q)
void enqueue(double tt, TQItem *)
SPBLK * sphead(SPTREE< SPBLK > *q)
TQItem * enqueue_bin(double t, void *data)
static void chk(TQItem *b, int level)
void spinit(SPTREE< SPBLK > *q)
void forall_callback(void(*)(const TQItem *, int))
TQItem * atomic_dq(double til)
TQItem * first()
Iterate in ascending bin order starting at current bin.
void spike_stat(double *)
void hoc_execerror(const char *, const char *)
TQItem * insert(double t, void *data_)
static void deleteitem(TQItem *i)
static double resize(void *v)
static void prnt(const TQItem *b, int level)
#define MUTCONSTRUCT(mkmut)
SPBLK * splookup(double key, SPTREE< SPBLK > *q)
void move_least(double tnew)
void spscan(void(*f)(const SPBLK *, int), SPBLK *n, SPTREE< SPBLK > *q)
void deleteitem(TQItem *)
static const char * errmess_
void move_least_nolock(double tnew)
static double least(void *v)
SPBLK * spenq(SPBLK *n, SPTREE< SPBLK > *q)
void check(const char *errmess)
void move(TQItem *, double tnew)
void(* nrn_binq_enqueue_error_handler)(double, TQItem *)