NEURON
test_queueing.cpp
Go to the documentation of this file.
1 /*
2 # =============================================================================
3 # Copyright (c) 2016 - 2022 Blue Brain Project/EPFL
4 #
5 # See top-level LICENSE file for details.
6 # =============================================================================.
7 */
10 
11 #include <catch2/catch_test_macros.hpp>
12 
13 #include <cstdlib>
14 #include <vector>
15 #include <iostream>
16 
17 using namespace coreneuron;
18 // UNIT TESTS
19 TEST_CASE("priority_queue_nq_dq") {
21  const int num = 8;
22  int cnter = 0;
23  // enqueue 8 items with increasing time
24  for (int i = 0; i < num; ++i)
25  tq.insert(static_cast<double>(i), NULL);
26 
27  REQUIRE(tq.pq_que_.size() == (num - 1));
28 
29  // dequeue items with time <= 5.0. Should be 6 events: from 0. to 5.
30  TQItem* item = NULL;
31  while ((item = tq.atomic_dq(5.0)) != NULL) {
32  ++cnter;
33  delete item;
34  }
35  REQUIRE(cnter == 6);
36  REQUIRE(tq.pq_que_.size() == (num - 6 - 1));
37 
38  // dequeue the rest
39  while ((item = tq.atomic_dq(8.0)) != NULL) {
40  ++cnter;
41  delete item;
42  }
43 
44  REQUIRE(cnter == num);
45  REQUIRE(tq.pq_que_.empty());
46  REQUIRE(tq.least() == NULL);
47 }
48 
49 TEST_CASE("tqueue_ordered_test") {
51  const int num = 10;
52  int cnter = 0;
53  double time = double();
54 
55  // insert N items with time < N
56  for (int i = 0; i < num; ++i) {
57  time = static_cast<double>(rand() % num);
58  tq.insert(time, NULL);
59  }
60 
61  time = 0.0;
62  TQItem* item = NULL;
63  // dequeue all items and check that previous item time <= current item time
64  while ((item = tq.atomic_dq(10.0)) != NULL) {
65  REQUIRE(time <= item->t_);
66  ++cnter;
67  time = item->t_;
68  delete item;
69  }
70  REQUIRE(cnter == num);
71  REQUIRE(tq.pq_que_.empty());
72  REQUIRE(tq.least() == NULL);
73 }
74 
75 TEST_CASE("tqueue_move_nolock") {}
76 
77 TEST_CASE("tqueue_remove") {}
78 
79 TEST_CASE("threaddata_interthread_send") {
80  NetCvodeThreadData nt{};
81  const size_t num = 6;
82  for (size_t i = 0; i < num; ++i)
83  nt.interthread_send(static_cast<double>(i), NULL, NULL);
84 
85  REQUIRE(nt.inter_thread_events_.size() == num);
86 }
87 /*
88 TEST_CASE(threaddata_enqueue){
89  NetCvode n = NetCvode();
90  const int num = 6;
91  for(int i = 0; i < num; ++i)
92  n.p[1].interthread_send(static_cast<double>(i), NULL, NULL);
93 
94  REQUIRE(n.p[1].inter_thread_events_.size() == num);
95 
96  //enqueue the inter_thread_events_
97  n.p[1].enqueue(&n, &(n.p[1]));
98  REQUIRE(n.p[1].inter_thread_events_.empty());
99  REQUIRE(n.p[1].tqe_->pq_que_.size() == num);
100 
101  //cleanup priority queue
102  TQItem* item = NULL;
103  while((item = n.p[1].tqe_->atomic_dq(6.0)) != NULL)
104  delete item;
105 }*/
void interthread_send(double, DiscreteEvent *, NrnThread *)
If the PreSyn is on a different thread than the target, we have to lock the buffer.
Definition: netcvode.cpp:133
std::priority_queue< TQPair, std::vector< TQPair >, less_time > pq_que_
Priority queue of vectors for queuing the events.
Definition: tqueue.hpp:151
TQItem * least()
Definition: tqueue.hpp:128
TQItem * atomic_dq(double til)
TQItem * insert(double t, DiscreteEvent *data)
#define i
Definition: md1redef.h:19
THIS FILE IS AUTO GENERATED DONT MODIFY IT.
#define NULL
Definition: spdefs.h:105
TEST_CASE("priority_queue_nq_dq")