v2 / vlib / os / filelock / filelock_helpers.h
63 lines · 54 sloc · 1.81 KB · 3914749f5694a7f1f938d07e303a8be61e227e94
Raw
1#ifndef V_OS_FILELOCK_HELPERS_H
2#define V_OS_FILELOCK_HELPERS_H
3
4#include <string.h>
5
6#ifdef _WIN32
7#include <windows.h>
8
9static int v_filelock_lock(HANDLE handle, int exclusive, int immediate,
10 unsigned long long start, unsigned long long len) {
11 OVERLAPPED overlap;
12 memset(&overlap, 0, sizeof(overlap));
13 overlap.Offset = (DWORD)(start & 0xffffffffULL);
14 overlap.OffsetHigh = (DWORD)(start >> 32);
15 DWORD flags = immediate ? LOCKFILE_FAIL_IMMEDIATELY : 0;
16 if (exclusive) {
17 flags |= LOCKFILE_EXCLUSIVE_LOCK;
18 }
19 DWORD low = len == 0 ? MAXDWORD : (DWORD)(len & 0xffffffffULL);
20 DWORD high = len == 0 ? MAXDWORD : (DWORD)(len >> 32);
21 return LockFileEx(handle, flags, 0, low, high, &overlap) ? 0 : -1;
22}
23
24static int v_filelock_unlock(HANDLE handle, unsigned long long start,
25 unsigned long long len) {
26 OVERLAPPED overlap;
27 memset(&overlap, 0, sizeof(overlap));
28 overlap.Offset = (DWORD)(start & 0xffffffffULL);
29 overlap.OffsetHigh = (DWORD)(start >> 32);
30 DWORD low = len == 0 ? MAXDWORD : (DWORD)(len & 0xffffffffULL);
31 DWORD high = len == 0 ? MAXDWORD : (DWORD)(len >> 32);
32 return UnlockFileEx(handle, 0, low, high, &overlap) ? 0 : -1;
33}
34
35#else
36#include <fcntl.h>
37#include <unistd.h>
38
39static int v_filelock_lock(int fd, int exclusive, int immediate,
40 unsigned long long start, unsigned long long len) {
41 struct flock fl;
42 memset(&fl, 0, sizeof(fl));
43 fl.l_type = exclusive ? F_WRLCK : F_RDLCK;
44 fl.l_whence = SEEK_SET;
45 fl.l_start = (off_t)start;
46 fl.l_len = len == 0 ? 0 : (off_t)len;
47 return fcntl(fd, immediate ? F_SETLK : F_SETLKW, &fl);
48}
49
50static int v_filelock_unlock(int fd, unsigned long long start,
51 unsigned long long len) {
52 struct flock fl;
53 memset(&fl, 0, sizeof(fl));
54 fl.l_type = F_UNLCK;
55 fl.l_whence = SEEK_SET;
56 fl.l_start = (off_t)start;
57 fl.l_len = len == 0 ? 0 : (off_t)len;
58 return fcntl(fd, F_SETLK, &fl);
59}
60
61#endif
62
63#endif
64