X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Ffiledescriptor.cpp;fp=src%2Ffiledescriptor.cpp;h=10dec70a5f60ef6627c1998830ab4576697b3512;hb=ef2bf51d04aaf01fa0cabdcaf905b23423067662;hp=0000000000000000000000000000000000000000;hpb=edc9b96a441194b571e8d55ec1603b5be0ea52eb;p=ric-plt%2Fsdl.git diff --git a/src/filedescriptor.cpp b/src/filedescriptor.cpp new file mode 100644 index 0000000..10dec70 --- /dev/null +++ b/src/filedescriptor.cpp @@ -0,0 +1,77 @@ +/* + Copyright (c) 2018-2019 Nokia. + + 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. +*/ + +#include "private/filedescriptor.hpp" +#include "private/system.hpp" + +using namespace shareddatalayer; + +namespace +{ + int moveFD(int& fd) + { + const int ret(fd); + fd = -1; + return ret; + } +} + +FileDescriptor::FileDescriptor(int fd) noexcept: + FileDescriptor(System::getSystem(), fd) +{ +} + +FileDescriptor::FileDescriptor(System& system, int fd) noexcept: + system(&system), + fd(fd) +{ +} + +FileDescriptor::FileDescriptor(FileDescriptor&& fd) noexcept: + system(fd.system), + fd(moveFD(fd.fd)), + atCloseCb(std::move(fd.atCloseCb)) +{ +} + +FileDescriptor& FileDescriptor::operator = (FileDescriptor&& fd) noexcept +{ + close(); + system = fd.system; + this->fd = moveFD(fd.fd); + atCloseCb = std::move(fd.atCloseCb); + return *this; +} + +FileDescriptor::~FileDescriptor() +{ + close(); +} + +void FileDescriptor::atClose(std::function atCloseCb) +{ + this->atCloseCb = atCloseCb; +} + +void FileDescriptor::close() +{ + if (fd < 0) + return; + if (atCloseCb) + atCloseCb(fd); + system->close(fd); + fd = -1; +}