[openrtm-commit:01831] r798 - trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port

openrtm @ openrtm.org openrtm @ openrtm.org
2016年 3月 9日 (水) 00:47:31 JST


Author: win-ei
Date: 2016-03-09 00:47:31 +0900 (Wed, 09 Mar 2016)
New Revision: 798

Added:
   trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/SharedMemory.java
Log:
Added SharedMemory class. Not implemented yet.refs #3395

Added: trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/SharedMemory.java
===================================================================
--- trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/SharedMemory.java	                        (rev 0)
+++ trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/SharedMemory.java	2016-03-08 15:47:31 UTC (rev 798)
@@ -0,0 +1,298 @@
+package jp.go.aist.rtm.RTC.util;
+
+import OpenRTM.CdrDataHolder;
+import OpenRTM.PortSharedMemory;
+
+import jp.go.aist.rtm.RTC.log.Logbuf;
+
+/**
+ * {@.ja SharedMemory クラス}
+ * {@.en SharedMemory class}
+ * <p>
+ * {@.ja 共有メモリ操作クラス
+ * CORBAによる通信により、mmapの初期化、終了などがリモートに操作できる}
+ * {@.en This is the class to operate a shared memory.
+ * This class can operate following operationis  using CORBA communication.
+ * <li>Initialization of mmap 
+ * <li>Finalization of mmap </li></ul>}
+ *
+ */
+
+
+public abstract class SharedMemory implements PortSharedMemory {
+    private static final long DEFAULT_SIZE = 8;
+    private static final long DEFAULT_MEMORY_SIZE = 2*1024*1024;
+
+
+    /**
+     * {@.ja コンストラクタ}
+     * {@.en Constructor}
+     */
+    public SharedMemory(){
+        rtcout = new Logbuf("SharedMemory");
+
+    }
+
+  
+    /**
+     *
+     * {@.ja 文字列で指定したデータサイズを数値に変換する}
+     * {@.en Changes a string to the value.}
+     * <p>
+     * 1M -> 1048576
+     * 1k -> 1024
+     * 100 -> 100 
+     *
+     * @param size_str
+     *  {@.ja データサイズ(文字列)}
+     *  {@.en String}
+     * 
+     * @return 
+     *  {@.ja データサイズ(数値)}
+     *  {@.en value}
+  # int string_to_MemorySize(string size_str);
+     */
+    public long string_to_MemorySize(String size_str){
+        return DEFAULT_MEMORY_SIZE;
+/*
+    memory_size = SharedMemory.default_memory_size
+    if size_str:
+      if size_str[-1] == "M":
+        memory_size = 1024 * 1024 * int(size_str[0:-1])
+      elif size_str[-1] == "k":
+        memory_size = 1024 * int(size_str[0:-1])
+      else:
+        memory_size = int(size_str[0:-1])
+    return memory_size
+*/
+    }
+
+
+    /**
+     * 
+     * {@.ja 共有メモリの初期化}
+     * {@.en Initializes a shared memory.}
+     * 
+     *  # windowsではページングファイル上に領域を確保する
+     *  # Linuxでは/dev/shm以下にファイルを作成する
+     *  # 作成したファイルの内容を仮想アドレスにマッピングする
+     *
+     * @param memory_size 
+     *  {@.ja 共有メモリのサイズ}
+     *  {@.en Size of a shared momory}
+     * @param shm_address 
+     *  {@.ja 空間名}
+     *  {@.en name of memory}
+  # void create_memory(int memory_size, string shm_address);
+     */
+    public void create_memory (int memory_size, String shm_address){
+/*
+    
+    if self._shmem is None:
+      self._rtcout.RTC_TRACE("create():memory_size="+str(memory_size)+",shm_address="+str(shm_address))
+      self._memory_size = memory_size
+      self._shm_address = shm_address
+
+      if platform.system() == "Windows":
+        self._shmem = mmap.mmap(0, self._memory_size, self._shm_address, mmap.ACCESS_WRITE)
+      else:
+        O_RDWR = 2
+        O_CREAT = 64
+
+        S_IRUSR = 256
+        S_IWUSR = 128
+        S_IRGRP = 32
+        S_IWGRP = 16
+        S_IROTH = 4
+
+        self.fd = self.rt.shm_open(self._shm_address,O_RDWR | O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH)
+        if self.fd < 0:
+          return self.UNKNOWN_ERROR
+        self.rt.ftruncate(self.fd, self._memory_size)
+        self._shmem = mmap.mmap(self.fd, self._memory_size, mmap.MAP_SHARED)
+        self.rt.close( self.fd )
+
+      
+      if self._smInterface:
+        self._smInterface.open_memory(self._memory_size, self._shm_address)
+*/
+
+    }
+    /**
+     * 
+     * {@.ja 共有メモリのマッピングを行う}
+     * {@.en Open a shared memory.}
+     *
+     * @param memory_size 
+     *  {@.ja 共有メモリのサイズ}
+     *  {@.en size of shared momoery}
+     * @param shm_address 
+     *  {@.ja 空間名}
+     *  {@.en name of memory}
+  # void open_memory(int memory_size, string shm_address);
+     */
+    public void open_memory (int memory_size, String shm_address){
+/*
+    self._rtcout.RTC_TRACE("open():memory_size="+str(memory_size)+",shm_address="+str(shm_address))
+    self._memory_size = memory_size
+    self._shm_address = shm_address
+    if self._shmem is None:
+      if platform.system() == "Windows":
+        self._shmem = mmap.mmap(0, self._memory_size, self._shm_address, mmap.ACCESS_READ)
+      else:
+        O_RDWR = 2
+        self.fd = self.rt.shm_open(self._shm_address,O_RDWR,0)
+        if self.fd < 0:
+          return self.UNKNOWN_ERROR
+        self.rt.ftruncate(self.fd, self._memory_size)
+        self._shmem = mmap.mmap(self.fd, self._memory_size, mmap.MAP_SHARED)
+        self.rt.close( self.fd )
+    
+*/
+    }
+    /**
+     * 
+     * {@.ja マッピングした共有メモリをアンマップする}
+     * {@.en Close a shared memory.}
+     *
+     * @param unlink 
+     *  {@.ja Linuxで/dev/shm以下に作成したファイルを削除する場合にTrueにする}
+     *  {@.en }
+    *
+  # void close_memory(boolean unlink);
+     */
+    public void close_memory(boolean unlink){
+/*
+    self._rtcout.RTC_TRACE("open()")
+    if self._shmem:
+      self._shmem.close()
+      if platform.system() == "Windows":
+        pass
+      else:
+        if unlink:
+           self.rt.shm_unlink(self._shm_address)
+      self._shmem = None
+
+      if self._smInterface:
+        self._smInterface.close_memory(False)
+*/
+    }  
+    
+    public void close_memory(){
+        close_memory(false);
+    }
+
+
+  
+    /**
+     * 
+     * {@.ja データを書き込む}
+     * {@.en Wwrites in data.}
+     * <p>
+     * {@.ja 先頭8byteにデータサイズを書き込み、その後ろにデータを書き込む
+     * 設定したデータサイズが共有メモリのサイズを上回った場合、
+     * 共有メモリの初期化を行う}
+     *
+     * @param data 
+     *  {@.ja 書き込むデータ} 
+     *  {@.en data}
+  # void write(cdrMemoryStream& data);
+     */
+    public void write(CdrDataHolder data){
+/*
+    self._rtcout.RTC_TRACE("write()")
+    
+    if self._shmem:
+      data_size = len(data)
+
+      
+      if data_size + SharedMemory.default_size > self._memory_size:
+        self._memory_size = data_size + SharedMemory.default_size
+
+        if self._smInterface:
+          self._smInterface.close_memory(False)
+
+
+        self.close_memory(True)
+        self.create_memory(self._memory_size, self._shm_address)
+
+        
+        
+      data_size_cdr = cdrMarshal(CORBA.TC_ulong, data_size)
+      
+      self._shmem.seek(os.SEEK_SET)
+      self._shmem.write(data_size_cdr)
+      self._shmem.write(data)
+*/
+    }
+    /**
+     * 
+     * {@.ja データを読み込む}
+     * {@.en Read Data.}
+     *
+     * @param data
+     *   {@.ja 読み込んだデータを受け取るためのオブジェクト}
+     *   {@.en Readout data stored into the buffer.}
+     *
+  # void read(::OpenRTM::CdrData_out data);
+     */
+    public void read(CdrDataHolder data){
+/*
+    self._rtcout.RTC_TRACE("read()")
+    if self._shmem:
+      
+      self._shmem.seek(os.SEEK_SET)
+      
+      data_size_cdr = self._shmem.read(SharedMemory.default_size)
+      data_size = cdrUnmarshal(CORBA.TC_ulong, data_size_cdr)
+      
+      
+      
+      shm_data = self._shmem.read(data_size)
+      
+      return shm_data
+    return ""
+*/
+    }
+
+    /**
+     * 
+     * {@.ja 通信先のCORBAインターフェースを登録する}
+     * {@.en Registers CORBA interfaces.}
+     *  <p>
+     * {@.ja 登録する事により共有メモリの初期化したときに、
+     * 通信先でもマッピングをやり直すことができる}
+     *
+     * @param sm
+     *   {@.ja SharedMemoryのオブジェクトリファレンス}
+     *   {@.en Object reference of shared momory}
+  # void close(int memory_size, string shm_address);
+     */
+    public void setInterface (OpenRTM.PortSharedMemory sm){
+        //self._smInterface = sm
+    }
+    
+
+    /**
+     * 
+     * {@.ja データの送信を知らせる}
+     * {@.en Put data.}
+  # PortStatus put();
+     */
+    public OpenRTM.PortStatus put(){
+        return OpenRTM.PortStatus.UNKNOWN_ERROR;
+    }
+
+    /**
+     * 
+     * {@.ja データの送信を要求する}
+     * {@.en Get data.}
+  #
+  # PortStatus get();
+     */
+    public OpenRTM.PortStatus get(){
+        return OpenRTM.PortStatus.UNKNOWN_ERROR;
+    }
+    private Logbuf rtcout;
+}
+



More information about the openrtm-commit mailing list