Everything You Always Wanted (cid:1) To Know About MIG (cid:1) But Were Afraid To Ask Richard P(cid:1) Draves rpd(cid:1)cs(cid:2)cmu(cid:2)edu School of Computer Science Carnegie Mellon University Pittsburgh(cid:2) PA (cid:3)(cid:4)(cid:5)(cid:3)(cid:6) (cid:1) Mig (cid:2) Stub generator for Mach IPC(cid:1) (cid:2) Pack(cid:2) unpack(cid:2) demultiplex messages(cid:1) (cid:2) NOT transparent language(cid:7)level RPCs(cid:1) (cid:2) Doesn(cid:8)t hide IPC features(cid:1) (cid:2) Assumes client(cid:9)server model(cid:1) (cid:2) Mig History early Matchmaker Mary Thompson Keith Wright Mike Jones - exceptions Mike Young - C late Matchmaker Mike Jones real types Lisp, Pascal, C MIG Mike Young Rich Draves - rewrote Draves & Golub - features (cid:3) Mig Programming Model (cid:2) Clients call stubs mach(cid:1)port(cid:1)t server(cid:1)port(cid:2) kr (cid:3) getbalance(cid:4)server(cid:1)port(cid:5) (cid:6)balance(cid:7)(cid:2) (cid:2) Server loop processes requests extern boolean(cid:1)t bank(cid:1)server(cid:4)(cid:7)(cid:2) mach(cid:1)port(cid:1)t server(cid:1)port(cid:2) (cid:8)define MAX(cid:1)SIZE (cid:9)(cid:10)(cid:11) (cid:4)void(cid:7) mach(cid:1)msg(cid:1)server(cid:4)bank(cid:1)server(cid:5) MAX(cid:1)SIZE(cid:5) server(cid:1)port(cid:7)(cid:2) kern(cid:1)return(cid:1)t getbalance(cid:4)server(cid:1)port(cid:5) balance(cid:7) mach(cid:1)port(cid:1)t server(cid:1)port(cid:2) int (cid:12)balance(cid:2) (cid:13)(cid:12) out (cid:12)(cid:13) (cid:14) (cid:15)(cid:15)(cid:15) (cid:16) (cid:4) Mig Example (cid:13)(cid:12) file example(cid:15)defs (cid:12)(cid:13) subsystem example (cid:17)(cid:18)(cid:11)(cid:19)(cid:20)(cid:2) (cid:8)include (cid:21)mach(cid:13)std(cid:1)types(cid:15)defs(cid:22) (cid:13)(cid:12) manipulate a bank account (cid:12)(cid:13) routine getbalance(cid:4) server (cid:23) mach(cid:1)port(cid:1)t(cid:2) out balance (cid:23) int(cid:7)(cid:2) Client call(cid:10) (cid:8)include (cid:24)example(cid:15)h(cid:24) mach(cid:1)port(cid:1)t server(cid:2) int balance(cid:2) kern(cid:1)return(cid:1)t kr(cid:2) kr (cid:3) getbalance(cid:4)server(cid:5) (cid:6)balance(cid:7)(cid:2) Server function(cid:10) kern(cid:1)return(cid:1)t getbalance(cid:4)server(cid:5) balance(cid:7) mach(cid:1)port(cid:1)t server(cid:2) int (cid:12)balance(cid:2) (cid:13)(cid:12) out (cid:12)(cid:13) (cid:14) (cid:12)balance (cid:3) server(cid:1)balance(cid:2) return KERN(cid:1)SUCCESS(cid:2) (cid:16) (cid:5) Type De(cid:1)nitions (cid:13)(cid:12) from mach(cid:13)std(cid:1)types(cid:15)defs (cid:12)(cid:13) type mach(cid:1)port(cid:1)t (cid:3) MACH(cid:1)MSG(cid:1)TYPE(cid:1)COPY(cid:1)SEND(cid:2) type int (cid:3) MACH(cid:1)MSG(cid:1)TYPE(cid:1)INTEGER(cid:1)(cid:17)(cid:11)(cid:2) type kern(cid:1)return(cid:1)t (cid:3) int(cid:2) (cid:13)(cid:12) pointer to out(cid:25)of(cid:25)line memory (cid:12)(cid:13) type pointer(cid:1)t (cid:3) (cid:26)array(cid:27)(cid:28) of MACH(cid:1)MSG(cid:1)TYPE(cid:1)BYTE(cid:2) (cid:13)(cid:12) a (cid:17)(cid:18)(cid:25)byte structure (cid:12)(cid:13) type mach(cid:1)port(cid:1)status(cid:1)t (cid:3) struct(cid:27)(cid:29)(cid:28) of int(cid:2) (cid:13)(cid:12) C declarations for these types (cid:12)(cid:13) import (cid:21)mach(cid:13)std(cid:1)types(cid:15)h(cid:22)(cid:2) (cid:6) Asynchronous Messages (cid:13)(cid:12) file example(cid:15)defs (cid:12)(cid:13) subsystem example (cid:17)(cid:18)(cid:11)(cid:19)(cid:20)(cid:2) (cid:8)include (cid:21)mach(cid:13)std(cid:1)types(cid:15)defs(cid:22) (cid:13)(cid:12) set bank account balance (cid:12)(cid:13) routine setbalance(cid:4) server (cid:23) mach(cid:1)port(cid:1)t(cid:2) in balance (cid:23) int(cid:7)(cid:2) (cid:13)(cid:12) set it with an asynchronous message (cid:12)(cid:13) simpleroutine asetbalance(cid:4) server (cid:23) mach(cid:1)port(cid:1)t(cid:2) in balance (cid:23) int(cid:7)(cid:2) (cid:1) Client and server code looks like RPC(cid:1) (cid:1) Message(cid:2)ordering problems in multi(cid:2)threaded servers(cid:1) (cid:1) Control(cid:2)(cid:3)ow worries(cid:1) (cid:1) Not recommended for general use(cid:1) (cid:7) Asynchronous Messages Client call(cid:10) (cid:8)include (cid:24)example(cid:15)h(cid:24) mach(cid:1)port(cid:1)t server(cid:2) int balance(cid:2) kern(cid:1)return(cid:1)t kr(cid:2) kr (cid:3) setbalance(cid:4)server(cid:5) balance(cid:7)(cid:2) (cid:15)(cid:15)(cid:15) kr (cid:3) asetbalance(cid:4)server(cid:5) balance(cid:7)(cid:2) Server function(cid:10) kern(cid:1)return(cid:1)t setbalance(cid:4)server(cid:5) balance(cid:7) mach(cid:1)port(cid:1)t server(cid:2) int balance(cid:2) (cid:13)(cid:12) in (cid:12)(cid:13) (cid:14) server(cid:1)balance (cid:3) balance(cid:2) return KERN(cid:1)SUCCESS(cid:2) (cid:16) kern(cid:1)return(cid:1)t asetbalance(cid:4)server(cid:5) balance(cid:7) mach(cid:1)port(cid:1)t server(cid:2) int balance(cid:2) (cid:13)(cid:12) in (cid:12)(cid:13) (cid:14) server(cid:1)balance (cid:3) balance(cid:2) return KERN(cid:1)SUCCESS(cid:2) (cid:16) (cid:8) Structure Arguments (cid:13)(cid:12) file example(cid:15)defs (cid:12)(cid:13) subsystem example (cid:17)(cid:18)(cid:11)(cid:19)(cid:20)(cid:2) (cid:8)include (cid:21)mach(cid:13)std(cid:1)types(cid:15)defs(cid:22) (cid:8)include (cid:24)example(cid:1)types(cid:15)defs(cid:24) routine structdemo(cid:4) server (cid:23) mach(cid:1)port(cid:1)t(cid:2) in arg(cid:10) (cid:23) small(cid:1)struct(cid:1)t(cid:2) out arg(cid:11) (cid:23) small(cid:1)struct(cid:1)t(cid:2) inout arg(cid:17) (cid:23) small(cid:1)struct(cid:1)t(cid:7)(cid:2) (cid:13)(cid:12) file example(cid:1)types(cid:15)defs (cid:12)(cid:13) (cid:8)include (cid:21)mach(cid:13)std(cid:1)types(cid:15)defs(cid:22) type small(cid:1)struct(cid:1)t (cid:3) struct(cid:27)(cid:17)(cid:28) of int(cid:2) import (cid:24)example(cid:1)types(cid:15)h(cid:24)(cid:2) (cid:13)(cid:12) file example(cid:1)types(cid:15)h (cid:12)(cid:13) (cid:8)ifndef (cid:1)EXAMPLE(cid:1)TYPES(cid:1)H(cid:1) (cid:8)define (cid:1)EXAMPLE(cid:1)TYPES(cid:1)H(cid:1) typedef struct small(cid:1)struct (cid:14) int one(cid:2) int two(cid:27)(cid:11)(cid:28)(cid:2) (cid:16) small(cid:1)struct(cid:1)t(cid:2) (cid:8)endif (cid:1)EXAMPLE(cid:1)TYPES(cid:1)H(cid:1) (cid:9) Structure Arguments Client call(cid:10) (cid:8)include (cid:24)example(cid:15)h(cid:24) mach(cid:1)port(cid:1)t server(cid:2) small(cid:1)struct(cid:1)t arg(cid:10)(cid:5) arg(cid:11)(cid:5) arg(cid:17)(cid:2) kern(cid:1)return(cid:1)t kr(cid:2) kr (cid:3) structdemo(cid:4)server(cid:5) arg(cid:10)(cid:5) (cid:6)arg(cid:11)(cid:5) (cid:6)arg(cid:17)(cid:7)(cid:2) Server function(cid:10) kern(cid:1)return(cid:1)t structdemo(cid:4)server(cid:5) arg(cid:10)(cid:5) arg(cid:11)(cid:5) arg(cid:17)(cid:7) mach(cid:1)port(cid:1)t server(cid:2) small(cid:1)struct(cid:1)t arg(cid:10)(cid:2) (cid:13)(cid:12) in (cid:12)(cid:13) small(cid:1)struct(cid:1)t (cid:12)arg(cid:11)(cid:2) (cid:13)(cid:12) out (cid:12)(cid:13) small(cid:1)struct(cid:1)t (cid:12)arg(cid:17)(cid:2) (cid:13)(cid:12) inout (cid:12)(cid:13) (cid:14) (cid:12)arg(cid:11) (cid:3) (cid:12)arg(cid:17)(cid:2) (cid:12)arg(cid:17) (cid:3) arg(cid:10)(cid:2) return KERN(cid:1)SUCCESS(cid:2) (cid:16) (cid:1)(cid:10)
Description: