1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-07-04 23:51:47 +02:00

Merge pull request #10678 from nix-windows/windows-substitution-goal

Start building the scheduler for Windows
This commit is contained in:
John Ericson 2024-05-27 17:47:29 -04:00 committed by GitHub
commit d0c7da131f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 285 additions and 94 deletions

View file

@ -14,6 +14,8 @@
namespace nix {
using namespace nix::windows;
std::string readFile(HANDLE handle)
{
LARGE_INTEGER li;

View file

@ -9,6 +9,8 @@
namespace nix {
using namespace nix::windows;
std::string getUserName()
{
// Get the required buffer size

View file

@ -0,0 +1,43 @@
#include "windows-async-pipe.hh"
#include "windows-error.hh"
namespace nix::windows {
void AsyncPipe::createAsyncPipe(HANDLE iocp)
{
// std::cerr << (format("-----AsyncPipe::createAsyncPipe(%x)") % iocp) << std::endl;
buffer.resize(0x1000);
memset(&overlapped, 0, sizeof(overlapped));
std::string pipeName = fmt("\\\\.\\pipe\\nix-%d-%p", GetCurrentProcessId(), (void *) this);
readSide = CreateNamedPipeA(
pipeName.c_str(), PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, PIPE_UNLIMITED_INSTANCES, 0, 0,
INFINITE, NULL);
if (!readSide)
throw WinError("CreateNamedPipeA(%s)", pipeName);
HANDLE hIocp = CreateIoCompletionPort(readSide.get(), iocp, (ULONG_PTR) (readSide.get()) ^ 0x5555, 0);
if (hIocp != iocp)
throw WinError("CreateIoCompletionPort(%x[%s], %x, ...) returned %x", readSide.get(), pipeName, iocp, hIocp);
if (!ConnectNamedPipe(readSide.get(), &overlapped) && GetLastError() != ERROR_IO_PENDING)
throw WinError("ConnectNamedPipe(%s)", pipeName);
SECURITY_ATTRIBUTES psa2 = {0};
psa2.nLength = sizeof(SECURITY_ATTRIBUTES);
psa2.bInheritHandle = TRUE;
writeSide = CreateFileA(pipeName.c_str(), GENERIC_WRITE, 0, &psa2, OPEN_EXISTING, 0, NULL);
if (!readSide)
throw WinError("CreateFileA(%s)", pipeName);
}
void AsyncPipe::close()
{
readSide.close();
writeSide.close();
}
}

View file

@ -0,0 +1,20 @@
#pragma once
///@file
#include "file-descriptor.hh"
namespace nix::windows {
class AsyncPipe
{
public:
AutoCloseFD writeSide, readSide;
OVERLAPPED overlapped;
DWORD got;
std::vector<unsigned char> buffer;
void createAsyncPipe(HANDLE iocp);
void close();
};
}

View file

@ -4,7 +4,7 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
namespace nix {
namespace nix::windows {
std::string WinError::renderError(DWORD lastError)
{

View file

@ -5,7 +5,7 @@
#include "error.hh"
namespace nix {
namespace nix::windows {
/**
* Windows Error type.