/* rmc.c */ /* Resource manager client */ #include #include #include #define MAX_RES 16 #define CODE_READ 11 #define CODE_WRITE 12 #define CODE_FREE 13 #define CLIENT_BOX "/rm.client1" struct rrtype { char reply_to[12]; /* Name of reply msg queue */ int client_id; /* Logical id of the client proc. */ int request_id; /* For matching reqs w/ replies. */ int resource_id; /* Value 0 - MAX_RES -1 */ int action; /* 11 = Rd | 12 = Wrt | 13 = Free */ }; /* Skeleton of a request message */ struct rrtype mskel = { CLIENT_BOX, 1, 0, 0, 0 }; /* Reply box attributes */ struct mq_attr mqattr = { 0, 40, sizeof(struct rrtype), 0 }; /* Print a message */ void printbuf( struct rrtype *rr) { printf("\n %-12s %4d %4d %4d %4d \n", rr->reply_to, rr->client_id, rr->request_id, rr->resource_id, rr->action); } void main( int argc, char **argv) { mqd_t mqs; mqd_t mqr; int i; struct rrtype sbuf; struct rrtype rbuf; mqs = mq_open("/rm.server", O_WRONLY, 0700, NULL); mqr = mq_open(CLIENT_BOX, O_CREAT | O_RDONLY, 0700, &mqattr); /* Send bunch of read requests */ for (i = 0; i < 32; i++) { memcpy(&sbuf, &mskel, sizeof(struct rrtype)); sbuf.request_id = i + 1; sbuf.resource_id = i % MAX_RES; sbuf.action = CODE_READ; mq_send(mqs, (char *)&sbuf, sizeof(sbuf), NULL); } /* Get back the permissions... and release resources */ for (i = 0; i < 32; i++) { mq_receive(mqr, (char *)&rbuf, sizeof(rbuf), NULL); printbuf(&rbuf); rbuf.action = CODE_FREE; mq_send(mqs, (char *)&rbuf, sizeof(rbuf), NULL); } /* Send and receive some write requests */ for (i = 0; i < 32; i++) { memcpy(&sbuf, &mskel, sizeof(struct rrtype)); sbuf.request_id = i + 1; sbuf.resource_id = i % MAX_RES; sbuf.action = CODE_WRITE; mq_send(mqs, (char *)&sbuf, sizeof(sbuf), NULL); mq_receive(mqr, (char *)&rbuf, sizeof(rbuf), NULL); printbuf(&rbuf); rbuf.action = CODE_FREE; mq_send(mqs, (char *)&rbuf, sizeof(rbuf), NULL); } mq_unlink(CLIENT_BOX); } /* Yes, it is the case that request id's are being "recycled" */