RtORBで用いているTableとlist
Simple Wiki Based Contents Management System
Home Topics Projects Software Misc
ソフトウェア関連 >> RtORBについて >> RtORBの動作について >> RtORBで用いているTableとlist

PtrArray

【データ構造】
  typedef struct {
    unsigned long length;
    unsigned long maximum;
    unsigned long *array;
 
    void (*free_op)(unsigned long);
  } PtrArray;
【利用範囲】
単純な配列の実装。固定長配列を使っており、CORBA_Sequenceによく似ている。ORB内のInitialReference, Object Adapter, Threadの管理。POA Managerの管理に使用している。下のPtrListでも代替可能。原則として、リサイズはしない。

PtrList

【データ構造】
  typedef struct PtrList{
   unsigned long length;
   void **item;
   struct PtrList *prev, *next;
   void (*free_op)(void**);
   char released;
  } PtrList;
【利用範囲】
単純なPointer Listの実装。固定長ではなく、相互連結型のポインタリスト。GIOPのRequest Queue、POAに対するRequestQueueとして使用している。動的に、リサイズされ、必要なメモリしか消費しないようにしている。
Queueを固定長にして、オーバーしたときにエラー返す実装であれば、固定化してもOKだが、エラー処理時に、リクエスト待ちになるのか、リクエストエラーで処理するかを明確化擦る必要がある。

HashTable

【データ構造】
  typedef struct hashtableItem{
    void *key;
    void *value;
  } hashtableItem;
  
  typedef struct hashtable{
    hashtableItem *items;
    int size;
    int n_items;
    int (*cmp_func)(char*, char*);
    unsigned long (*hash_func)(const unsigned char*);
    void  (*del_func)(hashtableItem);
  } hashtable;
【利用範囲】
POA,ORB内のCORBAオブジェクトの管理に使用。固定長のHash表でもよいが、CORBAオブジェクトの最大値がわからないので、リサイズ可能にしている。(リサイズ時には、原則として、表のサイズを倍にするようにしている)アプリケーションが決定的であれば、最大値を見積るのは可能。テスト時に、最大値を見つけてそれを初期値にするのはできそう。

その他

【データ構造】
 struct sockport_profile{
   int type;
   void *arg;
   int (*connection_proc)(int, void*);
   int (*command_proc)(GIOP_ConnectionHandler*);
   int (*disconnect_proc)(int, void*);
 };
 
 struct sockport_profile  SockProfile[FD_SETSIZE];
【利用範囲】
GIOPの低レベルSocketの管理用。接続時、切断時の処理登録メッセージ受信時の処理をSocketごとに設定できるようにしている。しかし、実際には、connection_proc, disconnection_procともに NULLが代入され、すべてのSocketに対して、command_proc = RecvMessage; となっている。
問題になるのは、この配列の大きさだろう。FD_SETSIZEは、各システムでselectシステムコール時に待つことができるFDの最大値なので、通常、膨大な数になる。
限定したアプリケーションでは、そんなに使っていないはず(FDが再利用されるため)