/* * * Copyright (c) 2008 The Apache Software Foundation * * 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 "qpid/sys/LockFile.h" #include "qpid/sys/windows/check.h" #include namespace qpid { namespace sys { class LockFilePrivate { friend class LockFile; HANDLE fd; public: LockFilePrivate(HANDLE f) : fd(f) {} }; LockFile::LockFile(const std::string& path_, bool create) : path(path_), created(create) { HANDLE h = ::CreateFile(path.c_str(), create ? (GENERIC_READ|GENERIC_WRITE) : GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 0, /* Default security */ create ? OPEN_ALWAYS : OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, /* Delete file when closed */ NULL); if (h == INVALID_HANDLE_VALUE) throw qpid::Exception(path + ": " + qpid::sys::strError(GetLastError())); // Lock up to 4Gb if (!::LockFile(h, 0, 0, 0xffffffff, 0)) throw qpid::Exception(path + ": " + qpid::sys::strError(GetLastError())); impl.reset(new LockFilePrivate(h)); } LockFile::~LockFile() { if (impl) { if (impl->fd != INVALID_HANDLE_VALUE) { ::UnlockFile(impl->fd, 0, 0, 0xffffffff, 0); ::CloseHandle(impl->fd); } } } }} /* namespace qpid::sys */