105 строки
2.7 KiB
C
105 строки
2.7 KiB
C
![]() |
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||
|
/*
|
||
|
* $Id: lock.c,v 1.9 2002/10/24 17:01:14 gropp Exp $
|
||
|
*
|
||
|
* Copyright (C) 1997 University of Chicago.
|
||
|
* See COPYRIGHT notice in top-level directory.
|
||
|
*/
|
||
|
|
||
|
#include "adio.h"
|
||
|
|
||
|
#ifdef ROMIO_NTFS
|
||
|
int ADIOI_Set_lock(FDTYPE fd, int cmd, int type, ADIO_Offset offset, int whence,
|
||
|
ADIO_Offset len)
|
||
|
{
|
||
|
int ret_val, error_code;
|
||
|
OVERLAPPED Overlapped;
|
||
|
DWORD dwFlags;
|
||
|
|
||
|
dwFlags = type;
|
||
|
|
||
|
Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||
|
#ifdef HAVE_INT64
|
||
|
Overlapped.Offset = ( (DWORD) ( offset & (__int64) 0xFFFFFFFF ) );
|
||
|
Overlapped.OffsetHigh = ( (DWORD) ( (offset >> 32) & (__int64) 0xFFFFFFFF ) );
|
||
|
|
||
|
if (cmd == ADIOI_LOCK_CMD)
|
||
|
ret_val = LockFileEx(fd, dwFlags, 0,
|
||
|
( (DWORD) ( len & (__int64) 0xFFFFFFFF ) ),
|
||
|
( (DWORD) ( (len >> 32) & (__int64) 0xFFFFFFFF ) ),
|
||
|
&Overlapped);
|
||
|
else
|
||
|
ret_val = UnlockFileEx(fd, 0,
|
||
|
( (DWORD) ( len & (__int64) 0xFFFFFFFF ) ),
|
||
|
( (DWORD) ( (len >> 32) & (__int64) 0xFFFFFFFF ) ),
|
||
|
&Overlapped);
|
||
|
#else
|
||
|
Overlapped.Offset = offset;
|
||
|
Overlapped.OffsetHigh = 0;
|
||
|
|
||
|
if (cmd == ADIOI_LOCK_CMD)
|
||
|
ret_val = LockFileEx(fd, dwFlags, 0, len, 0, &Overlapped);
|
||
|
else
|
||
|
ret_val = UnlockFileEx(fd, 0, len, 0, &Overlapped);
|
||
|
#endif
|
||
|
|
||
|
if (!ret_val) {
|
||
|
FPRINTF(stderr, "File locking failed in ADIOI_Set_lock.\n");
|
||
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||
|
}
|
||
|
|
||
|
error_code = (ret_val) ? MPI_SUCCESS : MPI_ERR_UNKNOWN;
|
||
|
return error_code;
|
||
|
}
|
||
|
#else
|
||
|
int ADIOI_Set_lock(FDTYPE fd, int cmd, int type, ADIO_Offset offset, int whence,
|
||
|
ADIO_Offset len)
|
||
|
{
|
||
|
int err, error_code;
|
||
|
struct flock lock;
|
||
|
|
||
|
lock.l_type = type;
|
||
|
lock.l_start = offset;
|
||
|
lock.l_whence = whence;
|
||
|
lock.l_len = len;
|
||
|
|
||
|
do {
|
||
|
err = fcntl(fd, cmd, &lock);
|
||
|
} while (err && (errno == EINTR));
|
||
|
|
||
|
if (err && (errno != EBADF)) {
|
||
|
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");
|
||
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||
|
}
|
||
|
|
||
|
error_code = (err == 0) ? MPI_SUCCESS : MPI_ERR_UNKNOWN;
|
||
|
return error_code;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if (defined(HFS) || defined(XFS))
|
||
|
int ADIOI_Set_lock64(FDTYPE fd, int cmd, int type, ADIO_Offset offset, int whence,
|
||
|
ADIO_Offset len)
|
||
|
{
|
||
|
int err, error_code;
|
||
|
struct flock64 lock;
|
||
|
|
||
|
lock.l_type = type;
|
||
|
lock.l_start = offset;
|
||
|
lock.l_whence = whence;
|
||
|
lock.l_len = len;
|
||
|
|
||
|
do {
|
||
|
err = fcntl(fd, cmd, &lock);
|
||
|
} while (err && (errno == EINTR));
|
||
|
|
||
|
if (err && (errno != EBADF)) {
|
||
|
FPRINTF(stderr, "File locking failed in ADIOI_Set_lock64\n");
|
||
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||
|
}
|
||
|
|
||
|
error_code = (err == 0) ? MPI_SUCCESS : MPI_ERR_UNKNOWN;
|
||
|
return error_code;
|
||
|
}
|
||
|
#endif
|