From 5c6e32c6e5cfad658ca3d95b694ef32c0f761141 Mon Sep 17 00:00:00 2001 From: Milot Mirdita Date: Tue, 21 Nov 2023 16:50:00 +0900 Subject: [PATCH] breaking: fix parameter singleton in subprojects With subprojects who have their own Parameter class it can happen that the MMseqs2 Parameters object is constructed first (in MMseqsBase.cpp) and then the subproject singleton is accessed and but is already wrongly initialized as the parent. Here we introduce a function initParameterSingleton that decides who to initialize. Subprojects need to provide this function that calls the correct Parameters constructor now. --- src/commons/Parameters.h | 8 ++++---- src/mmseqs.cpp | 3 +++ src/test/TestAlignment.cpp | 1 + src/test/TestAlignmentPerformance.cpp | 1 + src/test/TestAlignmentTraceback.cpp | 1 + src/test/TestAlp.cpp | 1 + src/test/TestBacktraceTranslator.cpp | 1 - src/test/TestBestAlphabet.cpp | 1 - src/test/TestCompositionBias.cpp | 1 + src/test/TestDiagonalScoring.cpp | 1 + src/test/TestDiagonalScoringPerformance.cpp | 1 + src/test/TestKmerGenerator.cpp | 1 + src/test/TestKmerNucl.cpp | 1 + src/test/TestKmerScore.cpp | 1 + src/test/TestKwayMerge.cpp | 1 - src/test/TestMultipleAlignment.cpp | 1 + src/test/TestPSSM.cpp | 1 + src/test/TestPSSMPrune.cpp | 1 + src/test/TestProfileAlignment.cpp | 1 + src/test/TestReduceMatrix.cpp | 1 + src/test/TestScoreMatrixSerialization.cpp | 1 + src/test/TestSequenceIndex.cpp | 1 + src/test/TestTanTan.cpp | 1 + 23 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/commons/Parameters.h b/src/commons/Parameters.h index 1112e261c..6db7ddbfc 100644 --- a/src/commons/Parameters.h +++ b/src/commons/Parameters.h @@ -59,6 +59,8 @@ struct MMseqsParameter { } }; +void initParameterSingleton(void); +#define DEFAULT_PARAMETER_SINGLETON_INIT void initParameterSingleton() { new Parameters; } class Parameters { public: @@ -712,13 +714,11 @@ class Parameters { static Parameters& getInstance() { if (instance == NULL) { - initInstance(); + initParameterSingleton(); } return *instance; } - static void initInstance() { - new Parameters; - } + friend void initParameterSingleton(void); void setDefaults(); void initMatrices(); diff --git a/src/mmseqs.cpp b/src/mmseqs.cpp index f0a5be091..5c7287a81 100644 --- a/src/mmseqs.cpp +++ b/src/mmseqs.cpp @@ -1,6 +1,7 @@ #include "Command.h" #include "DownloadDatabase.h" #include "Prefiltering.h" +#include "Parameters.h" const char* binary_name = "mmseqs"; const char* tool_name = "MMseqs2"; @@ -19,6 +20,8 @@ void init() { } void (*initCommands)(void) = init; +DEFAULT_PARAMETER_SINGLETON_INIT; + std::vector externalDownloads = {}; std::vector externalThreshold = {}; diff --git a/src/test/TestAlignment.cpp b/src/test/TestAlignment.cpp index 62f528a3a..65ee95d0a 100644 --- a/src/test/TestAlignment.cpp +++ b/src/test/TestAlignment.cpp @@ -20,6 +20,7 @@ #include "Matcher.h" const char* binary_name = "test_alignment"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { const size_t kmer_size=6; diff --git a/src/test/TestAlignmentPerformance.cpp b/src/test/TestAlignmentPerformance.cpp index 225bd2b84..ed74223c6 100644 --- a/src/test/TestAlignmentPerformance.cpp +++ b/src/test/TestAlignmentPerformance.cpp @@ -24,6 +24,7 @@ #include "StripedSmithWaterman.h" const char* binary_name = "test_alignmentperformance"; +DEFAULT_PARAMETER_SINGLETON_INIT; #define MAX_FILENAME_LIST_FILES 4096 diff --git a/src/test/TestAlignmentTraceback.cpp b/src/test/TestAlignmentTraceback.cpp index 6e66bedb7..ade3abebb 100644 --- a/src/test/TestAlignmentTraceback.cpp +++ b/src/test/TestAlignmentTraceback.cpp @@ -18,6 +18,7 @@ #include "Parameters.h" const char* binary_name = "test_alignmenttraceback"; +DEFAULT_PARAMETER_SINGLETON_INIT; struct scores{ short H; diff --git a/src/test/TestAlp.cpp b/src/test/TestAlp.cpp index d3b98a4b7..7cd701bd1 100644 --- a/src/test/TestAlp.cpp +++ b/src/test/TestAlp.cpp @@ -43,6 +43,7 @@ Contents: pairwise alignment algorithms #include "sls_alignment_evaluer.hpp" const char* binary_name = "test_alp"; +DEFAULT_PARAMETER_SINGLETON_INIT; using namespace Sls; using namespace std; diff --git a/src/test/TestBacktraceTranslator.cpp b/src/test/TestBacktraceTranslator.cpp index 39328d0ff..b8a7bfd9c 100644 --- a/src/test/TestBacktraceTranslator.cpp +++ b/src/test/TestBacktraceTranslator.cpp @@ -1,5 +1,4 @@ #include "BacktraceTranslator.h" -#include "Parameters.h" const char* binary_name = "test_backtracetranslator"; diff --git a/src/test/TestBestAlphabet.cpp b/src/test/TestBestAlphabet.cpp index fb432c53b..028977593 100644 --- a/src/test/TestBestAlphabet.cpp +++ b/src/test/TestBestAlphabet.cpp @@ -14,7 +14,6 @@ #include "DBReader.h" #include "Sequence.h" #include "Indexer.h" -#include "Parameters.h" const char* binary_name = "test_bestalphabet"; diff --git a/src/test/TestCompositionBias.cpp b/src/test/TestCompositionBias.cpp index 1a3e69914..f55315c13 100644 --- a/src/test/TestCompositionBias.cpp +++ b/src/test/TestCompositionBias.cpp @@ -9,6 +9,7 @@ #include "Parameters.h" const char* binary_name = "test_compositionbias"; +DEFAULT_PARAMETER_SINGLETON_INIT; void calcLocalAaBiasCorrection(Sequence* seq, SubstitutionMatrix * m){ const int windowSize = 40; diff --git a/src/test/TestDiagonalScoring.cpp b/src/test/TestDiagonalScoring.cpp index cdb5b45d8..adb055885 100644 --- a/src/test/TestDiagonalScoring.cpp +++ b/src/test/TestDiagonalScoring.cpp @@ -14,6 +14,7 @@ #include "Parameters.h" const char* binary_name = "test_diagonalscoring"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { size_t kmer_size = 6; diff --git a/src/test/TestDiagonalScoringPerformance.cpp b/src/test/TestDiagonalScoringPerformance.cpp index 3f224d29b..bb260a080 100644 --- a/src/test/TestDiagonalScoringPerformance.cpp +++ b/src/test/TestDiagonalScoringPerformance.cpp @@ -20,6 +20,7 @@ KSEQ_INIT(int, read) #include "Parameters.h" const char* binary_name = "test_diagonalscoringperformance"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { size_t kmer_size = 6; diff --git a/src/test/TestKmerGenerator.cpp b/src/test/TestKmerGenerator.cpp index a74568918..c9d35d535 100644 --- a/src/test/TestKmerGenerator.cpp +++ b/src/test/TestKmerGenerator.cpp @@ -15,6 +15,7 @@ #include "Parameters.h" const char* binary_name = "test_kmergenerator"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { const size_t kmer_size=6; diff --git a/src/test/TestKmerNucl.cpp b/src/test/TestKmerNucl.cpp index 745615944..4a5666caf 100644 --- a/src/test/TestKmerNucl.cpp +++ b/src/test/TestKmerNucl.cpp @@ -6,6 +6,7 @@ #include "Orf.h" const char* binary_name = "test_kmernucl"; +DEFAULT_PARAMETER_SINGLETON_INIT; std::string kmerToSting(size_t idx, int size) { char output[32]; diff --git a/src/test/TestKmerScore.cpp b/src/test/TestKmerScore.cpp index 77a6bf981..834e98ffb 100644 --- a/src/test/TestKmerScore.cpp +++ b/src/test/TestKmerScore.cpp @@ -8,6 +8,7 @@ #include "Parameters.h" const char* binary_name = "test_kmerscore"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { const size_t kmer_size = 6; diff --git a/src/test/TestKwayMerge.cpp b/src/test/TestKwayMerge.cpp index 864ce52f1..d62619dc7 100644 --- a/src/test/TestKwayMerge.cpp +++ b/src/test/TestKwayMerge.cpp @@ -8,7 +8,6 @@ #include "SubstitutionMatrix.h" #include "Sequence.h" -#include "Parameters.h" const char* binary_name = "test_kwaymerge"; struct KmerEntry{ diff --git a/src/test/TestMultipleAlignment.cpp b/src/test/TestMultipleAlignment.cpp index 38c7aec16..b01aa55d0 100644 --- a/src/test/TestMultipleAlignment.cpp +++ b/src/test/TestMultipleAlignment.cpp @@ -14,6 +14,7 @@ #include "Parameters.h" const char* binary_name = "test_multiplealignment"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main(int, const char**) { Parameters& par = Parameters::getInstance(); diff --git a/src/test/TestPSSM.cpp b/src/test/TestPSSM.cpp index 4e38f9dca..f6beed89c 100644 --- a/src/test/TestPSSM.cpp +++ b/src/test/TestPSSM.cpp @@ -15,6 +15,7 @@ #include "MultipleAlignment.h" const char* binary_name = "test_pssm"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { Parameters& par = Parameters::getInstance(); diff --git a/src/test/TestPSSMPrune.cpp b/src/test/TestPSSMPrune.cpp index cb36036f6..ce296917c 100644 --- a/src/test/TestPSSMPrune.cpp +++ b/src/test/TestPSSMPrune.cpp @@ -16,6 +16,7 @@ #include const char* binary_name = "test_pssmprune"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { Parameters& par = Parameters::getInstance(); diff --git a/src/test/TestProfileAlignment.cpp b/src/test/TestProfileAlignment.cpp index 6e54ad657..83ae457b1 100644 --- a/src/test/TestProfileAlignment.cpp +++ b/src/test/TestProfileAlignment.cpp @@ -19,6 +19,7 @@ #include "Parameters.h" const char* binary_name = "test_profilealignment"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { const size_t kmer_size=6; diff --git a/src/test/TestReduceMatrix.cpp b/src/test/TestReduceMatrix.cpp index b75975d4d..f388d80d8 100644 --- a/src/test/TestReduceMatrix.cpp +++ b/src/test/TestReduceMatrix.cpp @@ -12,6 +12,7 @@ #include "Parameters.h" const char* binary_name = "test_reducematrix"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { const int reductionAlphabetSize = 17; diff --git a/src/test/TestScoreMatrixSerialization.cpp b/src/test/TestScoreMatrixSerialization.cpp index 0f383c453..6eee841ae 100644 --- a/src/test/TestScoreMatrixSerialization.cpp +++ b/src/test/TestScoreMatrixSerialization.cpp @@ -5,6 +5,7 @@ #include "Debug.h" const char* binary_name = "test_scorematrixserialization"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { Parameters& par = Parameters::getInstance(); diff --git a/src/test/TestSequenceIndex.cpp b/src/test/TestSequenceIndex.cpp index ffdbebfeb..eac38a379 100644 --- a/src/test/TestSequenceIndex.cpp +++ b/src/test/TestSequenceIndex.cpp @@ -11,6 +11,7 @@ #include "Parameters.h" const char* binary_name = "test_sequenceindex"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { size_t kmer_size = 6; diff --git a/src/test/TestTanTan.cpp b/src/test/TestTanTan.cpp index fe1fc0b7f..65a25c7cc 100644 --- a/src/test/TestTanTan.cpp +++ b/src/test/TestTanTan.cpp @@ -11,6 +11,7 @@ #include "Parameters.h" const char* binary_name = "test_tantan"; +DEFAULT_PARAMETER_SINGLETON_INIT; int main (int, const char**) { const size_t kmer_size = 6;