Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Data Store Server.
- * This service implements a little publish/subscribe data store that is
- * crucial for the system's fault tolerance. Components that require state
- * can store it here, for later retrieval, e.g., after a crash and subsequent
- * restart by the reincarnation server.
- *
- * Created:
- * Oct 19, 2005 by Jorrit N. Herder
- */
- #include "inc.h" /* include master header file */
- #include <minix/endpoint.h>
- /* Allocate space for the global variables. */
- static endpoint_t who_e; /* caller's proc number */
- static int callnr; /* system call number */
- /* Declare some local functions. */
- static void get_work(message *m_ptr);
- static void reply(endpoint_t whom, message *m_ptr);
- /* SEF functions and variables. */
- static void sef_local_startup(void);
- static int pgmem[PG_MEM_SIZE];
- /*===========================================================================*
- * main *
- *===========================================================================*/
- int main(int argc, char **argv)
- {
- /* This is the main routine of this service. The main loop consists of
- * three major activities: getting new work, processing the work, and
- * sending the reply. The loop never terminates, unless a panic occurs.
- */
- message m;
- int result;
- /* SEF local startup. */
- env_setargs(argc, argv);
- sef_local_startup();
- /* Main loop - get work and do it, forever. */
- while (TRUE) {
- /* Wait for incoming message, sets 'callnr' and 'who'. */
- get_work(&m);
- switch(callnr)
- {
- case writeTest: pgmem[m.m_m1.m1i1] = m.m_m1.m1i2; m.m_type = 1; break;
- case readTest: m.m_m1.m1i2=pgmem[m.m_m1.m1i1]; m.m_type = 2; break;
- default: m.m_type = 3; break;
- }
- /* Finally send reply message, unless disabled. */
- reply(who_e, &m); /* send it away */
- }
- return(OK); /* shouldn't come here */
- }
- /*===========================================================================*
- * sef_local_startup *
- *===========================================================================*/
- static void sef_local_startup()
- {
- /* Register init callbacks. */
- sef_setcb_init_fresh(sef_cb_init_fresh);
- sef_setcb_init_restart(sef_cb_init_fail);
- /* No live update support for now. */
- /* Let SEF perform startup. */
- sef_startup();
- }
- /*===========================================================================*
- * sef_cb_init_fresh *
- *===========================================================================*/
- int sef_cb_init_fresh(int UNUSED(type), sef_init_info_t *info)
- {
- /* Initialize the data store server. */
- int i, r;
- for( i=0; i<PG_MEM_SIZE; i++) pgmem[i]=0;
- pgmem[4]=6; pgmem[5]=3;
- return(OK);
- }
- /*===========================================================================*
- * get_work *
- *===========================================================================*/
- static void get_work(
- message *m_ptr /* message buffer */
- )
- {
- int status = sef_receive(ANY, m_ptr); /* blocks until message arrives */
- if (OK != status)
- panic("failed to receive message!: %d", status);
- who_e = m_ptr->m_source; /* message arrived! set sender */
- callnr = m_ptr->m_type; /* set function call number */
- }
- /*===========================================================================*
- * reply *
- *===========================================================================*/
- static void reply(
- endpoint_t who_e, /* destination */
- message *m_ptr /* message buffer */
- )
- {
- int s = ipc_send(who_e, m_ptr); /* send the message */
- if (OK != s)
- printf("DS: unable to send reply to %d: %d\n", who_e, s);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement