3 * \author John Hodge (thePowersGang)
8 #include <udi_internal.h>
9 #include <udi_internal_ma.h>
12 EXPORT(udi_channel_anchor);
13 EXPORT(udi_channel_spawn);
14 EXPORT(udi_channel_set_context);
15 EXPORT(udi_channel_op_abort);
16 EXPORT(udi_channel_close);
17 EXPORT(udi_channel_event_ind);
18 EXPORT(udi_channel_event_complete);
23 void udi_channel_anchor(
24 udi_channel_anchor_call_t *callback, udi_cb_t *gcb,
25 udi_channel_t channel, udi_index_t ops_idx, void *channel_context
33 extern void udi_channel_spawn(
34 udi_channel_spawn_call_t *callback, udi_cb_t *gcb,
35 udi_channel_t channel, udi_index_t spawn_idx,
36 udi_index_t ops_idx, void *channel_context
39 LOG("gcb=%p,channel=%p", gcb, channel, spawn_idx, ops_idx, channel_context);
41 // Search existing channel for a matching spawn_idx
42 udi_channel_t ret = UDI_CreateChannel_Linked(channel, spawn_idx);
44 // Bind local end of channel to ops_idx (with channel_context)
47 udi_index_t region_idx;
48 tUDI_DriverInstance *inst = UDI_int_ChannelGetInstance(gcb, false, ®ion_idx);
49 UDI_BindChannel(ret, false, inst, ops_idx, region_idx, channel_context, false,0);
62 void udi_channel_set_context(
63 udi_channel_t target_channel, void *channel_context
66 LOG("target_channel=%p,channel_context=%p", target_channel, channel_context);
67 UDI_int_ChannelSetContext(target_channel, channel_context);
70 void udi_channel_op_abort(
71 udi_channel_t target_channel, udi_cb_t *orig_cb
74 udi_channel_event_cb_t cb;
75 cb.gcb.channel = target_channel;
76 cb.event = UDI_CHANNEL_CLOSED;
77 cb.params.orig_cb = orig_cb;
78 udi_channel_event_ind(&cb);
81 void udi_channel_close(udi_channel_t channel)
83 Warning("%s Unimplemented", __func__);
86 void udi_channel_event_ind(udi_channel_event_cb_t *cb)
88 LOG("cb=%p{...}", cb);
90 udi_channel_event_ind_op_t *channel_event_ind_op;
91 } *ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), NULL, 0 );
93 Log_Warning("UDI", "udi_channel_event_ind on wrong channel type");
97 // UDI_int_MakeDeferredCb( UDI_GCB(cb), ops->channel_event_ind_op );
99 UDI_int_ChannelReleaseFromCall( UDI_GCB(cb) );
100 ops->channel_event_ind_op(cb);
103 void udi_channel_event_complete(udi_channel_event_cb_t *cb, udi_status_t status)
105 LOG("cb=%p,status=%i", cb, status);
106 UDI_MA_TransitionState( UDI_GCB(cb)->initiator_context, UDI_MASTATE_PARENTBIND, UDI_MASTATE_ENUMCHILDREN );
107 udi_cb_free( UDI_GCB(cb) );