summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.clang-format52
-rw-r--r--formattest.cpp187
-rw-r--r--formatting.txt7
3 files changed, 246 insertions, 0 deletions
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..1822f86
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,52 @@
1AccessModifierOffset: -4
2AlignEscapedNewlinesLeft: true
3AlignTrailingComments: false
4AlignAfterOpenBracket: false
5AllowAllParametersOfDeclarationOnNextLine: true
6AllowShortBlocksOnASingleLine: false
7AllowShortFunctionsOnASingleLine: Inline
8AllowShortIfStatementsOnASingleLine: false
9AllowShortLoopsOnASingleLine: false
10AlwaysBreakAfterDefinitionReturnType: false
11AlwaysBreakBeforeMultilineStrings: false
12AlwaysBreakTemplateDeclarations: false
13BinPackArguments: true
14BinPackParameters: true
15BreakBeforeBinaryOperators: false
16BreakBeforeBraces: Mozilla
17BreakBeforeTernaryOperators: false
18BreakConstructorInitializersBeforeComma: false
19ColumnLimit: 180
20CommentPragmas: ''
21ConstructorInitializerAllOnOneLineOrOnePerLine: true
22ConstructorInitializerIndentWidth: 4
23ContinuationIndentWidth: 0
24Cpp11BracedListStyle: false
25DerivePointerBinding: false
26ForEachMacros: ['foreach', 'Q_FOREACH']
27IndentCaseLabels: true
28IndentFunctionDeclarationAfterType: false
29IndentWidth: 4
30Language: Cpp
31MaxEmptyLinesToKeep: 2
32NamespaceIndentation: None
33ObjCSpaceAfterProperty: true
34ObjCSpaceBeforeProtocolList: true
35PenaltyBreakBeforeFirstCallParameter: 100
36PenaltyBreakComment: 100
37PenaltyBreakFirstLessLess: 0
38PenaltyBreakString: 100
39PenaltyExcessCharacter: 1
40PenaltyReturnTypeOnItsOwnLine: 0
41PointerBindsToType: false
42SpaceBeforeAssignmentOperators: true
43SpaceBeforeParens: ControlStatements
44SpaceInEmptyParentheses: false
45SpacesBeforeTrailingComments: 1
46SpacesInAngles: false
47SpacesInCStyleCastParentheses: false
48SpacesInContainerLiterals: false
49SpacesInParentheses: false
50Standard: Cpp11
51TabWidth: 4
52UseTab: Never
diff --git a/formattest.cpp b/formattest.cpp
new file mode 100644
index 0000000..f12fd59
--- /dev/null
+++ b/formattest.cpp
@@ -0,0 +1,187 @@
1
2namespace async {
3 template<typename T>
4 KAsync::Job<T> run(const std::function<T()> &f)
5 {
6 return KAsync::start<T>([f](KAsync::Future<T> &future) {
7 auto result = QtConcurrent::run(f);
8 auto watcher = new QFutureWatcher<T>;
9 watcher->setFuture(result);
10 QObject::connect(watcher, &QFutureWatcher<T>::finished, watcher, [&future, watcher]() {
11 future.setValue(watcher->future().result());
12 delete watcher;
13 future.setFinished();
14 });
15 });
16 }
17
18}
19
20void run()
21{
22 return KAsync::start<T>([f](KAsync::Future<T> &future) {
23 auto result = QtConcurrent::run(f);
24 auto watcher = new QFutureWatcher<T>;
25 watcher->setFuture(result);
26 QObject::connect(watcher, &QFutureWatcher<T>::finished, watcher, [&future]() {
27 future.setFinished();
28 });
29 });
30}
31
32class ResourceAccessFactory {
33public:
34 static ResourceAccessFactory &instance()
35 {
36 static ResourceAccessFactory *instance = 0;
37 if (!instance) {
38 instance = new ResourceAccessFactory;
39 }
40 return *instance;
41 }
42
43 Sink::ResourceAccess::Ptr getAccess(const QByteArray &instanceIdentifier)
44 {
45 if (!mCache.contains(instanceIdentifier)) {
46 //Reuse the pointer if something else kept the resourceaccess alive
47 if (mWeakCache.contains(instanceIdentifier)) {
48 auto sharedPointer = mWeakCache.value(instanceIdentifier).toStrongRef();
49 if (sharedPointer) {
50 mCache.insert(instanceIdentifier, sharedPointer);
51 }
52 }
53 if (!mCache.contains(instanceIdentifier)) {
54 //Create a new instance if necessary
55 auto sharedPointer = Sink::ResourceAccess::Ptr::create(instanceIdentifier);
56 QObject::connect(sharedPointer.data(), &Sink::ResourceAccess::ready, sharedPointer.data(), [this, instanceIdentifier](bool ready) {
57 if (!ready) {
58 mCache.remove(instanceIdentifier);
59 }
60 });
61 mCache.insert(instanceIdentifier, sharedPointer);
62 mWeakCache.insert(instanceIdentifier, sharedPointer);
63 }
64 }
65 if (!mTimer.contains(instanceIdentifier)) {
66 auto timer = new QTimer;
67 //Drop connection after 3 seconds (which is a random value)
68 QObject::connect(timer, &QTimer::timeout, timer, [this, instanceIdentifier]() {
69 mCache.remove(instanceIdentifier);
70 });
71 timer->setInterval(3000);
72 mTimer.insert(instanceIdentifier, timer);
73 }
74 auto timer = mTimer.value(instanceIdentifier);
75 timer->start();
76 return mCache.value(instanceIdentifier);
77 }
78
79 QHash<QByteArray, QWeakPointer<Sink::ResourceAccess> > mWeakCache;
80 QHash<QByteArray, Sink::ResourceAccess::Ptr> mCache;
81 QHash<QByteArray, QTimer*> mTimer;
82};
83
84class ChangeReplay : public QObject
85{
86 Q_OBJECT
87public:
88
89 typedef std::function<KAsync::Job<void>(const QByteArray &type, const QByteArray &key, const QByteArray &value)> ReplayFunction;
90
91 ChangeReplay(const QString &resourceName, const ReplayFunction &replayFunction)
92 : mStorage(storageLocation(), resourceName, Storage::ReadOnly),
93 mChangeReplayStore(storageLocation(), resourceName + ".changereplay", Storage::ReadWrite),
94 mReplayFunction(replayFunction)
95 {
96
97 }
98
99 qint64 getLastReplayedRevision()
100 {
101 qint64 lastReplayedRevision = 0;
102 auto replayStoreTransaction = mChangeReplayStore.createTransaction(Storage::ReadOnly);
103 replayStoreTransaction.openDatabase().scan("lastReplayedRevision", [&lastReplayedRevision](const QByteArray &key, const QByteArray &value) -> bool {
104 lastReplayedRevision = value.toLongLong();
105 return false;
106 }, [](const Storage::Error &) {
107 });
108 return lastReplayedRevision;
109 }
110
111 bool allChangesReplayed()
112 {
113 const qint64 topRevision = Storage::maxRevision(mStorage.createTransaction(Storage::ReadOnly));
114 const qint64 lastReplayedRevision = getLastReplayedRevision();
115 Trace() << "All changes replayed " << topRevision << lastReplayedRevision;
116 return (lastReplayedRevision >= topRevision);
117 }
118
119Q_SIGNALS:
120 void changesReplayed();
121
122public Q_SLOTS:
123 void revisionChanged()
124 {
125 auto mainStoreTransaction = mStorage.createTransaction(Storage::ReadOnly);
126 auto replayStoreTransaction = mChangeReplayStore.createTransaction(Storage::ReadWrite);
127 qint64 lastReplayedRevision = 1;
128 replayStoreTransaction.openDatabase().scan("lastReplayedRevision", [&lastReplayedRevision](const QByteArray &key, const QByteArray &value) -> bool {
129 lastReplayedRevision = value.toLongLong();
130 return false;
131 }, [](const Storage::Error &) {
132 });
133 const qint64 topRevision = Storage::maxRevision(mainStoreTransaction);
134
135 Trace() << "Changereplay from " << lastReplayedRevision << " to " << topRevision;
136 if (lastReplayedRevision <= topRevision) {
137 qint64 revision = lastReplayedRevision;
138 for (;revision <= topRevision; revision++) {
139 const auto uid = Storage::getUidFromRevision(mainStoreTransaction, revision);
140 const auto type = Storage::getTypeFromRevision(mainStoreTransaction, revision);
141 const auto key = Storage::assembleKey(uid, revision);
142 mainStoreTransaction.openDatabase(type + ".main").scan(key, [&lastReplayedRevision, type, this](const QByteArray &key, const QByteArray &value) -> bool {
143 mReplayFunction(type, key, value).exec();
144 //TODO make for loop async, and pass to async replay function together with type
145 Trace() << "Replaying " << key;
146 return false;
147 }, [key](const Storage::Error &) {
148 ErrorMsg() << "Failed to replay change " << key;
149 });
150 }
151 revision--;
152 replayStoreTransaction.openDatabase().write("lastReplayedRevision", QByteArray::number(revision));
153 replayStoreTransaction.commit();
154 Trace() << "Replayed until " << revision;
155 }
156 emit changesReplayed();
157 }
158
159private:
160 Sink::Storage mStorage;
161 Sink::Storage mChangeReplayStore;
162 ReplayFunction mReplayFunction;
163};
164
165KAsync::Job<void> processPipeline()
166{
167 mPipeline->startTransaction();
168 Trace() << "Cleaning up from " << mPipeline->cleanedUpRevision() + 1 << " to " << mLowerBoundRevision;
169 for (qint64 revision = mPipeline->cleanedUpRevision() + 1; revision <= mLowerBoundRevision; revision++) {
170 mPipeline->cleanupRevision(revision);
171 }
172 mPipeline->commit();
173
174 //Go through all message queues
175 auto it = QSharedPointer<QListIterator<MessageQueue*> >::create(mCommandQueues);
176 return KAsync::dowhile(
177 [it]() { return it->hasNext(); },
178 [it, this](KAsync::Future<void> &future) {
179 auto queue = it->next();
180 processQueue(queue).then<void>([&future]() {
181 Trace() << "Queue processed";
182 future.setFinished();
183 }).exec();
184 }
185 );
186}
187
diff --git a/formatting.txt b/formatting.txt
new file mode 100644
index 0000000..7ad5ab1
--- /dev/null
+++ b/formatting.txt
@@ -0,0 +1,7 @@
1Configuration: See .clang-format
2
3# Reformat
4clang-format -i common/*.{cpp,h}
5
6# Test
7clang-format formattest.cpp > formatted && vimdiff formattest.cpp formatted