RtORBにおけるCORBAオブジェクト
RtORBのCORBAオブジェクトは、corba-object-defs.hの中で下記のように定義しています。
typedef struct CORBA_Object_struct{
void *servant; // Servantへのポインタ
struct PortableServer_POA_struct *poa; // POAへのポインタ。通常はRootPOA
CORBA_ORB orb; // ORBへのポインタ
unsigned char *typedId; // オブジェクトのtypedID。narrowの時に使います。
unsigned char *object_key; // オブジェクトID、同じORBの中では一意でなければならない。
CORBA_URL *_url; // CORBA_URL
unsigned char num_urls; // CORBA_URLの数
unsigned char *_ior_string; // このオブジェクトに対するIOR(octet sequenceのハズです)
GIOP_Connection *connection; // クライアント用のGIOPコネクション
CORBA_InterfaceDef *interface; // CORBA_InterfaceDefは、Dummyしか要素がありません。未使用と同じ。
unsigned long *repository_id; // リポジトリID
unsigned long ref; // オブジェクトのリファレンスカウンタ
CORBA_Policy *policy; // RtORBでは、未使用。
CORBA_PolicyList *_policies; // RtORBでは、未使用。
void *impl; // 実際のオブジェクトへのポインタ
void *impl_obj; // C++オブジェクトへのポインタ
int release; // 未使用。
#ifdef __cplusplus
CORBA_boolean _is_equivalent(CORBA_Object_struct*);
CORBA_Object_struct & operator=(const CORBA_Object_struct &o);
#endif
}CORBA_Object_struct;
typedef CORBA_Object_struct * CORBA_Object;
この定義でifdefのプリプロセッサで記述されてい部分は、C++のラッパーのための定義になります。RtORBでは、CORBA_Objectは、ServantへのポインタとIOR等の情報の保持、Stubとしての機能を管理することになります。つまり、実装側では、Servantがありimplがあるはずで、Stub側(クライアン側)では、URLとGIOPコネクションが最低でも必要になります。この表現では、非常に冗長になる部分があり、RtORBの内部でメモリーリーク、または、セグメント化違反になるコードが存在しているかもしれません。よりコンパクトな仕様に変更することは可能だと思いますが、上位系のミドルウエアがCORBAの仕様がすべてあることを前提に書いてあると余計なコードを実装する必要があると思います。
その場合には、ミドルウェアの方を下位の通信層で提供している方法で記述すれば、良いと思うのですが。。。。
C言語のマッピングを作成する場合には、必要最低限の機能で実装し直しをする方がよいと思います。
サーバント(Sarvant)
サーバントとは、ネットワーク・ノードが対等なコンピュータネットワークで、サーバとクライアントを兼ねるシステムのことを言います。RtORBでは、CORBAオブジェクトに相当します。
RtORBで、サーバント関連の定義は、下記のようになっています。
typedef void *PortableServer_Servant;
typedef struct {
void *_private;
void (*finalize)(PortableServer_Servant , CORBA_Environment *);
PortableServer_POA (*default_POA)(PortableServer_Servant, CORBA_Environment *);
void (*add_ref)(PortableServer_Servant, CORBA_Environment *);
void (*remove_ref)(PortableServer_Servant, CORBA_Environment *);
CORBA_InterfaceDef *(*get_interface)(PortableServer_Servant, CORBA_Environment *);
CORBA_boolean (*is_a)(PortableServer_Servant, const char *, CORBA_Environment *);
CORBA_boolean (*non_existent)(PortableServer_Servant, CORBA_Environment *);
} PortableServer_ServantBase__epv ;
typedef PortableServer_ServantBase__epv *PortableServer_ServantBase__vepv;
typedef struct {
void *_private;
PortableServer_ServantBase__vepv *vepv;
} PortableServer_ServantBase;
typedef struct{
PortableServer_ServantBase servant;
PortableServer_POA poa;
void *_private;
}impl_POA_ServantBase;
typedef struct {
void (*dummy)();
void *(*impl_finder)();
const char *class_name;
uint32_t *class_id;
CORBA_Class_Impl *class_impl;
}PortableServer_ClassInfo;
typedef struct{
void *_private;
CORBA_Object obj;
PortableServer_POA poa;
PortableServer_Servant servant;
PortableServer_ObjectId objectId;
void *_reserve;
}RtORB_POA_Object;
typedef struct{
CORBA_TypeCode tc;
char *name;
int32_t n_methods;
struct CORBA_Class_Method *methods;
int32_t n_base_types;
char **base_types;
} CORBA_Class_Impl;
typedef struct CORBA_Class_Method{
char *name;
CORBA_TypeCode retval;
int32_t in_argc;
CORBA_IArg *in_argv;
int32_t n_exceptinfo;
CORBA_TypeCode *exceptinfo;
}CORBA_Class_Method;
typedef struct CORBA_IArg {
CORBA_TypeCode tc;
unsigned char io;
char *name;
}CORBA_IArg;
typedef struct CORBA_TypeCode_struct{
void * parents;
CORBA_TCKind kind;
CORBA_RepositoryId repository_id;
CORBA_Identifier identifier;
uint32_t member_count; /* struct, union, enum, value, exception, event */
CORBA_Identifier *member_name; /* struct, union, enum, value, exception, event */
struct CORBA_TypeCode_struct **member_type; /* struct, union, value, exception, event */
int32_t *member_label; /* union */
struct CORBA_TypeCode_struct *discriminator; /* union */
int32_t default_index; /* union */
uint32_t length; /* string, wstring, sequence, array */
struct CORBA_TypeCode_struct *content_type; /* sequence, array, value_box, alias */
uint16_t fixed_digits; /* fixed */
int16_t fixed_scale; /* fixed */
CORBA_Visibility *member_visibility; /* value, event */
CORBA_ValueModifier type_modifier; /* value, event */
struct CORBA_TypeCode_struct *concrete_base_type; /* value, event */
int16_t size;
int16_t alignment;
}CORBA_TypeCode_struct;
typedef CORBA_TypeCode_struct *CORBA_TypeCode ;




