RtORBで用いているTableとlist
Simple Wiki Based Contents Management System
ソフトウェア関連 >> ライブラリ >> 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が再利用されるため)