Commit 30c8cd93 authored by Christopher Dykes's avatar Christopher Dykes Committed by Facebook Github Bot 0

Add portability header for sys/file.h

Summary: We don't have it on Windows :(

Reviewed By: yfeldblum

Differential Revision: D2978397

fb-gh-sync-id: 388bc450ce269559825ebfb78e3646533c2e1153
shipit-source-id: 388bc450ce269559825ebfb78e3646533c2e1153
parent 8c3d9fba
...@@ -274,6 +274,7 @@ nobase_follyinclude_HEADERS = \ ...@@ -274,6 +274,7 @@ nobase_follyinclude_HEADERS = \
portability/Memory.h \ portability/Memory.h \
portability/Strings.h \ portability/Strings.h \
portability/Syscall.h \ portability/Syscall.h \
portability/SysFile.h \
portability/SysStat.h \ portability/SysStat.h \
portability/SysTime.h \ portability/SysTime.h \
portability/SysTypes.h \ portability/SysTypes.h \
...@@ -407,6 +408,7 @@ libfolly_la_SOURCES = \ ...@@ -407,6 +408,7 @@ libfolly_la_SOURCES = \
MemoryMapping.cpp \ MemoryMapping.cpp \
portability/Environment.cpp \ portability/Environment.cpp \
portability/Strings.cpp \ portability/Strings.cpp \
portability/SysFile.cpp \
portability/SysStat.cpp \ portability/SysStat.cpp \
portability/SysTime.cpp \ portability/SysTime.cpp \
portability/Time.cpp \ portability/Time.cpp \
......
/*
* Copyright 2016 Facebook, Inc.
*
* 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 <folly/portability/SysFile.h>
#ifdef _WIN32
#include <limits>
#include <folly/portability/Windows.h>
extern "C" int flock(int fd, int operation) {
HANDLE h = (HANDLE)_get_osfhandle(fd);
if (h == INVALID_HANDLE_VALUE) {
return -1;
}
constexpr DWORD kMaxDWORD = std::numeric_limits<DWORD>::max();
if (operation & LOCK_UN) {
if (!UnlockFile(h, 0, 0, kMaxDWORD, kMaxDWORD)) {
return -1;
}
} else {
int flags = 0
| (operation & LOCK_NB ? LOCKFILE_FAIL_IMMEDIATELY : 0)
| (operation & LOCK_EX ? LOCKFILE_EXCLUSIVE_LOCK : 0)
;
OVERLAPPED ov = {};
if (!LockFileEx(h, flags, 0, kMaxDWORD, kMaxDWORD, &ov)) {
return -1;
}
}
return 0;
}
#endif
/*
* Copyright 2016 Facebook, Inc.
*
* 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.
*/
#pragma once
#ifndef _WIN32
#include <sys/file.h>
#else
#define LOCK_SH 1
#define LOCK_EX 2
#define LOCK_NB 4
#define LOCK_UN 8
extern "C" int flock(int fd, int operation);
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment