X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2Fengine%2FPlayGround.hxx;h=d4cf0e7cca7324291e804101b0160caa4ef32eae;hb=2f88d763f4ce77571baa5f39c25223c002781ea5;hp=964978d2b4d30f19c0866b45fa2e42abe3c2d31e;hpb=cd29942ef0fd85c0f971e7f38a9077c3ed762e17;p=modules%2Fyacs.git diff --git a/src/engine/PlayGround.hxx b/src/engine/PlayGround.hxx index 964978d2b..d4cf0e7cc 100644 --- a/src/engine/PlayGround.hxx +++ b/src/engine/PlayGround.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2006-2017 CEA/DEN, EDF R&D +// Copyright (C) 2006-2020 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -27,22 +27,60 @@ #include #include +#include #include namespace YACS { namespace ENGINE { - class PartDefinition; + class PartDefinition; + + class YACSLIBENGINE_EXPORT Resource + { + public: + Resource(const std::string& name, int nbCores):_name(name),_nbCores(nbCores),_occupied(_nbCores,false) { } + Resource(const std::pair& p):_name(p.first),_nbCores(p.second),_occupied(_nbCores,false) { } + std::pair toPair() const { return {_name,_nbCores}; } + int nbCores() const { return _nbCores; } + std::string name() const { return _name; } + std::size_t getNumberOfFreePlace(int nbCoresPerCont) const; + std::vector allocateFor(std::size_t& nbOfPlacesToTake, int nbCoresPerCont) const; + void release(std::size_t workerId, int nbCoresPerCont) const; + std::size_t getNumberOfWorkers(int nbCoresPerCont) const; + void printSelf(std::ostream& oss) const; + private: + std::string _name; + int _nbCores; + mutable std::vector _occupied; + }; + + + class ResourceIterator : public std::iterator< + std::input_iterator_tag, // iterator_category + Resource, // value_type + long, // difference_type + const Resource*, // pointer + std::pair > // reference + { + const std::vector< Resource > *_vec; + std::size_t _num; + public: + explicit ResourceIterator(const std::vector< Resource > *vec, const std::size_t num) : _vec(vec),_num(num) { } + ResourceIterator& operator++() { _num++; return *this; } + bool operator==(ResourceIterator other) const { return _num == other._num; } + bool operator!=(ResourceIterator other) const { return !(*this == other); } + reference operator*() const { return (*_vec)[_num].toPair(); } + }; class YACSLIBENGINE_EXPORT PlayGround : public RefCounter { public: - PlayGround(const std::vector< std::pair >& defOfRes):_data(defOfRes) { checkCoherentInfo(); } + PlayGround(const std::vector< std::pair >& defOfRes):_data(defOfRes.begin(),defOfRes.end()) { checkCoherentInfo(); } PlayGround() { } std::string printSelf() const; void loadFromKernelCatalog(); - std::vector< std::pair > getData() const { return _data; } + std::vector< std::pair > getData() const { return std::vector< std::pair >(ResourceIterator(&_data,0),ResourceIterator(&_data,_data.size())); } void setData(const std::vector< std::pair >& defOfRes); int getNumberOfCoresAvailable() const; int getMaxNumberOfContainersCanBeHostedWithoutOverlap(int nbCoresPerCont) const; @@ -56,6 +94,12 @@ namespace YACS std::vector getWorkerIdsFullyFetchedBy(int nbCoresPerComp, const std::vector& coreFlags) const; static std::vector BuildVectOfIdsFromVecBool(const std::vector& v); static std::vector GetIdsMatching(const std::vector& bigArr, const std::vector& pat); + public:// critical section part + std::size_t getNumberOfFreePlace(int nbCoresPerCont) const; + std::vector allocateFor(std::size_t nbOfPlacesToTake, int nbCoresPerCont) const; + void release(std::size_t workerId, int nbCoresPerCont) const; + std::mutex& getLocker() const { return _locker; } + void printMe() const; private: std::vector< std::pair > bigToTiny(const std::vector< std::pair > &weights, std::map &saveOrder) const; std::vector< std::vector > backToOriginalOrder(const std::vector< std::vector > &disorderVec, const std::map &saveOrder) const; @@ -67,7 +111,8 @@ namespace YACS private: ~PlayGround(); private: - std::vector< std::pair > _data; + mutable std::mutex _locker; + std::vector< Resource > _data; }; class YACSLIBENGINE_EXPORT PartDefinition : public RefCounter