aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mesonlib/win32.py
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2021-01-22 12:48:22 -0800
committerDaniel Mensinger <daniel@mensinger-ka.de>2021-01-23 12:48:29 +0100
commit23d3b98fc1ed3b774cc3838da89b2e8f0f91800b (patch)
tree692320a9563026dede9650a56e78fc935cb93c5f /mesonbuild/mesonlib/win32.py
parentadb1b2f3f6ad54b346348ec6e5b8d96f2f7ba0a6 (diff)
downloadmeson-23d3b98fc1ed3b774cc3838da89b2e8f0f91800b.zip
meson-23d3b98fc1ed3b774cc3838da89b2e8f0f91800b.tar.gz
meson-23d3b98fc1ed3b774cc3838da89b2e8f0f91800b.tar.bz2
split mesonlib into a package
Currently mesonlib does some import tricks to figure out whether it needs to use windows or posix specific functions. This is a little hacky, but works fine. However, the way the typing stubs are implemented for the msvcrt and fnctl modules will cause mypy to fail on the other platform, since the functions are not implemented. To aleviate this (and for slightly cleaner design), I've split mesonlib into a pacakge with three modules. A universal module contains all of the platform agnositc code, a win32 module contains window specific code, a posix module contains the posix specific code, and a platform module contains no-op implementations. Then the package's __init__ file imports all of the universal functions and all of the functions from the approriate platform module, or the no-op versions as fallbacks. This makes mypy happy, and avoids `if`ing all over the code to switch between the platform specific code.
Diffstat (limited to 'mesonbuild/mesonlib/win32.py')
-rw-r--r--mesonbuild/mesonlib/win32.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/mesonbuild/mesonlib/win32.py b/mesonbuild/mesonlib/win32.py
new file mode 100644
index 0000000..0919ef7
--- /dev/null
+++ b/mesonbuild/mesonlib/win32.py
@@ -0,0 +1,39 @@
+# SPDX-license-identifier: Apache-2.0
+# Copyright 2012-2021 The Meson development team
+# Copyright © 2021 Intel Corporation
+
+# 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.
+
+"""Windows specific implementations of mesonlib functionality."""
+
+import msvcrt
+import typing as T
+
+from .universal import MesonException
+from .platform import BuildDirLock as BuildDirLockBase
+
+__all__ = ['BuildDirLock']
+
+class BuildDirLock(BuildDirLockBase):
+
+ def __enter__(self) -> None:
+ self.lockfile = open(self.lockfilename, 'w')
+ try:
+ msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_NBLCK, 1)
+ except (BlockingIOError, PermissionError):
+ self.lockfile.close()
+ raise MesonException('Some other Meson process is already using this build directory. Exiting.')
+
+ def __exit__(self, *args: T.Any) -> None:
+ msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_UNLCK, 1)
+ self.lockfile.close()