1
1
Jeff Squyres 4ab17f019b Rename src -> ompi
This commit was SVN r6269.
2005-07-02 13:43:57 +00:00

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