* TODO: This should actually lock the GCB, not the channel
*/
#define LOCK_CHANNELS 0
+/*
+ * TRACE_ENDPOINTS
+ * - Emit a log message with names/indexes of both endpoints
+ */
+#define TRACE_ENDPOINTS 1
#define MAX_SPAWN_IDX 6
if( other_side )
side_idx = 1 - side_idx;
- LOG("side_idx = %i, other_side=%b", side_idx, other_side);
-
return &ch->Side[side_idx];
}
return 1;
}
- tUDI_MetaLang *ops_ml = UDI_int_GetMetaLang(inst, ops->meta_idx);
+ tUDI_MetaLang *ops_ml = UDI_int_GetMetaLang(inst->Module, ops->meta_idx);
if( ops_ml != ch->MetaLang ) {
Log_Warning("UDI", "Attempt by %s to bind with mismatched channel '%s' op '%s' channel",
inst->Module, ops_ml->Name, ch->MetaLang->Name);
if( context ) {
// Use provided context pointer
+ LOG("context = provided %p", context);
}
else if( ops->chan_context_size )
{
ASSERTCR( ops->chan_context_size, >=, sizeof(udi_child_chan_context_t), 4 );
else
ASSERTCR( ops->chan_context_size, >=, sizeof(udi_chan_context_t), 4 );
- context = malloc( ops->chan_context_size );
+ context = calloc( 1, ops->chan_context_size );
((udi_chan_context_t*)context)->rdata = rgn->InitContext;
if( is_child_bind )
((udi_child_chan_context_t*)context)->child_ID = child_ID;
+ LOG("context = allocated %p", context);
// TODO: The driver may change the channel context, but this must be freed by the environment
UDI_int_ChannelGetSide(channel, other_side)->AllocatedContext = context;
}
else {
context = rgn->InitContext;
+ LOG("context = region %p", context);
}
UDI_BindChannel_Raw(channel, other_side, inst, region, ops->meta_ops_num, context, ops->ops_vector);
}
}
+ #if TRACE_ENDPOINTS
+ struct sUDI_ChannelSide *thisside = UDI_int_ChannelGetSide(gcb->channel, false);
+ Log("%s:%i -> %s:%i",
+ (thisside->Instance ? thisside->Instance->Module->ModuleName : "MA"), thisside->RegionIdx,
+ (newside->Instance ? newside->Instance->Module->ModuleName : "MA"), newside->RegionIdx);
+ #endif
+
gcb->channel = (udi_channel_t)&newside->BackPtr;
gcb->context = newside->Context;
if( !newside->Ops ) {