Skip to content

Commit 001dc15

Browse files
committed
tortoise and hare
1 parent b7d2317 commit 001dc15

2 files changed

Lines changed: 12 additions & 13 deletions

File tree

loaders/common.hpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ template <class Item> class BackgroundProducer {
154154

155155
void background_thread() {
156156
t0_ = chrono::high_resolution_clock::now();
157+
long long p = 0;
157158
do {
158-
auto p = p_.load(memory_order_acquire);
159159
bool ok = false;
160160
try {
161161
ok = Produce(ring_[p % R_]);
@@ -167,14 +167,13 @@ template <class Item> class BackgroundProducer {
167167
stop_.store(true, memory_order_release);
168168
}
169169
if (ok) {
170-
++p;
171-
p_.store(p, memory_order_release);
170+
p_.store(++p, memory_order_release);
172171
if (p - max(c_.load(memory_order_acquire), 1LL) == R_ - 1) {
173172
auto t_spin = chrono::high_resolution_clock::now();
174173
do {
175-
// assumption -- producer will usually be faster than the consumer, and
176-
// ringsize_ provides buffer if that's occasionally not the case
177-
this_thread::sleep_for(chrono::milliseconds(1));
174+
// assumption -- producer is usually faster than the consumer, and ringsize
175+
// provides a buffer if that's occasionally not the case
176+
this_thread::sleep_for(chrono::nanoseconds(10000));
178177
} while (!stop_.load(memory_order_relaxed) &&
179178
(p - max(c_.load(memory_order_acquire), 1LL) == R_ - 1));
180179
p_blocked_ += chrono::high_resolution_clock::now() - t_spin;
@@ -204,7 +203,7 @@ template <class Item> class BackgroundProducer {
204203
}
205204
worker_.reset(new thread([this]() { this->background_thread(); }));
206205
}
207-
auto c = c_.load(memory_order_acquire), p = p_.load(memory_order_acquire);
206+
long long p = p_.load(memory_order_acquire), c = c_.load(memory_order_relaxed);
208207
if (c == p) {
209208
auto t_spin = chrono::high_resolution_clock::now();
210209
while (c == p && !stop_.load(memory_order_relaxed)) {

loaders/sam_into_sqlite.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,9 @@ map<string, int> import_readgroups(const string &table_prefix, sam_hdr_t *hdr, S
7676

7777
// Given tab-split SAM line, write JSON dict of read's tags (aux) into out; return rg_id or -1
7878
int write_tags_json(const map<string, int> &readgroups, const vector<char *> &sam_fields,
79-
OStringStream &out) {
79+
vector<char *> &tag, OStringStream &out) {
8080
out << '{';
8181
int rg_id = -1;
82-
vector<char *> tag;
8382
bool first = true;
8483
for (int c = 11; c < sam_fields.size(); ++c) {
8584
tag.clear();
@@ -139,6 +138,7 @@ class SamReader : public BackgroundProducer<SamItem> {
139138
bam_hdr_t *hdr_;
140139
const map<string, int> &readgroups_;
141140
OStringStream tagsbuf_;
141+
vector<char *> tagsparsebuf_;
142142

143143
bool Produce(SamItem &it) override {
144144
it.Clear();
@@ -158,9 +158,9 @@ class SamReader : public BackgroundProducer<SamItem> {
158158
throw runtime_error("Corrupt SAM record; fields.size() = " +
159159
to_string(it.fields.size()));
160160
}
161-
// formulate tags JSON on here on background thread
161+
// formulate tags JSON here on background thread
162162
tagsbuf_.Clear();
163-
it.rg_id = write_tags_json(readgroups_, it.fields, tagsbuf_);
163+
it.rg_id = write_tags_json(readgroups_, it.fields, tagsparsebuf_, tagsbuf_);
164164
it.tags_json = tagsbuf_.Get();
165165
return true;
166166
}
@@ -327,8 +327,8 @@ int main(int argc, char *argv[]) {
327327
"reads_tags(rowid,tags_json) VALUES(?,?)");
328328

329329
// stream bam1_t records
330-
progress &&cerr << "inserting reads...";
331-
SamReader reader(sam.get(), hdr.get(), readgroups, 64);
330+
progress &&cerr << "inserting reads..." << endl;
331+
SamReader reader(sam.get(), hdr.get(), readgroups, 256);
332332
while (reader.next()) {
333333
const SamItem &it = reader.item();
334334
bam1_t *rec = it.rec.get();

0 commit comments

Comments
 (0)