1# SPDX-license-identifier: Apache-2.0
2# Copyright 2012-2021 The Meson development team
3# Copyright © 2021 Intel Corporation
4
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8
9#     http://www.apache.org/licenses/LICENSE-2.0
10
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17"""Windows specific implementations of mesonlib functionality."""
18
19import msvcrt
20import typing as T
21
22from .universal import MesonException
23from .platform import BuildDirLock as BuildDirLockBase
24
25__all__ = ['BuildDirLock']
26
27class BuildDirLock(BuildDirLockBase):
28
29    def __enter__(self) -> None:
30        self.lockfile = open(self.lockfilename, 'w', encoding='utf-8')
31        try:
32            msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_NBLCK, 1)
33        except (BlockingIOError, PermissionError):
34            self.lockfile.close()
35            raise MesonException('Some other Meson process is already using this build directory. Exiting.')
36
37    def __exit__(self, *args: T.Any) -> None:
38        msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_UNLCK, 1)
39        self.lockfile.close()
40