@@ -144,34 +144,38 @@ bool mca_fbtl_posix_progress ( mca_ompio_request_t *req)
144
144
data -> aio_req_status [i ] = EINPROGRESS ;
145
145
start_offset = data -> aio_reqs [i ].aio_offset ;
146
146
total_length = data -> aio_reqs [i ].aio_nbytes ;
147
+ /* release previous lock */
148
+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
149
+
147
150
if ( data -> aio_req_type == FBTL_POSIX_WRITE ) {
148
- ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_WRLCK , start_offset , total_length , OMPIO_LOCK_ENTIRE_REGION );
151
+ ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_WRLCK , start_offset , total_length ,
152
+ OMPIO_LOCK_ENTIRE_REGION , & data -> aio_lock_counter );
149
153
if ( 0 < ret_code ) {
150
154
opal_output (1 , "mca_fbtl_posix_progress: error in mca_fbtl_posix_lock() %d" , ret_code );
151
155
/* Just in case some part of the lock actually succeeded. */
152
- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
156
+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
153
157
return OMPI_ERROR ;
154
158
}
155
159
if (-1 == aio_write (& data -> aio_reqs [i ])) {
156
160
opal_output (1 , "mca_fbtl_posix_progress: error in aio_write()" );
157
- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
161
+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
158
162
return OMPI_ERROR ;
159
163
}
160
164
}
161
165
else if ( data -> aio_req_type == FBTL_POSIX_READ ) {
162
- ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_RDLCK , start_offset , total_length , OMPIO_LOCK_ENTIRE_REGION );
166
+ ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_RDLCK , start_offset , total_length ,
167
+ OMPIO_LOCK_ENTIRE_REGION , & data -> aio_lock_counter );
163
168
if ( 0 < ret_code ) {
164
169
opal_output (1 , "mca_fbtl_posix_progress: error in mca_fbtl_posix_lock() %d" , ret_code );
165
170
/* Just in case some part of the lock actually succeeded. */
166
- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
171
+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
167
172
return OMPI_ERROR ;
168
173
}
169
174
if (-1 == aio_read (& data -> aio_reqs [i ])) {
170
175
opal_output (1 , "mca_fbtl_posix_progress: error in aio_read()" );
171
- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
176
+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
172
177
return OMPI_ERROR ;
173
178
}
174
- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
175
179
}
176
180
}
177
181
else {
@@ -199,10 +203,9 @@ bool mca_fbtl_posix_progress ( mca_ompio_request_t *req)
199
203
#if 0
200
204
printf ("lcount=%d open_reqs=%d\n" , lcount , data -> aio_open_reqs );
201
205
#endif
202
-
203
206
if ( (lcount == data -> aio_req_chunks ) && (0 != data -> aio_open_reqs )) {
204
207
/* release the lock of the previous operations */
205
- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
208
+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
206
209
207
210
/* post the next batch of operations */
208
211
data -> aio_first_active_req = data -> aio_last_active_req ;
@@ -218,30 +221,32 @@ bool mca_fbtl_posix_progress ( mca_ompio_request_t *req)
218
221
total_length = (end_offset - start_offset );
219
222
220
223
if ( FBTL_POSIX_READ == data -> aio_req_type ) {
221
- ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_RDLCK , start_offset , total_length , OMPIO_LOCK_ENTIRE_REGION );
224
+ ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_RDLCK , start_offset , total_length ,
225
+ OMPIO_LOCK_ENTIRE_REGION , & data -> aio_lock_counter );
222
226
}
223
227
else if ( FBTL_POSIX_WRITE == data -> aio_req_type ) {
224
- ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_WRLCK , start_offset , total_length , OMPIO_LOCK_ENTIRE_REGION );
228
+ ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_WRLCK , start_offset , total_length ,
229
+ OMPIO_LOCK_ENTIRE_REGION , & data -> aio_lock_counter );
225
230
}
226
231
if ( 0 < ret_code ) {
227
232
opal_output (1 , "mca_fbtl_posix_progress: error in mca_fbtl_posix_lock() %d" , ret_code );
228
233
/* Just in case some part of the lock actually succeeded. */
229
- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
234
+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
230
235
return OMPI_ERROR ;
231
236
}
232
237
233
238
for ( i = data -> aio_first_active_req ; i < data -> aio_last_active_req ; i ++ ) {
234
239
if ( FBTL_POSIX_READ == data -> aio_req_type ) {
235
240
if (-1 == aio_read (& data -> aio_reqs [i ])) {
236
241
opal_output (1 , "mca_fbtl_posix_progress: error in aio_read()" );
237
- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
242
+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
238
243
return OMPI_ERROR ;
239
244
}
240
245
}
241
246
else if ( FBTL_POSIX_WRITE == data -> aio_req_type ) {
242
247
if (-1 == aio_write (& data -> aio_reqs [i ])) {
243
248
opal_output (1 , "mca_fbtl_posix_progress: error in aio_write()" );
244
- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
249
+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
245
250
return OMPI_ERROR ;
246
251
}
247
252
}
@@ -255,8 +260,13 @@ bool mca_fbtl_posix_progress ( mca_ompio_request_t *req)
255
260
/* all pending operations are finished for this request */
256
261
req -> req_ompi .req_status .MPI_ERROR = OMPI_SUCCESS ;
257
262
req -> req_ompi .req_status ._ucount = data -> aio_total_len ;
258
- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
259
- ret = true;
263
+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
264
+
265
+ if ( data -> aio_fh -> f_atomicity ) {
266
+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
267
+ }
268
+
269
+ ret = true;
260
270
}
261
271
#endif
262
272
return ret ;
@@ -268,8 +278,8 @@ void mca_fbtl_posix_request_free ( mca_ompio_request_t *req)
268
278
/* Free the fbtl specific data structures */
269
279
mca_fbtl_posix_request_data_t * data = (mca_fbtl_posix_request_data_t * )req -> req_data ;
270
280
if (NULL != data ) {
271
- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
272
- if ( NULL != data -> aio_reqs ) {
281
+
282
+ if ( NULL != data -> aio_reqs ) {
273
283
free ( data -> aio_reqs );
274
284
}
275
285
if ( NULL != data -> aio_req_status ) {
0 commit comments