fuse_impls_release.c
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:2k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. #include "fuse_dfs.h"
  19. #include "fuse_impls.h"
  20. #include "fuse_file_handle.h"
  21. /**
  22.  * This mutex is to protect releasing a file handle in case the user calls close in different threads
  23.  * and fuse passes these calls to here.
  24.  */
  25. pthread_mutex_t release_mutex = PTHREAD_MUTEX_INITIALIZER;
  26. int dfs_release (const char *path, struct fuse_file_info *fi) {
  27.   TRACE1("release", path)
  28.   // retrieve dfs specific data
  29.   dfs_context *dfs = (dfs_context*)fuse_get_context()->private_data;
  30.   // check params and the context var
  31.   assert(path);
  32.   assert(dfs);
  33.   assert('/' == *path);
  34.   int ret = 0;
  35.   //
  36.   // Critical section - protect from multiple close calls in different threads.
  37.   // (no returns until end)
  38.   //
  39.   pthread_mutex_lock(&release_mutex);
  40.   if (NULL != (void*)fi->fh) {
  41.     dfs_fh *fh = (dfs_fh*)fi->fh;
  42.     assert(fh);
  43.     hdfsFile file_handle = (hdfsFile)fh->hdfsFH;
  44.     if (NULL != file_handle) {
  45.       if (hdfsCloseFile(fh->fs, file_handle) != 0) {
  46.         syslog(LOG_ERR, "ERROR: dfs problem - could not close file_handle(%ld) for %s %s:%dn",(long)file_handle,path, __FILE__, __LINE__);
  47.         fprintf(stderr, "ERROR: dfs problem - could not close file_handle(%ld) for %s %s:%dn",(long)file_handle,path, __FILE__, __LINE__);
  48.         ret = -EIO;
  49.       }
  50.     }
  51.     if (fh->buf != NULL) {
  52.       free(fh->buf);
  53.     }
  54.     // this is always created and initialized, so always destroy it. (see dfs_open)
  55.     pthread_mutex_destroy(&fh->mutex);
  56.     free(fh);
  57.     fi->fh = (uint64_t)0;
  58.   }
  59.   pthread_mutex_unlock(&release_mutex);
  60.   //
  61.   // End critical section 
  62.   // 
  63.   return ret;
  64. }