This source file includes following definitions.
- mca_fbtl_posix_lock
- mca_fbtl_posix_unlock
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include "ompi_config.h"
23 #include "fbtl_posix.h"
24
25 #include "mpi.h"
26 #include <unistd.h>
27 #include <sys/uio.h>
28 #include <errno.h>
29 #include <limits.h>
30 #include "ompi/constants.h"
31 #include "ompi/mca/fbtl/fbtl.h"
32
33 #define MAX_ERRCOUNT 100
34
35
36
37
38
39
40
41
42
43
44
45
46 int mca_fbtl_posix_lock ( struct flock *lock, ompio_file_t *fh, int op,
47 OMPI_MPI_OFFSET_TYPE offset, off_t len, int flags)
48 {
49 off_t lmod, bmod;
50 int ret, err_count;
51
52 lock->l_type = op;
53 lock->l_whence = SEEK_SET;
54 lock->l_start =-1;
55 lock->l_len =-1;
56 if ( 0 == len ) {
57 return 0;
58 }
59
60 if ( fh->f_flags & OMPIO_LOCK_ENTIRE_FILE ) {
61 lock->l_start = (off_t) 0;
62 lock->l_len = 0;
63 }
64 else {
65 if ( (fh->f_flags & OMPIO_LOCK_NEVER) ||
66 (fh->f_flags & OMPIO_LOCK_NOT_THIS_OP )){
67
68
69
70
71
72
73
74
75
76
77
78
79 return 0;
80 }
81 if ( flags == OMPIO_LOCK_ENTIRE_REGION ) {
82 lock->l_start = (off_t) offset;
83 lock->l_len = len;
84 }
85 else {
86
87
88
89
90
91
92
93 bmod = offset % fh->f_fs_block_size;
94 if ( bmod ) {
95 lock->l_start = (off_t) offset;
96 lock->l_len = bmod;
97 }
98 lmod = (offset+len)%fh->f_fs_block_size;
99 if ( lmod ) {
100 if ( !bmod ) {
101 lock->l_start = (offset+len-lmod );
102 lock->l_len = lmod;
103 }
104 else {
105 lock->l_len = len;
106 }
107 }
108 if ( -1 == lock->l_start && -1 == lock->l_len ) {
109
110 return 0;
111 }
112 }
113 }
114
115
116 #ifdef OMPIO_DEBUG
117 printf("%d: acquiring lock for offset %ld length %ld requested offset %ld request len %ld \n",
118 fh->f_rank, lock->l_start, lock->l_len, offset, len);
119 #endif
120 errno=0;
121 err_count=0;
122 do {
123 ret = fcntl ( fh->fd, F_SETLKW, lock);
124 if ( ret ) {
125 #ifdef OMPIO_DEBUG
126 printf("[%d] ret = %d errno=%d %s\n", fh->f_rank, ret, errno, strerror(errno) );
127 #endif
128 err_count++;
129 }
130 } while ( ret && ((errno == EINTR) || ((errno == EINPROGRESS) && err_count < MAX_ERRCOUNT )));
131
132
133 return ret;
134 }
135
136 void mca_fbtl_posix_unlock ( struct flock *lock, ompio_file_t *fh )
137 {
138 if ( -1 == lock->l_start && -1 == lock->l_len ) {
139 return;
140 }
141
142 lock->l_type = F_UNLCK;
143 #ifdef OMPIO_DEBUG
144 printf("%d: releasing lock for offset %ld length %ld\n", fh->f_rank, lock->l_start, lock->l_len);
145 #endif
146 fcntl ( fh->fd, F_SETLK, lock);
147 lock->l_start = -1;
148 lock->l_len = -1;
149
150 return;
151 }