INodeMap

本文深入探讨了INodeMap如何利用LightWeightGSet存储INode对象,通过重载equals和hashCode方法实现INodeID与INode的高效映射。通过实例分析了INodeMap的初始化、添加、获取、移除等操作,揭示了其内部实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

INodeMap利用LightWeightGSet来存储INode对象,为什么可以存储INode ID和INode的映射呢?因为INode的equals和hashCode方法都已经重载,并且只根据id判断,那么知道id之后,其它字段为空的Inode对象,就可以得到映射的对象。equals和hashCode 方法如下:

  @Override
  public final boolean equals(Object that) {
    if (this == that) {
      return true;
    }
    if (that == null || !(that instanceof INode)) {
      return false;
    }
    return getId() == ((INode) that).getId();
  }

  @Override
  public final int hashCode() {
    long id = getId();
    return (int)(id^(id>>>32));  
  }

INodeMap的源代码:

/**
 * Storing all the {@link INode}s and maintaining the mapping between INode ID
 * and INode.  
 */
public class INodeMap {
  
  static INodeMap newInstance(INodeDirectory rootDir) {
    // Compute the map capacity by allocating 1% of total memory
    int capacity = LightWeightGSet.computeCapacity(1, "INodeMap");
    GSet<INode, INodeWithAdditionalFields> map
        = new LightWeightGSet<INode, INodeWithAdditionalFields>(capacity);
    map.put(rootDir);
    return new INodeMap(map);
  }
  
  /** Synchronized by external lock. */
  private final GSet<INode, INodeWithAdditionalFields> map;
  
  public Iterator<INodeWithAdditionalFields> getMapIterator() {
    return map.iterator();
  }

  private INodeMap(GSet<INode, INodeWithAdditionalFields> map) {
    Preconditions.checkArgument(map != null);
    this.map = map;
  }
  
  /**
   * Add an {@link INode} into the {@link INode} map. Replace the old value if 
   * necessary. 
   * @param inode The {@link INode} to be added to the map.
   */
  public final void put(INode inode) {
    if (inode instanceof INodeWithAdditionalFields) {
      map.put((INodeWithAdditionalFields)inode);
    }
  }
  
  /**
   * Remove a {@link INode} from the map.
   * @param inode The {@link INode} to be removed.
   */
  public final void remove(INode inode) {
    map.remove(inode);
  }
  
  /**
   * @return The size of the map.
   */
  public int size() {
    return map.size();
  }
  
  /**
   * Get the {@link INode} with the given id from the map.
   * @param id ID of the {@link INode}.
   * @return The {@link INode} in the map with the given id. Return null if no 
   *         such {@link INode} in the map.
   */
  public INode get(long id) {
    INode inode = new INodeWithAdditionalFields(id, null, new PermissionStatus(
        "", "", new FsPermission((short) 0)), 0, 0) {
      
      @Override
      void recordModification(int latestSnapshotId)
          throws QuotaExceededException {
      }
      
      @Override
      public void destroyAndCollectBlocks(BlocksMapUpdateInfo collectedBlocks,
          List<INode> removedINodes) {
        // Nothing to do
      }
      
      @Override
      public Counts computeQuotaUsage(Counts counts, boolean useCache,
          int lastSnapshotId) {
        return null;
      }
      
      @Override
      public ContentSummaryComputationContext computeContentSummary(
          ContentSummaryComputationContext summary) {
        return null;
      }
      
      @Override
      public Counts cleanSubtree(int snapshotId, int priorSnapshotId,
          BlocksMapUpdateInfo collectedBlocks, List<INode> removedINodes,
          boolean countDiffChange) throws QuotaExceededException {
        return null;
      }

      @Override
      public byte getStoragePolicyID(){
        return BlockStoragePolicySuite.ID_UNSPECIFIED;
      }

      @Override
      public byte getLocalStoragePolicyID() {
        return BlockStoragePolicySuite.ID_UNSPECIFIED;
      }
    };
      
    return map.get(inode);
  }
  
  /**
   * Clear the {@link #map}
   */
  public void clear() {
    map.clear();
  }
}




==> Processing catkin package: 'daheng' ==> Building with env: '/home/bt/A06_ws/devel_isolated/coordSystem/env.sh' Makefile exists, skipping explicit cmake invocation... ==> make cmake_check_build_system in '/home/bt/A06_ws/build_isolated/daheng' ==> make -j20 -l20 in '/home/bt/A06_ws/build_isolated/daheng' [ 0%] Built target std_msgs_generate_messages_cpp [ 0%] Built target sensor_msgs_generate_messages_cpp [ 0%] Built target sensor_msgs_generate_messages_eus [ 0%] Built target sensor_msgs_generate_messages_nodejs [ 0%] Built target geometry_msgs_generate_messages_eus [ 0%] Built target rosgraph_msgs_generate_messages_py [ 0%] Built target geometry_msgs_generate_messages_lisp [ 0%] Built target geometry_msgs_generate_messages_nodejs [ 0%] Built target geometry_msgs_generate_messages_cpp [ 0%] Built target sensor_msgs_generate_messages_lisp [ 0%] Built target sensor_msgs_generate_messages_py [ 0%] Built target std_msgs_generate_messages_eus [ 0%] Built target geometry_msgs_generate_messages_py [ 0%] Built target std_msgs_generate_messages_py [ 0%] Built target std_msgs_generate_messages_nodejs [ 0%] Built target roscpp_generate_messages_cpp [ 0%] Built target roscpp_generate_messages_eus [ 0%] Built target std_msgs_generate_messages_lisp [ 0%] Built target roscpp_generate_messages_lisp [ 0%] Built target roscpp_generate_messages_py [ 0%] Built target roscpp_generate_messages_nodejs [ 0%] Built target rosgraph_msgs_generate_messages_eus [ 50%] Built target daheng [ 50%] Built target rosgraph_msgs_generate_messages_cpp [ 50%] Built target rosgraph_msgs_generate_messages_nodejs [ 50%] Built target rosgraph_msgs_generate_messages_lisp [ 75%] Linking CXX executable /home/bt/A06_ws/devel_isolated/daheng/lib/daheng/daheng_driver /usr/bin/ld: warning: libGCBase_gcc40_v2_3.so, needed by /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so, not found (try using -rpath or -rpath-link) /usr/bin/ld: warning: libGenApi_gcc40_v2_3.so, needed by /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so, not found (try using -rpath or -rpath-link) CMakeFiles/daheng_driver.dir/src/daheng_driver.cpp.o:在函数‘main’中: daheng_driver.cpp:(.text+0x669):对‘GXGetLibVersion’未定义的引用 daheng_driver.cpp:(.text+0x144e):对‘GXSetAcqusitionBufferNumber’未定义的引用 daheng_driver.cpp:(.text+0x1b08):对‘GXStreamOn’未定义的引用 daheng_driver.cpp:(.text+0x1c33):对‘GXDQBuf’未定义的引用 daheng_driver.cpp:(.text+0x20f8):对‘DxRaw8toRGB24’未定义的引用 daheng_driver.cpp:(.text+0x23d7):对‘GXQBuf’未定义的引用 daheng_driver.cpp:(.text+0x2440):对‘GXStreamOff’未定义的引用 CMakeFiles/daheng_driver.dir/src/daheng_driver.cpp.o:在函数‘PixelFormatConvert(GX_FRAME_BUFFER*)’中: daheng_driver.cpp:(.text+0x2bab):对‘DxRaw8toRGB24’未定义的引用 daheng_driver.cpp:(.text+0x2c0b):对‘DxRaw16toRaw8’未定义的引用 daheng_driver.cpp:(.text+0x2c74):对‘DxRaw8toRGB24’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CEventAdapterGeneric::CEventAdapterGeneric(GenApi::INodeMap*)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring::_npos()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring::gcstring(char const*)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CChunkAdapter::AttachNodeMap(GenApi::INodeMap*)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::node_vector::node_vector()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CEventAdapter::DetachNodeMap()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring_vector::end() const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring_vector::const_iterator::operator!=(GenICam::gcstring_vector::const_iterator const&) const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::GenericException::~GenericException()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::RuntimeException::RuntimeException(char const*, char const*, int, char const*)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring_vector::~gcstring_vector()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘vtable for GenICam::GenericException’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring::c_str() const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::_InternalLoadDLL(GenICam::gcstring, GenICam::gcstring, GenICam::gcstring)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CEventAdapterGeneric::DeliverMessage(unsigned char const*, unsigned int, unsigned long)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring_vector::begin() const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::Deregister(long)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring::operator char const*() const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CEventAdapterGeneric::~CEventAdapterGeneric()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CChunkAdapterGeneric::CChunkAdapterGeneric(GenApi::INodeMap*, long)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CChunkAdapter::UpdateBuffer(unsigned char*)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CFeatureBag::LoadFromBag(GenApi::INodeMap*, bool, GenICam::gcstring_vector*)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::AccessException::AccessException(char const*, char const*, int, char const*)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::getline(std::istream&, GenICam::gcstring&)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘typeinfo for GenICam::GenericException’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::node_vector::~node_vector()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring_vector::clear()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring::find(GenICam::gcstring const&, unsigned long) const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring::~gcstring()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CChunkAdapter::DetachNodeMap()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::GenericException::GetSourceLine() const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring_vector::at(unsigned long)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring_vector::const_iterator::operator*() const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::GenericException::GetSourceFileName() const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::node_vector::at(unsigned long)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring_vector::gcstring_vector()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring::operator==(GenICam::gcstring const&) const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::GenericException::what() const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::GenericException::GetDescription() const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CFeatureBag::StoreToBag(GenApi::INodeMap*, int)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring::gcstring()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::GenericException::~GenericException()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CastToIDestroy(GenApi::INodeMap*)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::node_vector::size() const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CChunkAdapter::DetachBuffer()’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring_vector::push_back(GenICam::gcstring const&)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring::operator=(GenICam::gcstring const&)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘vtable for GenApi::CFeatureBag’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring_vector::const_iterator::operator++(int)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring_vector::size() const’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenApi::CastToINodeMapDyn(GenApi::INodeMap*)’未定义的引用 /usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/libgxiapi.so:对‘GenICam::gcstring::gcstring(GenICam::gcstring const&)’未定义的引用 collect2: error: ld returned 1 exit status CMakeFiles/daheng_driver.dir/build.make:131: recipe for target '/home/bt/A06_ws/devel_isolated/daheng/lib/daheng/daheng_driver' failed make[2]: *** [/home/bt/A06_ws/devel_isolated/daheng/lib/daheng/daheng_driver] Error 1 CMakeFiles/Makefile2:1167: recipe for target 'CMakeFiles/daheng_driver.dir/all' failed make[1]: *** [CMakeFiles/daheng_driver.dir/all] Error 2 Makefile:145: recipe for target 'all' failed make: *** [all] Error 2 <== Failed to process package 'daheng': Command '['/home/bt/A06_ws/devel_isolated/coordSystem/env.sh', 'make', '-j20', '-l20']' returned non-zero exit status 2 Reproduce this error by running: ==> cd /home/bt/A06_ws/build_isolated/daheng && /home/bt/A06_ws/devel_isolated/coordSystem/env.sh make -j20 -l20 Command failed, exiting.
最新发布
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值