Add portability header for sys/file.h
authorChristopher Dykes <cdykes@fb.com>
Tue, 15 Mar 2016 20:23:20 +0000 (13:23 -0700)
committerFacebook Github Bot 0 <facebook-github-bot-0-bot@fb.com>
Tue, 15 Mar 2016 20:35:21 +0000 (13:35 -0700)
Summary: We don't have it on Windows :(

Reviewed By: yfeldblum

Differential Revision: D2978397

fb-gh-sync-id: 388bc450ce269559825ebfb78e3646533c2e1153
shipit-source-id: 388bc450ce269559825ebfb78e3646533c2e1153

folly/Makefile.am
folly/portability/SysFile.cpp [new file with mode: 0755]
folly/portability/SysFile.h [new file with mode: 0755]

index 904d70a331783aa00e2b11708a613d290041b052..746350bd180fac52421869cf82b6bca43d0e35a4 100644 (file)
@@ -274,6 +274,7 @@ nobase_follyinclude_HEADERS = \
        portability/Memory.h \
        portability/Strings.h \
        portability/Syscall.h \
+       portability/SysFile.h \
        portability/SysStat.h \
        portability/SysTime.h \
        portability/SysTypes.h \
@@ -407,6 +408,7 @@ libfolly_la_SOURCES = \
        MemoryMapping.cpp \
        portability/Environment.cpp \
        portability/Strings.cpp \
+       portability/SysFile.cpp \
        portability/SysStat.cpp \
        portability/SysTime.cpp \
        portability/Time.cpp \
diff --git a/folly/portability/SysFile.cpp b/folly/portability/SysFile.cpp
new file mode 100755 (executable)
index 0000000..71287e7
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * 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
diff --git a/folly/portability/SysFile.h b/folly/portability/SysFile.h
new file mode 100755 (executable)
index 0000000..096bfcc
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * 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