/** * Copyright 2019 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef DATASET_UTIL_SYSTEM_POOL_H_ #define DATASET_UTIL_SYSTEM_POOL_H_ #include #include #include #include #include #include "./securec.h" #include "dataset/util/allocator.h" #include "dataset/util/memory_pool.h" namespace mindspore { namespace dataset { // This class demonstrate how to implement a simple MemoryPool // for minddata/dataset using malloc/free/realloc. We need to // implement 4 virtual functions. Other MemoryPool // implementation, e.g., are BuddyArena and CircularPool. All // these MemoryPool can be used together with Allocator.h for // C++ STL containers. class SystemPool : public MemoryPool { public: ~SystemPool() override {} Status Allocate(size_t n, void **pp) override { return DeMalloc(n, pp, false); } void Deallocate(void *p) override { free(p); } Status Reallocate(void **p, size_t old_sz, size_t new_sz) override { if (old_sz >= new_sz) { // Do nothing if we shrink. return Status::OK(); } else { void *ptr = *p; void *q = nullptr; RETURN_IF_NOT_OK(DeMalloc(new_sz, &q, false)); errno_t err = memcpy_s(q, new_sz, ptr, old_sz); if (err) { free(q); RETURN_STATUS_UNEXPECTED(std::to_string(err)); } free(ptr); *p = q; return Status::OK(); } } uint64_t get_max_size() const override { return std::numeric_limits::max(); } int PercentFree() const override { return 100; } template static Allocator GetAllocator() { return Allocator(std::make_shared()); } }; } // namespace dataset } // namespace mindspore #endif // DATASET_UTIL_SYSTEM_POOL_H_