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が再利用されるため)

