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 }