Skip to content

Commit c5b5452

Browse files
authored
Merge pull request #430 from tronprotocol/add_lock_for_dialogoptional
add lock for DialogOptional
2 parents 74dfb18 + 46a66e0 commit c5b5452

3 files changed

Lines changed: 32 additions & 24 deletions

File tree

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,50 @@
11
package org.tron.common.utils;
22

3+
import java.util.Optional;
34
import org.tron.core.db.AbstractRevokingStore.Dialog;
45

5-
import java.util.Optional;
6+
public final class DialogOptional {
67

7-
public class DialogOptional<T extends Dialog> {
8-
private static final DialogOptional<?> EMPTY = new DialogOptional<>();
8+
private static final DialogOptional INSTANCE = OptionalEnum.INSTANCE.getInstance();
99

10-
private Optional<T> value;
10+
private Optional<Dialog> value;
1111

1212
private DialogOptional() {
1313
this.value = Optional.empty();
1414
}
1515

16-
public static <T extends Dialog> DialogOptional<T> empty() {
17-
@SuppressWarnings("unchecked")
18-
DialogOptional<T> t = (DialogOptional<T>) EMPTY;
19-
return t;
16+
public synchronized DialogOptional setValue(Dialog value) {
17+
if (!this.value.isPresent()) {
18+
this.value = Optional.of(value);
19+
}
20+
return this;
2021
}
2122

22-
private DialogOptional(T value) {
23-
this.value = Optional.of(value);
23+
public synchronized boolean valid() {
24+
return value.isPresent();
2425
}
2526

26-
public static <T extends Dialog> DialogOptional<T> of(T value) {
27-
return new DialogOptional<>(value);
27+
public synchronized void reset() {
28+
value.ifPresent(Dialog::destroy);
29+
value = Optional.empty();
2830
}
2931

30-
public static <T extends Dialog> DialogOptional<T> ofNullable(T value) {
31-
return value == null ? empty() : of(value);
32+
public static DialogOptional instance() {
33+
return INSTANCE;
3234
}
3335

34-
public boolean valid() {
35-
return value.isPresent();
36-
}
36+
private enum OptionalEnum {
37+
INSTANCE;
3738

38-
public void reset() {
39-
value.ifPresent(Dialog::destroy);
40-
value = Optional.empty();
39+
private DialogOptional instance;
40+
41+
OptionalEnum() {
42+
instance = new DialogOptional();
43+
}
44+
45+
private DialogOptional getInstance() {
46+
return instance;
47+
}
4148
}
49+
4250
}

src/main/java/org/tron/core/db/Manager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public class Manager {
8484
private KhaosDatabase khaosDb;
8585
private RevokingDatabase revokingStore;
8686
@Getter
87-
private DialogOptional<Dialog> dialog = DialogOptional.empty();
87+
private DialogOptional dialog = DialogOptional.instance();
8888

8989
@Getter
9090
@Setter
@@ -350,7 +350,7 @@ public synchronized boolean pushTransactions(final TransactionCapsule trx)
350350
validateFreq(trx);
351351

352352
if (!dialog.valid()) {
353-
dialog = DialogOptional.of(revokingStore.buildDialog());
353+
dialog.setValue(revokingStore.buildDialog());
354354
}
355355

356356
try (
@@ -697,7 +697,7 @@ public synchronized BlockCapsule generateBlock(final WitnessCapsule witnessCapsu
697697
witnessCapsule.getAddress());
698698

699699
dialog.reset();
700-
dialog = DialogOptional.of(revokingStore.buildDialog());
700+
dialog.setValue(revokingStore.buildDialog());
701701

702702
Iterator iterator = pendingTransactions.iterator();
703703
while (iterator.hasNext()) {

src/test/java/org/tron/core/db/RevokingStoreTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public synchronized void testUndo() throws RevokingStoreIllegalStateException {
4040
"testrevokingtronstore-testUndo", revokingDatabase);
4141
TestProtoCapsule testProtoCapsule = new TestProtoCapsule();
4242

43-
DialogOptional dialog = DialogOptional.of(revokingDatabase.buildDialog());
43+
DialogOptional dialog = DialogOptional.instance().setValue(revokingDatabase.buildDialog());
4444
for (int i = 0; i < 10; i++) {
4545
try (Dialog tmpDialog = revokingDatabase.buildDialog()) {
4646
tronDatabase.put(testProtoCapsule.getData(), testProtoCapsule);

0 commit comments

Comments
 (0)