File indexing completed on 2024-04-21 04:01:28
0001 /* -*- C++ -*- 0002 This file implements the ResourceRestrictionPolicy class. 0003 0004 SPDX-FileCopyrightText: 2004-2013 Mirko Boehm <mirko@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 0008 $Id: Job.h 32 2005-08-17 08:38:01Z mirko $ 0009 */ 0010 0011 #include "resourcerestrictionpolicy.h" 0012 0013 #include <QList> 0014 #include <QMutex> 0015 0016 #include "debuggingaids.h" 0017 #include "managedjobpointer.h" 0018 0019 using namespace ThreadWeaver; 0020 0021 class Q_DECL_HIDDEN ResourceRestrictionPolicy::Private 0022 { 0023 public: 0024 Private(int theCap) 0025 : cap(theCap) 0026 { 0027 } 0028 QMutex *mutex() 0029 { 0030 return &mutex_; 0031 } 0032 0033 int cap; 0034 QList<JobPointer> customers; 0035 QMutex mutex_; 0036 }; 0037 0038 ResourceRestrictionPolicy::ResourceRestrictionPolicy(int cap) 0039 : QueuePolicy() 0040 , d(new Private(cap)) 0041 { 0042 } 0043 0044 ResourceRestrictionPolicy::~ResourceRestrictionPolicy() 0045 { 0046 delete d; 0047 } 0048 0049 void ResourceRestrictionPolicy::setCap(int cap) 0050 { 0051 QMutexLocker l(d->mutex()); 0052 d->cap = cap; 0053 } 0054 0055 int ResourceRestrictionPolicy::cap() const 0056 { 0057 QMutexLocker l(d->mutex()); 0058 return d->cap; 0059 } 0060 0061 bool ResourceRestrictionPolicy::canRun(JobPointer job) 0062 { 0063 QMutexLocker l(d->mutex()); 0064 if (d->customers.size() < d->cap) { 0065 d->customers.append(job); 0066 TWDEBUG(4, "ResourceRestrictionPolicy::canRun: job %p added, %i customers (cap %i).\n", (void *)job.data(), d->customers.count(), d->cap); 0067 return true; 0068 } else { 0069 return false; 0070 } 0071 } 0072 0073 void ResourceRestrictionPolicy::free(JobPointer job) 0074 { 0075 QMutexLocker l(d->mutex()); 0076 int position = d->customers.indexOf(job); 0077 0078 if (position != -1) { 0079 d->customers.removeAt(position); 0080 TWDEBUG(4, "ResourceRestrictionPolicy::free: job %p completed, %i customers (cap %i).\n", (void *)job.data(), d->customers.count(), d->cap); 0081 } 0082 } 0083 0084 void ResourceRestrictionPolicy::release(JobPointer job) 0085 { 0086 free(job); 0087 } 0088 0089 void ResourceRestrictionPolicy::destructed(JobInterface *job) 0090 { 0091 free(ManagedJobPointer<JobInterface>(job)); 0092 }