00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "adio.h"
00010
00011 #ifdef ROMIO_NTFS
00012 int ADIOI_Set_lock(FDTYPE fd, int cmd, int type, ADIO_Offset offset, int whence,
00013 ADIO_Offset len)
00014 {
00015 int ret_val, error_code;
00016 OVERLAPPED Overlapped;
00017 DWORD dwFlags;
00018
00019 dwFlags = type;
00020
00021 Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
00022 #ifdef HAVE_INT64
00023 Overlapped.Offset = ( (DWORD) ( offset & (__int64) 0xFFFFFFFF ) );
00024 Overlapped.OffsetHigh = ( (DWORD) ( (offset >> 32) & (__int64) 0xFFFFFFFF ) );
00025
00026 if (cmd == ADIOI_LOCK_CMD)
00027 ret_val = LockFileEx(fd, dwFlags, 0,
00028 ( (DWORD) ( len & (__int64) 0xFFFFFFFF ) ),
00029 ( (DWORD) ( (len >> 32) & (__int64) 0xFFFFFFFF ) ),
00030 &Overlapped);
00031 else
00032 ret_val = UnlockFileEx(fd, 0,
00033 ( (DWORD) ( len & (__int64) 0xFFFFFFFF ) ),
00034 ( (DWORD) ( (len >> 32) & (__int64) 0xFFFFFFFF ) ),
00035 &Overlapped);
00036 #else
00037 Overlapped.Offset = offset;
00038 Overlapped.OffsetHigh = 0;
00039
00040 if (cmd == ADIOI_LOCK_CMD)
00041 ret_val = LockFileEx(fd, dwFlags, 0, len, 0, &Overlapped);
00042 else
00043 ret_val = UnlockFileEx(fd, 0, len, 0, &Overlapped);
00044 #endif
00045
00046 if (!ret_val) {
00047 FPRINTF(stderr, "File locking failed in ADIOI_Set_lock.\n");
00048 MPI_Abort(MPI_COMM_WORLD, 1);
00049 }
00050
00051 error_code = (ret_val) ? MPI_SUCCESS : MPI_ERR_UNKNOWN;
00052 return error_code;
00053 }
00054 #else
00055 int ADIOI_Set_lock(FDTYPE fd, int cmd, int type, ADIO_Offset offset, int whence,
00056 ADIO_Offset len)
00057 {
00058 int err, error_code;
00059 struct flock lock;
00060
00061 lock.l_type = type;
00062 lock.l_start = offset;
00063 lock.l_whence = whence;
00064 lock.l_len = len;
00065
00066 do {
00067 err = fcntl(fd, cmd, &lock);
00068 } while (err && (errno == EINTR));
00069
00070 if (err && (errno != EBADF)) {
00071 FPRINTF(stderr, "File locking failed in ADIOI_Set_lock. If the file system is NFS, you need to use NFS version 3 and mount the directory with the 'noac' option (no attribute caching).\n");
00072 MPI_Abort(MPI_COMM_WORLD, 1);
00073 }
00074
00075 error_code = (err == 0) ? MPI_SUCCESS : MPI_ERR_UNKNOWN;
00076 return error_code;
00077 }
00078 #endif
00079
00080 #if (defined(HFS) || defined(XFS))
00081 int ADIOI_Set_lock64(FDTYPE fd, int cmd, int type, ADIO_Offset offset, int whence,
00082 ADIO_Offset len)
00083 {
00084 int err, error_code;
00085 struct flock64 lock;
00086
00087 lock.l_type = type;
00088 lock.l_start = offset;
00089 lock.l_whence = whence;
00090 lock.l_len = len;
00091
00092 do {
00093 err = fcntl(fd, cmd, &lock);
00094 } while (err && (errno == EINTR));
00095
00096 if (err && (errno != EBADF)) {
00097 FPRINTF(stderr, "File locking failed in ADIOI_Set_lock64\n");
00098 MPI_Abort(MPI_COMM_WORLD, 1);
00099 }
00100
00101 error_code = (err == 0) ? MPI_SUCCESS : MPI_ERR_UNKNOWN;
00102 return error_code;
00103 }
00104 #endif