forked from huawei/mindspore2022
69 lines
2.1 KiB
C++
69 lines
2.1 KiB
C++
/**
|
|
* 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 <cstddef>
|
|
#include <cstdlib>
|
|
#include <limits>
|
|
#include <new>
|
|
#include "./securec.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<uint64_t>::max(); }
|
|
|
|
int PercentFree() const override { return 100; }
|
|
};
|
|
} // namespace dataset
|
|
} // namespace mindspore
|
|
|
|
#endif // DATASET_UTIL_SYSTEM_POOL_H_
|