3 * - By John Hodge (thePowersGang)
8 #include "udi_internal.h"
10 struct sUDI_ChannelSide {
11 struct sUDI_Channel *BackPtr;
16 typedef struct sUDI_Channel
18 enum eUDI_MetaLang MetaLang;
19 struct sUDI_ChannelSide Side[2];
23 udi_channel_t UDI_CreateChannel(enum eUDI_MetaLang metalang, udi_index_t meta_ops_num,
24 tUDI_DriverInstance *ThisEnd, udi_index_t ThisOpsIndex,
25 tUDI_DriverInstance *OtherEnd, udi_index_t OtherOpsIndex)
27 tUDI_Channel *ret = NEW(tUDI_Channel,);
28 ret->MetaLang = metalang;
29 ret->Side[0].BackPtr = ret;
30 // ret->Side[0].Ops = ThisEnd->Module->InitInfo->Op;
31 ret->Side[1].BackPtr = ret;
32 return (udi_channel_t)&ret->Side[0].BackPtr;
35 const void *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, enum eUDI_MetaLang metalang)
37 tUDI_Channel *ch = *(tUDI_Channel**)(gcb->channel);
38 ASSERTCR(ch->MetaLang, ==, metalang, NULL);
40 struct sUDI_ChannelSide *newside = (gcb->channel == (udi_channel_t)&ch->Side[0].BackPtr ? &ch->Side[1] : &ch->Side[0]);
42 // gcb->initiator_context = gcb->context;
43 gcb->channel = (udi_channel_t)&newside->BackPtr;
44 gcb->context = newside->Context;