2010年3月24日水曜日

MinGWでgdbmをビルドしてみた

flockとかfsyncがなくてダメな感じ。

systems.h
#include <io.h>
#include <windows.h>

#define UNLOCK_FILE(dbf) {                              \
    HANDLE h = (HANDLE)_get_osfhandle(dbf->desc);       \
    if (INVALID_HANDLE_VALUE != h) {                    \
      UnlockFile(h, 0, 0, (DWORD)-1, (DWORD)-1);        \
    }                                                   \
  }

#define READLOCK_FILE(dbf) {                                            \
    HANDLE h = (HANDLE)_get_osfhandle(dbf->desc);                       \
    if (INVALID_HANDLE_VALUE == h) {                                    \
      lock_val = -1;                                                    \
    } else {                                                            \
      OVERLAPPED over;                                                  \
      ZeroMemory(&over, sizeof(over));                                  \
      DWORD flags = LOCKFILE_FAIL_IMMEDIATELY;                          \
      if (!LockFileEx(h, flags, 0, (DWORD)-1, (DWORD)-1, &over)) {      \
        lock_val = -1;                                                  \
      } else {                                                          \
        lock_val = 0;                                                   \
      }                                                                 \
    }                                                                   \
  }

#define WRITELOCK_FILE(dbf) {                                           \
    HANDLE h = (HANDLE)_get_osfhandle(dbf->desc);                       \
    if (INVALID_HANDLE_VALUE == h) {                                    \
      lock_val = -1;                                                    \
    } else {                                                            \
      OVERLAPPED over;                                                  \
      ZeroMemory(&over, sizeof(over));                                  \
      DWORD flags = LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK; \
      if (!LockFileEx(h, flags, 0, (DWORD)-1, (DWORD)-1, &over)) {      \
        lock_val = -1;                                                  \
      } else {                                                          \
        lock_val = 0;                                                   \
      }                                                                 \
    }                                                                   \
  }

0 件のコメント:

コメントを投稿