ITS#7664 delete lockfile if there is no environment
authorHoward Chu <hyc@symas.com>
Tue, 13 Aug 2013 18:34:32 +0000 (11:34 -0700)
committerHoward Chu <hyc@symas.com>
Tue, 13 Aug 2013 18:34:32 +0000 (11:34 -0700)
libraries/liblmdb/mdb.c

index 6460173..ae66ff4 100644 (file)
 #define GET_PAGESIZE(x) {SYSTEM_INFO si; GetSystemInfo(&si); (x) = si.dwPageSize;}
 #define        close(fd)       (CloseHandle(fd) ? 0 : -1)
 #define        munmap(ptr,len) UnmapViewOfFile(ptr)
+#define        unlink(file)    DeleteFile(file)
 #ifdef PROCESS_QUERY_LIMITED_INFORMATION
 #define MDB_PROCESS_QUERY_LIMITED_INFORMATION PROCESS_QUERY_LIMITED_INFORMATION
 #else
@@ -3851,7 +3852,7 @@ fail:
 int
 mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode)
 {
-       int             oflags, rc, len, excl = -1;
+       int             oflags, rc, len, excl = -1, rmlock = 0;
        char *lpath, *dpath;
 
        if (env->me_fd!=INVALID_HANDLE_VALUE || (flags & ~(CHANGEABLE|CHANGELESS)))
@@ -3903,6 +3904,7 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
                goto leave;
 
 #ifdef _WIN32
+#define        MDB_NO_SUCH_FILE        ERROR_FILE_NOT_FOUND
        if (F_ISSET(flags, MDB_RDONLY)) {
                oflags = GENERIC_READ;
                len = OPEN_EXISTING;
@@ -3914,6 +3916,7 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
        env->me_fd = CreateFile(dpath, oflags, FILE_SHARE_READ|FILE_SHARE_WRITE,
                NULL, len, mode, NULL);
 #else
+#define        MDB_NO_SUCH_FILE        ENOENT
        if (F_ISSET(flags, MDB_RDONLY))
                oflags = O_RDONLY;
        else
@@ -3923,6 +3926,8 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
 #endif
        if (env->me_fd == INVALID_HANDLE_VALUE) {
                rc = ErrCode();
+               if (F_ISSET(flags, MDB_RDONLY) && rc == MDB_NO_SUCH_FILE) 
+                       rmlock = 1;
                goto leave;
        }
 
@@ -3954,6 +3959,8 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
 leave:
        if (rc) {
                mdb_env_close0(env, excl);
+               if (rmlock && excl)
+                       unlink(lpath);
        }
        free(lpath);
        return rc;