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