File indexing completed on 2024-04-28 15:34:47
0001 /* -*- C++ -*- 0002 Helper class for unit tests. 0003 0004 SPDX-FileCopyrightText: 2005-2013 Mirko Boehm <mirko@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #ifndef APPENDCHARACTER_JOB 0010 #define APPENDCHARACTER_JOB 0011 0012 #include <QMutex> 0013 #include <QObject> 0014 0015 #include <ThreadWeaver/DebuggingAids> 0016 #include <ThreadWeaver/Job> 0017 #include <ThreadWeaver/JobPointer> 0018 0019 // define in test binary: 0020 0021 extern QMutex s_GlobalMutex; 0022 0023 class AppendCharacterJob : public ThreadWeaver::Job 0024 { 0025 public: 0026 AppendCharacterJob(QChar c = QChar(), QString *stringref = nullptr) 0027 : ThreadWeaver::Job() 0028 { 0029 setValues(c, stringref); 0030 } 0031 0032 void setValues(QChar c, QString *stringref) 0033 { 0034 m_c = c; 0035 m_stringref = stringref; 0036 } 0037 0038 void run(ThreadWeaver::JobPointer, ThreadWeaver::Thread *) override 0039 { 0040 QMutexLocker locker(&s_GlobalMutex); 0041 m_stringref->append(m_c); 0042 using namespace ThreadWeaver; 0043 TWDEBUG(3, "AppendCharacterJob::run: %c appended, result is %s.\n", m_c.toLatin1(), qPrintable(*m_stringref)); 0044 } 0045 0046 QChar character() const 0047 { 0048 return m_c; 0049 } 0050 0051 protected: 0052 QString *stringRef() const 0053 { 0054 return m_stringref; 0055 } 0056 0057 private: 0058 QChar m_c; 0059 QString *m_stringref; 0060 }; 0061 0062 class FailingAppendCharacterJob : public AppendCharacterJob 0063 { 0064 public: 0065 FailingAppendCharacterJob(QChar c = QChar(), QString *stringref = nullptr) 0066 : AppendCharacterJob(c, stringref) 0067 { 0068 } 0069 0070 void run(ThreadWeaver::JobPointer job, ThreadWeaver::Thread *thread) override 0071 { 0072 AppendCharacterJob::run(job, thread); 0073 setStatus(Job::Status_Failed); 0074 } 0075 }; 0076 0077 class BusyJob : public ThreadWeaver::Job 0078 { 0079 public: 0080 BusyJob() 0081 : ThreadWeaver::Job() 0082 { 0083 using namespace ThreadWeaver; 0084 TWDEBUG(3, "BusyJob ctor\n"); 0085 } 0086 0087 ~BusyJob() override 0088 { 0089 using namespace ThreadWeaver; 0090 TWDEBUG(3, "~BusyJob\n"); 0091 } 0092 0093 void run(ThreadWeaver::JobPointer, ThreadWeaver::Thread *) override 0094 { 0095 using namespace ThreadWeaver; 0096 TWDEBUG(3, "BusyJob: entered run()\n"); 0097 for (int i = 0; i < 100; ++i) { 0098 int k = (i << 3) + (i >> 4); 0099 Q_UNUSED(k); 0100 } 0101 } 0102 }; 0103 0104 #endif