Skip to content

Commit 0315888

Browse files
committed
[test] Remove priority from tests
Remove all coin age priority functionality from unit tests and RPC tests.
1 parent f838005 commit 0315888

File tree

8 files changed

+47
-108
lines changed

8 files changed

+47
-108
lines changed

qa/rpc-tests/prioritise_transaction.py

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,8 @@ def run_test(self):
5050
assert(sizes[i] > MAX_BLOCK_BASE_SIZE) # Fail => raise utxo_count
5151

5252
# add a fee delta to something in the cheapest bucket and make sure it gets mined
53-
# also check that a different entry in the cheapest bucket is NOT mined (lower
54-
# the priority to ensure its not mined due to priority)
53+
# also check that a different entry in the cheapest bucket is NOT mined
5554
self.nodes[0].prioritisetransaction(txids[0][0], 0, int(3*base_fee*COIN))
56-
self.nodes[0].prioritisetransaction(txids[0][1], -1e15, 0)
5755

5856
self.nodes[0].generate(1)
5957

@@ -96,45 +94,35 @@ def run_test(self):
9694
if (x != high_fee_tx):
9795
assert(x not in mempool)
9896

99-
# Create a free, low priority transaction. Should be rejected.
97+
# Create a free transaction. Should be rejected.
10098
utxo_list = self.nodes[0].listunspent()
10199
assert(len(utxo_list) > 0)
102100
utxo = utxo_list[0]
103101

104102
inputs = []
105103
outputs = {}
106104
inputs.append({"txid" : utxo["txid"], "vout" : utxo["vout"]})
107-
outputs[self.nodes[0].getnewaddress()] = utxo["amount"] - self.relayfee
105+
outputs[self.nodes[0].getnewaddress()] = utxo["amount"]
108106
raw_tx = self.nodes[0].createrawtransaction(inputs, outputs)
109107
tx_hex = self.nodes[0].signrawtransaction(raw_tx)["hex"]
110-
txid = self.nodes[0].sendrawtransaction(tx_hex)
111-
112-
# A tx that spends an in-mempool tx has 0 priority, so we can use it to
113-
# test the effect of using prioritise transaction for mempool acceptance
114-
inputs = []
115-
inputs.append({"txid": txid, "vout": 0})
116-
outputs = {}
117-
outputs[self.nodes[0].getnewaddress()] = utxo["amount"] - self.relayfee
118-
raw_tx2 = self.nodes[0].createrawtransaction(inputs, outputs)
119-
tx2_hex = self.nodes[0].signrawtransaction(raw_tx2)["hex"]
120-
tx2_id = self.nodes[0].decoderawtransaction(tx2_hex)["txid"]
108+
tx_id = self.nodes[0].decoderawtransaction(tx_hex)["txid"]
121109

122110
try:
123-
self.nodes[0].sendrawtransaction(tx2_hex)
111+
self.nodes[0].sendrawtransaction(tx_hex)
124112
except JSONRPCException as exp:
125113
assert_equal(exp.error['code'], -26) # insufficient fee
126-
assert(tx2_id not in self.nodes[0].getrawmempool())
114+
assert(tx_id not in self.nodes[0].getrawmempool())
127115
else:
128116
assert(False)
129117

130118
# This is a less than 1000-byte transaction, so just set the fee
131119
# to be the minimum for a 1000 byte transaction and check that it is
132120
# accepted.
133-
self.nodes[0].prioritisetransaction(tx2_id, 0, int(self.relayfee*COIN))
121+
self.nodes[0].prioritisetransaction(tx_id, 0, int(self.relayfee*COIN))
134122

135123
print("Assert that prioritised free transaction is accepted to mempool")
136-
assert_equal(self.nodes[0].sendrawtransaction(tx2_hex), tx2_id)
137-
assert(tx2_id in self.nodes[0].getrawmempool())
124+
assert_equal(self.nodes[0].sendrawtransaction(tx_hex), tx_id)
125+
assert(tx_id in self.nodes[0].getrawmempool())
138126

139127
if __name__ == '__main__':
140128
PrioritiseTransactionTest().main()

qa/rpc-tests/smartfees.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,11 @@ def small_txpuzzle_randfee(from_node, conflist, unconflist, amount, min_fee, fee
6969

7070
def split_inputs(from_node, txins, txouts, initial_split = False):
7171
"""
72-
We need to generate a lot of very small inputs so we can generate a ton of transactions
73-
and they will have low priority.
72+
We need to generate a lot of inputs so we can generate a ton of transactions.
7473
This function takes an input from txins, and creates and sends a transaction
7574
which splits the value into 2 outputs which are appended to txouts.
75+
Previously this was designed to be small inputs so they wouldn't have
76+
a high coin age when the notion of priority still existed.
7677
"""
7778
prevtxout = txins.pop()
7879
inputs = []
@@ -150,7 +151,7 @@ def __init__(self):
150151
def setup_network(self):
151152
"""
152153
We'll setup the network to have 3 nodes that all mine with different parameters.
153-
But first we need to use one node to create a lot of small low priority outputs
154+
But first we need to use one node to create a lot of outputs
154155
which we will use to generate our transactions.
155156
"""
156157
self.nodes = []
@@ -159,7 +160,7 @@ def setup_network(self):
159160
"-whitelist=127.0.0.1"]))
160161

161162
print("This test is time consuming, please be patient")
162-
print("Splitting inputs to small size so we can generate low priority tx's")
163+
print("Splitting inputs so we can generate tx's")
163164
self.txouts = []
164165
self.txouts2 = []
165166
# Split a coinbase into two transaction puzzle outputs

qa/rpc-tests/test_framework/util.py

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -442,47 +442,6 @@ def make_change(from_node, amount_in, amount_out, fee):
442442
outputs[from_node.getnewaddress()] = change
443443
return outputs
444444

445-
def send_zeropri_transaction(from_node, to_node, amount, fee):
446-
"""
447-
Create&broadcast a zero-priority transaction.
448-
Returns (txid, hex-encoded-txdata)
449-
Ensures transaction is zero-priority by first creating a send-to-self,
450-
then using its output
451-
"""
452-
453-
# Create a send-to-self with confirmed inputs:
454-
self_address = from_node.getnewaddress()
455-
(total_in, inputs) = gather_inputs(from_node, amount+fee*2)
456-
outputs = make_change(from_node, total_in, amount+fee, fee)
457-
outputs[self_address] = float(amount+fee)
458-
459-
self_rawtx = from_node.createrawtransaction(inputs, outputs)
460-
self_signresult = from_node.signrawtransaction(self_rawtx)
461-
self_txid = from_node.sendrawtransaction(self_signresult["hex"], True)
462-
463-
vout = find_output(from_node, self_txid, amount+fee)
464-
# Now immediately spend the output to create a 1-input, 1-output
465-
# zero-priority transaction:
466-
inputs = [ { "txid" : self_txid, "vout" : vout } ]
467-
outputs = { to_node.getnewaddress() : float(amount) }
468-
469-
rawtx = from_node.createrawtransaction(inputs, outputs)
470-
signresult = from_node.signrawtransaction(rawtx)
471-
txid = from_node.sendrawtransaction(signresult["hex"], True)
472-
473-
return (txid, signresult["hex"])
474-
475-
def random_zeropri_transaction(nodes, amount, min_fee, fee_increment, fee_variants):
476-
"""
477-
Create a random zero-priority transaction.
478-
Returns (txid, hex-encoded-transaction-data, fee)
479-
"""
480-
from_node = random.choice(nodes)
481-
to_node = random.choice(nodes)
482-
fee = min_fee + fee_increment*random.randint(0,fee_variants)
483-
(txid, txhex) = send_zeropri_transaction(from_node, to_node, amount, fee)
484-
return (txid, txhex, fee)
485-
486445
def random_transaction(nodes, amount, min_fee, fee_increment, fee_variants):
487446
"""
488447
Create a random transaction.

src/test/mempool_tests.cpp

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -126,36 +126,35 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest)
126126
tx1.vout.resize(1);
127127
tx1.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
128128
tx1.vout[0].nValue = 10 * COIN;
129-
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).Priority(10.0).FromTx(tx1));
129+
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).FromTx(tx1));
130130

131131
/* highest fee */
132132
CMutableTransaction tx2 = CMutableTransaction();
133133
tx2.vout.resize(1);
134134
tx2.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
135135
tx2.vout[0].nValue = 2 * COIN;
136-
pool.addUnchecked(tx2.GetHash(), entry.Fee(20000LL).Priority(9.0).FromTx(tx2));
136+
pool.addUnchecked(tx2.GetHash(), entry.Fee(20000LL).FromTx(tx2));
137137

138138
/* lowest fee */
139139
CMutableTransaction tx3 = CMutableTransaction();
140140
tx3.vout.resize(1);
141141
tx3.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
142142
tx3.vout[0].nValue = 5 * COIN;
143-
pool.addUnchecked(tx3.GetHash(), entry.Fee(0LL).Priority(100.0).FromTx(tx3));
143+
pool.addUnchecked(tx3.GetHash(), entry.Fee(0LL).FromTx(tx3));
144144

145145
/* 2nd highest fee */
146146
CMutableTransaction tx4 = CMutableTransaction();
147147
tx4.vout.resize(1);
148148
tx4.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
149149
tx4.vout[0].nValue = 6 * COIN;
150-
pool.addUnchecked(tx4.GetHash(), entry.Fee(15000LL).Priority(1.0).FromTx(tx4));
150+
pool.addUnchecked(tx4.GetHash(), entry.Fee(15000LL).FromTx(tx4));
151151

152152
/* equal fee rate to tx1, but newer */
153153
CMutableTransaction tx5 = CMutableTransaction();
154154
tx5.vout.resize(1);
155155
tx5.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
156156
tx5.vout[0].nValue = 11 * COIN;
157157
entry.nTime = 1;
158-
entry.dPriority = 10.0;
159158
pool.addUnchecked(tx5.GetHash(), entry.Fee(10000LL).FromTx(tx5));
160159
BOOST_CHECK_EQUAL(pool.size(), 5);
161160

@@ -328,29 +327,29 @@ BOOST_AUTO_TEST_CASE(MempoolAncestorIndexingTest)
328327
tx1.vout.resize(1);
329328
tx1.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
330329
tx1.vout[0].nValue = 10 * COIN;
331-
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).Priority(10.0).FromTx(tx1));
330+
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).FromTx(tx1));
332331

333332
/* highest fee */
334333
CMutableTransaction tx2 = CMutableTransaction();
335334
tx2.vout.resize(1);
336335
tx2.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
337336
tx2.vout[0].nValue = 2 * COIN;
338-
pool.addUnchecked(tx2.GetHash(), entry.Fee(20000LL).Priority(9.0).FromTx(tx2));
337+
pool.addUnchecked(tx2.GetHash(), entry.Fee(20000LL).FromTx(tx2));
339338
uint64_t tx2Size = GetVirtualTransactionSize(tx2);
340339

341340
/* lowest fee */
342341
CMutableTransaction tx3 = CMutableTransaction();
343342
tx3.vout.resize(1);
344343
tx3.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
345344
tx3.vout[0].nValue = 5 * COIN;
346-
pool.addUnchecked(tx3.GetHash(), entry.Fee(0LL).Priority(100.0).FromTx(tx3));
345+
pool.addUnchecked(tx3.GetHash(), entry.Fee(0LL).FromTx(tx3));
347346

348347
/* 2nd highest fee */
349348
CMutableTransaction tx4 = CMutableTransaction();
350349
tx4.vout.resize(1);
351350
tx4.vout[0].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
352351
tx4.vout[0].nValue = 6 * COIN;
353-
pool.addUnchecked(tx4.GetHash(), entry.Fee(15000LL).Priority(1.0).FromTx(tx4));
352+
pool.addUnchecked(tx4.GetHash(), entry.Fee(15000LL).FromTx(tx4));
354353

355354
/* equal fee rate to tx1, but newer */
356355
CMutableTransaction tx5 = CMutableTransaction();
@@ -434,23 +433,22 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest)
434433
{
435434
CTxMemPool pool(CFeeRate(1000));
436435
TestMemPoolEntryHelper entry;
437-
entry.dPriority = 10.0;
438436

439437
CMutableTransaction tx1 = CMutableTransaction();
440438
tx1.vin.resize(1);
441439
tx1.vin[0].scriptSig = CScript() << OP_1;
442440
tx1.vout.resize(1);
443441
tx1.vout[0].scriptPubKey = CScript() << OP_1 << OP_EQUAL;
444442
tx1.vout[0].nValue = 10 * COIN;
445-
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).FromTx(tx1, &pool));
443+
pool.addUnchecked(tx1.GetHash(), entry.Fee(10000LL).FromTx(tx1));
446444

447445
CMutableTransaction tx2 = CMutableTransaction();
448446
tx2.vin.resize(1);
449447
tx2.vin[0].scriptSig = CScript() << OP_2;
450448
tx2.vout.resize(1);
451449
tx2.vout[0].scriptPubKey = CScript() << OP_2 << OP_EQUAL;
452450
tx2.vout[0].nValue = 10 * COIN;
453-
pool.addUnchecked(tx2.GetHash(), entry.Fee(5000LL).FromTx(tx2, &pool));
451+
pool.addUnchecked(tx2.GetHash(), entry.Fee(5000LL).FromTx(tx2));
454452

455453
pool.TrimToSize(pool.DynamicMemoryUsage()); // should do nothing
456454
BOOST_CHECK(pool.exists(tx1.GetHash()));
@@ -460,15 +458,15 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest)
460458
BOOST_CHECK(pool.exists(tx1.GetHash()));
461459
BOOST_CHECK(!pool.exists(tx2.GetHash()));
462460

463-
pool.addUnchecked(tx2.GetHash(), entry.FromTx(tx2, &pool));
461+
pool.addUnchecked(tx2.GetHash(), entry.FromTx(tx2));
464462
CMutableTransaction tx3 = CMutableTransaction();
465463
tx3.vin.resize(1);
466464
tx3.vin[0].prevout = COutPoint(tx2.GetHash(), 0);
467465
tx3.vin[0].scriptSig = CScript() << OP_2;
468466
tx3.vout.resize(1);
469467
tx3.vout[0].scriptPubKey = CScript() << OP_3 << OP_EQUAL;
470468
tx3.vout[0].nValue = 10 * COIN;
471-
pool.addUnchecked(tx3.GetHash(), entry.Fee(20000LL).FromTx(tx3, &pool));
469+
pool.addUnchecked(tx3.GetHash(), entry.Fee(20000LL).FromTx(tx3));
472470

473471
pool.TrimToSize(pool.DynamicMemoryUsage() * 3 / 4); // tx3 should pay for tx2 (CPFP)
474472
BOOST_CHECK(!pool.exists(tx1.GetHash()));
@@ -531,10 +529,10 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest)
531529
tx7.vout[1].scriptPubKey = CScript() << OP_7 << OP_EQUAL;
532530
tx7.vout[1].nValue = 10 * COIN;
533531

534-
pool.addUnchecked(tx4.GetHash(), entry.Fee(7000LL).FromTx(tx4, &pool));
535-
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5, &pool));
536-
pool.addUnchecked(tx6.GetHash(), entry.Fee(1100LL).FromTx(tx6, &pool));
537-
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7, &pool));
532+
pool.addUnchecked(tx4.GetHash(), entry.Fee(7000LL).FromTx(tx4));
533+
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5));
534+
pool.addUnchecked(tx6.GetHash(), entry.Fee(1100LL).FromTx(tx6));
535+
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7));
538536

539537
// we only require this remove, at max, 2 txn, because its not clear what we're really optimizing for aside from that
540538
pool.TrimToSize(pool.DynamicMemoryUsage() - 1);
@@ -543,17 +541,17 @@ BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest)
543541
BOOST_CHECK(!pool.exists(tx7.GetHash()));
544542

545543
if (!pool.exists(tx5.GetHash()))
546-
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5, &pool));
547-
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7, &pool));
544+
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5));
545+
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7));
548546

549547
pool.TrimToSize(pool.DynamicMemoryUsage() / 2); // should maximize mempool size by only removing 5/7
550548
BOOST_CHECK(pool.exists(tx4.GetHash()));
551549
BOOST_CHECK(!pool.exists(tx5.GetHash()));
552550
BOOST_CHECK(pool.exists(tx6.GetHash()));
553551
BOOST_CHECK(!pool.exists(tx7.GetHash()));
554552

555-
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5, &pool));
556-
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7, &pool));
553+
pool.addUnchecked(tx5.GetHash(), entry.Fee(1000LL).FromTx(tx5));
554+
pool.addUnchecked(tx7.GetHash(), entry.Fee(9000LL).FromTx(tx7));
557555

558556
std::vector<CTransactionRef> vtx;
559557
SetMockTime(42);

src/test/miner_tests.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
193193
uint256 hash;
194194
TestMemPoolEntryHelper entry;
195195
entry.nFee = 11;
196-
entry.dPriority = 111.0;
197196
entry.nHeight = 11;
198197

199198
LOCK(cs_main);
@@ -298,7 +297,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
298297
BOOST_CHECK_THROW(BlockAssembler(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error);
299298
mempool.clear();
300299

301-
// child with higher priority than parent
300+
// child with higher feerate than parent
302301
tx.vin[0].scriptSig = CScript() << OP_1;
303302
tx.vin[0].prevout.hash = txFirst[1]->GetHash();
304303
tx.vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;

src/test/policyestimator_tests.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
5656
for (int k = 0; k < 4; k++) { // add 4 fee txs
5757
tx.vin[0].prevout.n = 10000*blocknum+100*j+k; // make transaction unique
5858
uint256 hash = tx.GetHash();
59-
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Priority(0).Height(blocknum).FromTx(tx, &mpool));
59+
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Height(blocknum).FromTx(tx));
6060
txHashes[j].push_back(hash);
6161
}
6262
}
@@ -132,7 +132,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
132132
for (int k = 0; k < 4; k++) { // add 4 fee txs
133133
tx.vin[0].prevout.n = 10000*blocknum+100*j+k;
134134
uint256 hash = tx.GetHash();
135-
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Priority(0).Height(blocknum).FromTx(tx, &mpool));
135+
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Height(blocknum).FromTx(tx));
136136
txHashes[j].push_back(hash);
137137
}
138138
}
@@ -169,7 +169,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
169169
for (int k = 0; k < 4; k++) { // add 4 fee txs
170170
tx.vin[0].prevout.n = 10000*blocknum+100*j+k;
171171
uint256 hash = tx.GetHash();
172-
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Priority(0).Height(blocknum).FromTx(tx, &mpool));
172+
mpool.addUnchecked(hash, entry.Fee(feeV[j]).Time(GetTime()).Height(blocknum).FromTx(tx));
173173
CTransactionRef ptx = mpool.get(hash);
174174
if (ptx)
175175
block.push_back(ptx);
@@ -185,7 +185,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
185185
}
186186

187187
// Test that if the mempool is limited, estimateSmartFee won't return a value below the mempool min fee
188-
mpool.addUnchecked(tx.GetHash(), entry.Fee(feeV[5]).Time(GetTime()).Priority(0).Height(blocknum).FromTx(tx, &mpool));
188+
mpool.addUnchecked(tx.GetHash(), entry.Fee(feeV[5]).Time(GetTime()).Height(blocknum).FromTx(tx));
189189
// evict that transaction which should set a mempool min fee of minRelayTxFee + feeV[5]
190190
mpool.TrimToSize(1);
191191
BOOST_CHECK(mpool.GetMinFee(1).GetFeePerK() > feeV[5]);

src/test/test_bitcoin.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -141,17 +141,14 @@ TestChain100Setup::~TestChain100Setup()
141141
}
142142

143143

144-
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CMutableTransaction &tx, CTxMemPool *pool) {
144+
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CMutableTransaction &tx) {
145145
CTransaction txn(tx);
146-
return FromTx(txn, pool);
146+
return FromTx(txn);
147147
}
148148

149-
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CTransaction &txn, CTxMemPool *pool) {
150-
// Hack to assume either it's completely dependent on other mempool txs or not at all
151-
CAmount inChainValue = pool && pool->HasNoInputsOf(txn) ? txn.GetValueOut() : 0;
152-
153-
return CTxMemPoolEntry(MakeTransactionRef(txn), nFee, nTime, dPriority, nHeight,
154-
inChainValue, spendsCoinbase, sigOpCost, lp);
149+
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CTransaction &txn) {
150+
return CTxMemPoolEntry(MakeTransactionRef(txn), nFee, nTime, 0.0, nHeight,
151+
0, spendsCoinbase, sigOpCost, lp);
155152
}
156153

157154
void Shutdown(void* parg)

0 commit comments

Comments
 (0)