13#define META_FILE_NAME "MqFactoryC_tcl.c"
17#define OT_CLASS NS(MqFactoryC)
18#define OT_CLASS_NAME "MqFactoryC"
20#define OBJECT2FCT(O) MkAssertCastM(MqFactoryC,(Tcl_ObjectGetMetadata(O, &MK(AtomMeta))))
50#define OT_SETUP_hdl_static_constr_pre
51#define OT_SETUP_hdl_static_constr \
52 OT_SETUP_hdl_static_constr_pre; \
55#define OT_SETUP_hdl_static \
56 int __skip=Tcl_ObjectContextSkippedArgs(objCtx); \
58 __attribute__((unused)) OT_SELF_T selfO = Tcl_ObjectContextObject(objCtx); \
59 __attribute__((unused)) MK_TYP hdl = MqFactoryC##_TT;
61#define OT_SETUP_hdl SetupHdlFromMetaData_2(FCT,MQ_FCT);
62#define OT_SETUP_hdl__null_allow SetupHdlFromMetaData__null_allow_2(FCT,MQ_FCT);
63#define OT_SETUP_hdl_destr SetupHdlFromMetaData__null_allow_2(FCT,MQ_FCT);
65#define OT_SETUP_hdl_constr_pre
66#define OT_SETUP_hdl_constr \
67 OT_SETUP_hdl_constr_pre; \
68 int __skip=Tcl_ObjectContextSkippedArgs(objCtx); \
70 MK_RT_UNUSED OT_SELF_T selfO = Tcl_ObjectContextObject(objCtx); \
71 MQ_FCT hdl = (MQ_FCT) &MkERROR;
73#if !defined(SetupRtFromHdl_XN)
74 #define SetupRtFromHdl_XN(hdl) AllRtSetup_XN(hdl)
75 #define SetupRtFromHdl_X(hdl) AllRtSetup_X(hdl)
81 if (MqFactoryCTT == NULL) MqFactoryCTT = MqFactorySTT; \
84 if (MqFactoryCTT->selfCreate == NS(MqFactoryC_selfCreate)) return MK_OK; \
87 MqFactoryCTT->selfCreate = NS(MqFactoryC_selfCreate); \
88 MqFactoryCTT->selfDelete = NS(MqFactoryC_selfDelete); \
89 MqFactoryCTT->selfUnlink = NS(MqFactoryC_selfUnlink); \
92 OT_SELF_T classO = MK(ClassDef)(interp,ns,MqFactoryCTT); \
93 check_NULL(classO) goto error; \
94 OT_CLASS = Tcl_GetObjectAsClass(classO); \
97 static MkThreadLocal OtUnknownS NS(sClassUnknown) = {OT_UNKNOWN_CLASS}; \
98 check_LNG(MK(UnknownSetup) (interp,classO,NS(sOtClassDef),&NS(sClassUnknown))) goto error; \
101 static MkThreadLocal OtUnknownS NS(sInstanceUnknown) = {OT_UNKNOWN_INSTANCE}; \
102 check_LNG(MK(UnknownSetup) (interp,classO,NS(sInstanceDef),&NS(sInstanceUnknown))) goto error; \
105 MQ(MqFactoryC_MK_NULL) = Tcl_GetObjectName(interp, \
106 MK(AtomCreate) (MK_RT_CALL interp, NULL , OT_CLASS, "MK_NULL" , "::tclmqmsgque::MqFactoryC" ) \
108 Tcl_IncrRefCount(MQ(MqFactoryC_MK_NULL));
110#define VER TCL_OO_METHOD_VERSION_CURRENT
115#define META_CONTEXT_S mqctx
125static char msg[] =
"ERROR: a 'MqFactoryC' command was called OUTSIDE" \
126" of the 'tclmqmsgque::Main'-proc.\n" \
128"Description: a 'tclmqmsgque SERVER' listen on a port and start for every incoming connetion\n" \
129"a sub-server. If a thread sub-server was choosen... with the '--thread' commandline-option...\n" \
130"a new thread is created. To setup a new thread the INITIAL tcl-file is RE-READ again and\n" \
131"PROCS and VARIABLES are initialized. The NEW thread has it's own 'Main'-proc and so... the\n" \
132"original 'Main'-proc is skipped. If a 'factory' command is used OUTSIDE of the 'Main'-proc...\n" \
133"the initial 'Factory' will be created TWICE. The creation of multiple 'Factory' objects...\n" \
134"with the SAME name... is an ERROR."; \
136#undef OT_SETUP_hdl_constr_pre
137#define OT_SETUP_hdl_constr_pre \
138 if (NS(inMain) == false) { \
139 Tcl_SetResult(interp,msg,TCL_STATIC); \
143#undef OT_SETUP_hdl_static_constr_pre
144#define OT_SETUP_hdl_static_constr_pre OT_SETUP_hdl_constr_pre
148 assert (dataP != NULL && *dataP != NULL);
150 if (Tcl_InterpDeleted(interp))
return;
156 assert (dataP != NULL && *dataP != NULL);
169#define Add_doc "MqFactoryC [MqFactoryC Add constructor:class ?ident:string=\"MK_NULL\"?]"
170#define CTOR_doc "MqFactoryC [MqFactoryC CTOR constructor:class ?ident:string=\"MK_NULL\"?]"
173#define Get_doc "MqFactoryC [MqFactoryC Get ?ident:string=\"\"?]"
174#define GetCalled_doc "MqFactoryC [MqFactoryC GetCalled ?ident:string=\"\"?]"
175#define GetCalledL_doc "MqFactoryC [MqFactoryC GetCalledL largs:MkBufferListC]"
176#define GetNull_doc "MqFactoryC [MqFactoryC GetNull]"
177#define HandleResolve_doc "MqFactoryC [MqFactoryC HandleResolve netHdl:MK_HDL]"
178#define Instances_doc "MqFactoryC [MqFactoryC Instances]"
181#define DefaultIdent_doc "string [MqFactoryC DefaultIdent]"
182#define InitialIdent_doc "string [MqFactoryC InitialIdent]"
183#define LogAll_doc "MqFactoryC LogAll ?callfunc:string=\"MK_NULL\"?"
186#define Dup2_doc "MqFactoryC [$fct Dup2 ident:string] (const)"
189#define Default_doc "MqFactoryC [$fct Default]"
190#define Initial_doc "MqFactoryC [$fct Initial]"
191#define Next_doc "MqFactoryC [$fct Next]"
192#define Prev_doc "MqFactoryC [$fct Prev]"
195#define New_doc "MqContextC [$fct New]"
198#define GetOriginalIdent_doc "string [$fct GetOriginalIdent] (const)"
248#include "valgrind/callgrind.h"
265#ifdef CALLGRIND_DEBUG
266printTxt(
"start CALLGRIND_ZERO_STATS")
270 interp = Tcl_CreateInterp();
277 Tcl_SetVar (interp,
"MQ_STARTUP_IS_THREAD",
"yes", TCL_GLOBAL_ONLY);
288#ifdef CALLGRIND_DEBUG
289CALLGRIND_DUMP_STATS_AT(
"tcl_thread_startup");
290printTxt(
"end CALLGRIND_ZERO_STATS")
297 if (clsO) createC = Tcl_GetObjectAsClass(clsO);
304 if (fct->fct_ctor.data) {
305 OT_OBJ_T createObj = fct->fct_ctor.data;
306 OT_SELF_T createO = Tcl_GetObjectFromObj(interp, createObj);
308 if (createO == NULL) {
312 createC = Tcl_GetObjectAsClass(createO);
314 createC =
NS(MqContextC);
320 if (createC == NULL) {
332 lobjv[0] =
RG(nullObj);
338 retObject = Tcl_NewObjectInstance(interp, createC, NULL, NULL, 1, lobjv, 0);
345 mqctx =
MqCtx(Tcl_ObjectGetMetadata(retObject, &
MK(AtomMeta)));
372 mqctx->setup.Event.fCall = NULL;
383 Tcl_DeleteCommandFromToken(interp, Tcl_GetObjectCommand(retObject));
712 if (retVal == NULL) {
736 MQ_FCT retVal =
MqFactoryAdd (NULL,
NS(sFactoryCTor), constructor,
NS(sFactoryDataFree),
NS(sFactoryDataCopy), NULL, NULL, NULL, NULL, ident);
737 if (retVal == NULL) {
759 MQ_FCT retVal =
MqFactoryAdd (NULL,
NS(sFactoryCTor), constructor,
NS(sFactoryDataFree),
NS(sFactoryDataCopy), NULL, NULL, NULL, NULL, ident);
760 if (retVal == NULL) {
780static Tcl_MethodType
NS(sOtClassDef)[] = {
784 {
VER,
"Add" ,
NS(MqFactoryC_Add) , NULL, NULL},
787 {
VER,
"Get" ,
NS(MqFactoryC_Get) , NULL, NULL},
788 {
VER,
"GetCalled" ,
NS(MqFactoryC_GetCalled) , NULL, NULL},
789 {
VER,
"GetCalledL" ,
NS(MqFactoryC_GetCalledL) , NULL, NULL},
790 {
VER,
"GetNull" ,
NS(MqFactoryC_GetNull) , NULL, NULL},
791 {
VER,
"HandleResolve" ,
NS(MqFactoryC_HandleResolve) , NULL, NULL},
792 {
VER,
"Instances" ,
NS(MqFactoryC_Instances) , NULL, NULL},
795 {
VER,
"DefaultIdent" ,
NS(MqFactoryC_DefaultIdent) , NULL, NULL},
796 {
VER,
"InitialIdent" ,
NS(MqFactoryC_InitialIdent) , NULL, NULL},
797 {
VER,
"LogAll" ,
NS(MqFactoryC_LogAll) , NULL, NULL},
800 {0, NULL, NULL, NULL}
805static Tcl_MethodType
NS(sInstanceDef)[] = {
809 {
VER,
"<constructor>" ,
NS(MqFactoryC_CTOR) , NULL, NULL},
812 {
VER,
"Dup2" ,
NS(MqFactoryC_Dup2) , NULL, NULL},
815 {
VER,
"Default" ,
NS(MqFactoryC_Default) , NULL, NULL},
816 {
VER,
"Initial" ,
NS(MqFactoryC_Initial) , NULL, NULL},
817 {
VER,
"Next" ,
NS(MqFactoryC_Next) , NULL, NULL},
818 {
VER,
"Prev" ,
NS(MqFactoryC_Prev) , NULL, NULL},
821 {
VER,
"New" ,
NS(MqFactoryC_New) , NULL, NULL},
824 {
VER,
"GetOriginalIdent" ,
NS(MqFactoryC_GetOriginalIdent) , NULL, NULL},
829 {0, NULL, NULL, NULL, NULL}
845 NS(sFactoryCTor), NULL, NULL, NULL, NULL, NULL, NULL, NULL,
"tclmqmsgque"
851 Tcl_SetResult(interp,
"MqFactoryS exception",TCL_STATIC);
#define OT_SETUP_VARARGS(min, max, d)
#define OT_CHECK_NIH(val)
#define OT_SETUP_NOARG(d)
#define OT_SETUP_ONEARG(d)
#define OT_ERROR_LNG_RETURN
#define OT_retObj_SET_Error
#define OT_ERROR_CONSTRUCTOR(class)
#define OT_CHECK_REQUIRED(val)
#define OT_retObj_SET_None
#define OT_SETUP_CONSTRUCTOR_ARGS(...)
#define OT_ERROR_LNG_2_META(m)
#define OT_retObj_SET_STR(nat)
#define OT_CHECK_OPTIONAL(val)
#define OT_GET_CONSTR_NAME(ctor)
#define OT_REF_DECR_AND_NULL(_obj)
#define OT_retObj_CONSTR(x)
#define MkErrorC_Check(mng, PROC)
#define OT_CHECK_STRN(val)
#define OT_retObj_SET_CTX(nat)
#define OT_retObj_SET_FCT(nat)
#define OT_CONSTRUCTOR_POST(x)
#define OT_SETUP_hdl_static_constr
#define GetOriginalIdent_doc
#define HandleResolve_doc
#define OT_SETUP_hdl_static
#define OT_SETUP_hdl_constr
static __thread MK_TYP MqFactoryCTT
#define MkBufferListCreateTLS_T(name, num)
#define MkErrorGetCode_0E()
#define MkErrorStack_0E()
#define MkErrorSetC_1E(message)
static bool MkSysStringIsNULL(MK_STRN str)
static MQ_CTX MqCtx(MK_MNG mng)
cast a unknown-object into an MqContextS pointer or NULL if not possible
#define MQ_CALLBACK_FACTORY_CTOR_ARGS
the MqFactoryCTorF arguments with default names
#define MqFactoryInstances()
static MQ_FCT MqFactoryPrev(MQ_FCT const fct)
get previous instance from linked-list of MqFactoryS type
#define MqFactoryHandleResolve(...)
static MQ_FCT MqFactoryGetNull(void)
Null-Slot - return a MqFactoryC typed NULL instance …
static MQ_FCT MqFactoryNext(MQ_FCT const fct)
get next instance from linked-list of MqFactoryS type
#define MqFactoryGetCalledL(...)
#define MqFactoryGet(...)
MK_STRN MqFactoryGetOriginalIdent(MQ_FCTN const fct)
helper function to return MqFactoryS::originalIdent
#define MqFactoryGetCalled(...)
#define MqFactoryLogAll(...)
#define MqFactoryInitial(...)
#define MqFactoryDefaultIdent()
#define MqFactoryNew(...)
#define MqFactoryInitialIdent()
#define MqFactoryDefault(...)
#define MqFactoryDup2(...)
#define MqFactoryAdd(...)
@ MQ_FACTORY_NEW_FILTER
create object as a filter
@ MQ_FACTORY_NEW_FORK
create object as a fork process
@ MQ_FACTORY_NEW_THREAD
create object as a thread
@ MQ_FACTORY_NEW_INIT
initial object, nothing else is known
@ MQ_FACTORY_NEW_SLAVE
create object as a slave of an other object
@ MQ_FACTORY_NEW_CHILD
create object as a child of an other object
MK_BFL MqInitGetArg0(void)
get the process startup-prefix argument
MkErrorCheck(MqSendSTART(mqctx))
#define OT_CHECK_BFLN(val, nullB)
#define OT_CHECK_CONSTRUCTOR(val)
PUBLIC data structure for the tclmqmsgque-specific-data
data used to define a factory