typedef mig_stub_routine_t mig_routine_t;
/*
- * Definition for server implementation routines. This is the routine
- * called by the MIG-generated server stub routine.
+ * Definition for MIG-generated server routine. This routine takes a
+ * message, and returns the appropriate stub function for handling that
+ * message.
+ */
+typedef mig_routine_t (*mig_server_routine_t) (mach_msg_header_t *InHeadP);
+
+/*
+ * Generic definition for implementation routines. These routines do
+ * the real work associated with this request. This generic type is
+ * used for keeping the pointers in the subsystem array.
*/
typedef kern_return_t (*mig_impl_routine_t)(void);
-typedef mig_impl_routine_t entry_function_t;
+typedef struct mig_routine_descriptor {
+ mig_stub_routine_t stub_routine; /* Unmarshalling function */
+ mach_msg_size_t max_reply_msg; /* Max size for this reply */
+} mig_routine_descriptor;
+typedef mig_routine_descriptor *mig_routine_descriptor_t;
+
+typedef struct mig_subsystem {
+ mig_server_routine_t server; /* server routine */
+ mach_msg_id_t start; /* Min routine number */
+ mach_msg_id_t end; /* Max routine number + 1 */
+ mach_msg_size_t max_reply; /* Max reply message size */
+ mach_msg_size_t max_request; /* Max request msg size */
+ mig_routine_descriptor routine[1]; /* Routine descriptor array */
+} *mig_subsystem_t;
+
+#ifdef KERNEL_PRIVATE
+/*
+ * MIG object runtime definitions
+ *
+ * Conforming MIG subsystems may enable this support to get
+ * significant assistance from the base mig_object_t implementation.
+ *
+ * Support includes:
+ * - Transparency from port manipulation.
+ * - Dymanic port allocation on first "remoting" of an object.
+ * - Reference conversions from object to port and vice versa.
+ * - Automatic port deallocation on no-more-senders.
+ * - Support for multiple server implementations in a single space.
+ * - Messaging bypass for local servers.
+ * - Automatic hookup to base dispatch mechanism.
+ * - General notification support
+ * Coming soon:
+ * - User-level support
+ */
+typedef unsigned int mig_notify_type_t;
+
+typedef struct MIGIID {
+ unsigned long data1;
+ unsigned short data2;
+ unsigned short data3;
+ unsigned char data4[8];
+} MIGIID;
+
+typedef struct IMIGObjectVtbl IMIGObjectVtbl;
+typedef struct IMIGNotifyObjectVtbl IMIGNotifyObjectVtbl;
+
+typedef struct IMIGObject {
+ IMIGObjectVtbl *pVtbl;
+} IMIGObject;
+
+typedef struct IMIGNotifyObject {
+ IMIGNotifyObjectVtbl *pVtbl;
+} IMIGNotifyObject;
+
+struct IMIGObjectVtbl {
+ kern_return_t (*QueryInterface)(
+ IMIGObject *object,
+ const MIGIID *iid,
+ void **ppv);
+
+ unsigned long (*AddRef)(
+ IMIGObject *object);
+
+ unsigned long (*Release)(
+ IMIGObject *object);
+
+ unsigned long (*GetServer)(
+ IMIGObject *object,
+ mig_server_routine_t *server);
+
+ boolean_t (*RaiseNotification)(
+ IMIGObject *object,
+ mig_notify_type_t notify_type);
+
+ boolean_t (*RequestNotification)(
+ IMIGObject *object,
+ IMIGNotifyObject *notify,
+ mig_notify_type_t notify_type);
+};
+
+/*
+ * IMIGNotifyObject
+ *
+ * A variant of the IMIGObject interface that is a sink for
+ * MIG notifications.
+ *
+ * A reference is held on both the subject MIGObject and the target
+ * MIGNotifyObject. Because of this, care must be exercised to avoid
+ * reference cycles. Once a notification is raised, the object
+ * reference is returned and the request must be re-requested (if
+ * desired).
+ *
+ * One interesting note: because this interface is itself a MIG
+ * object, one may request notification about state changes in
+ * the MIGNotifyObject itself.
+ */
+struct IMIGNotifyObjectVtbl {
+ kern_return_t (*QueryInterface)(
+ IMIGNotifyObject *notify,
+ const MIGIID *iid,
+ void **ppv);
+
+ unsigned long (*AddRef)(
+ IMIGNotifyObject *notify);
+
+ unsigned long (*Release)(
+ IMIGNotifyObject *notify);
+
+ unsigned long (*GetServer)(
+ IMIGNotifyObject *notify,
+ mig_server_routine_t *server);
+
+ boolean_t (*RaiseNotification)(
+ IMIGNotifyObject *notify,
+ mig_notify_type_t notify_type);
+
+ boolean_t (*RequestNotification)(
+ IMIGNotifyObject *notify,
+ IMIGNotifyObject *notify_notify,
+ mig_notify_type_t notify_type);
+
+ void (*HandleNotification)(
+ IMIGNotifyObject *notify,
+ IMIGObject *object,
+ mig_notify_type_t notify_type);
+};
+
+#endif /* KERNEL_PRIVATE */
#endif /* _MACH_MIG_H_ */