Coverage Report

Created: 2026-07-30 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Source/cmFileLockUnix.cxx
Line
Count
Source
1
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2
   file LICENSE.rst or https://cmake.org/licensing for details.  */
3
#include <cerrno> // errno
4
#include <cstdio> // SEEK_SET
5
6
#include <fcntl.h>
7
#include <unistd.h>
8
9
#include "cmFileLock.h"
10
#include "cmSystemTools.h"
11
12
141
cmFileLock::cmFileLock() = default;
13
14
cmFileLockResult cmFileLock::Release()
15
141
{
16
141
  if (this->Filename.empty()) {
17
79
    return cmFileLockResult::MakeOk();
18
79
  }
19
62
  int const lockResult = this->LockFile(F_SETLK, F_UNLCK);
20
21
62
  this->Filename = "";
22
23
62
  ::close(this->File);
24
62
  this->File = -1;
25
26
62
  if (lockResult == 0) {
27
62
    return cmFileLockResult::MakeOk();
28
62
  }
29
0
  return cmFileLockResult::MakeSystem();
30
62
}
31
32
cmFileLockResult cmFileLock::OpenFile()
33
141
{
34
141
  this->File = ::open(this->Filename.c_str(), O_RDWR);
35
141
  if (this->File == -1) {
36
79
    return cmFileLockResult::MakeSystem();
37
79
  }
38
62
  return cmFileLockResult::MakeOk();
39
141
}
40
41
cmFileLockResult cmFileLock::LockWithoutTimeout()
42
0
{
43
0
  if (this->LockFile(F_SETLKW, F_WRLCK) == -1) {
44
0
    return cmFileLockResult::MakeSystem();
45
0
  }
46
0
  return cmFileLockResult::MakeOk();
47
0
}
48
49
cmFileLockResult cmFileLock::LockWithTimeout(unsigned long seconds)
50
62
{
51
62
  while (true) {
52
62
    if (this->LockFile(F_SETLK, F_WRLCK) == -1) {
53
0
      if (errno != EACCES && errno != EAGAIN) {
54
0
        return cmFileLockResult::MakeSystem();
55
0
      }
56
62
    } else {
57
62
      return cmFileLockResult::MakeOk();
58
62
    }
59
0
    if (seconds == 0) {
60
0
      return cmFileLockResult::MakeTimeout();
61
0
    }
62
0
    --seconds;
63
0
    cmSystemTools::Delay(1000);
64
0
  }
65
62
}
66
67
int cmFileLock::LockFile(int cmd, int type) const
68
124
{
69
124
  struct ::flock lock;
70
124
  lock.l_start = 0;
71
124
  lock.l_len = 0;                         // lock all bytes
72
124
  lock.l_pid = 0;                         // unused (for F_GETLK only)
73
124
  lock.l_type = static_cast<short>(type); // exclusive lock
74
  lock.l_whence = SEEK_SET;
75
124
  return ::fcntl(this->File, cmd, &lock);
76
124
}