[PATCH 2 of 2] Reorder rename operations to minimise risk of leaving repository in unknown state

Adrian Buehlmann adrian at cadifra.com
Sat Oct 3 07:08:53 CDT 2009


On 03.10.2009 13:57, Adrian Buehlmann wrote:
> On 02.10.2009 17:44, Steve Borho wrote:
>> It should be possible to prove the efficacy of the patch, one way or the
>> other, with two interactive Python sessions on Windows.  I can, but probably
>> can't get to it for a couple of days.
> 
> os.unlink fails if the file is held open, for example
> with a python
> 
>   f = open(tempname)
> 
> If I open the temporary with my
> http://bitbucket.org/abuehl/opentest/src/tip/opentest.cpp
> 
> unlink succeeds.
> 
> So it all depends on what kind of 'open' the virus scanner is
> doing.

Bitbucket is down, so I'll paste it here:


// opentest.cpp - testprogram to hold a file open on Windows
//
// Copyright 2009 Adrian Buehlmann <adrian at cadifra.com>
//
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2, incorporated herein by reference.

#include <stdio.h>
#include <iostream>

#include "Windows.h"
#include <io.h>
#include "FCNTL.H"

void test(const char* name)
{
    HANDLE fh = ::CreateFileA(
      name, GENERIC_READ,
      FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
      0, OPEN_EXISTING, 0, 0
    );

    if (fh == INVALID_HANDLE_VALUE)
    {
        std::cout << "can't open " << name << std::endl;
        return;
    }

    std::cout << "opened " << name << std::endl;
    std::cout << "(hit <return> to stop)" << std::endl;

    int fd = ::_open_osfhandle ((intptr_t)fh, _O_RDONLY);
    if (fd == -1)
    {
        std::cout << "_open_osfhandle failed" << std::endl;
    }

    FILE* f = _fdopen(fd, "r");
    if (f == 0)
    {
        std::cout << "_fdopen failed" << std::endl;
    }

    getchar();
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "filename parameter missing!" << std::endl;
        std::cout << "usage: " << argv[0] << " <filename>" << std::endl;
        return 1;
    }

    test(argv[1]);
    return 0;
}


More information about the Mercurial-devel mailing list