📄 sema.patch
字号:
+ #include "proto.h"+ #include "glo.h"+ #include "semaphore.h"+ diff -c -Nr src.clean/servers/ss/main.c src/servers/ss/main.c*** src.clean/servers/ss/main.c 1970-01-01 08:00:00.000000000 +0800--- src/servers/ss/main.c 2008-11-16 04:34:00.000000000 +0800****************** 0 ****--- 1,145 ----+ /* Data Semaphore Server.*/+ + #include "inc.h" /* include master header file */+ + /* Allocate space for the global variables. */+ int who_e; /* caller's proc number */+ int callnr; /* system call number */+ int sys_panic; /* flag to indicate system-wide panic */+ + extern int errno; /* error number set by system library */+ + /* Declare some local functions. */+ FORWARD _PROTOTYPE(void init_server, (int argc, char **argv) );+ FORWARD _PROTOTYPE(void exit_server, (void) );+ FORWARD _PROTOTYPE(void sig_handler, (void) );+ FORWARD _PROTOTYPE(void get_work, (message *m_ptr) );+ FORWARD _PROTOTYPE(void reply, (int whom, message *m_ptr) );+ + /*===========================================================================*+ * main *+ *===========================================================================*/+ PUBLIC 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; + sigset_t sigset;+ + /* Initialize the server, then go to work. */+ init_server(argc, argv);+ + /* Main loop - get work and do it, forever. */ + while (TRUE) { + + /* Wait for incoming message, sets 'callnr' and 'who'. */+ get_work(&m);+ switch (callnr) {+ case PROC_EVENT:+ sig_handler();+ continue;+ case SS_SEMA_INIT:+ result = do_sema_init(&m);+ break;+ case SS_SEMA_DOWN:+ result = do_sema_down(&m);+ break;+ case SS_SEMA_UP:+ result = do_sema_up(&m);+ break;+ case SS_SEMA_RELEASE:+ result = do_sema_release(&m);+ break;+ default: + report("SS","warning, got illegal request from:", m.m_source);+ result = EINVAL;+ }+ + /* Finally send reply message, unless disabled. */+ if (result != EDONTREPLY) {+ m.m_type = result; /* build reply message */+ reply(who_e, &m); /* send it away */+ }+ }+ return(OK); /* shouldn't come here */+ }+ + /*===========================================================================*+ * init_server *+ *===========================================================================*/+ PRIVATE void init_server(int argc, char **argv)+ {+ /* Initialize the data store server. */+ int i, s;+ struct sigaction sigact;+ + /* Initialize all semaphores. */+ init_all_semaphore();+ + /* Install signal handler. Ask PM to transform signal into message. */+ sigact.sa_handler = SIG_MESS;+ sigact.sa_mask = ~0; /* block all other signals */+ sigact.sa_flags = 0; /* default behaviour */+ if (sigaction(SIGTERM, &sigact, NULL) < 0) + report("SS","warning, sigaction() failed", errno);+ }+ + /*===========================================================================*+ * sig_handler *+ *===========================================================================*/+ PRIVATE void sig_handler()+ {+ /* Signal handler. */+ sigset_t sigset;+ int sig;+ + /* Try to obtain signal set from PM. */+ if (getsigset(&sigset) != 0) return;+ + /* Check for known signals. */+ if (sigismember(&sigset, SIGTERM)) {+ exit_server();+ }+ }+ + /*===========================================================================*+ * exit_server *+ *===========================================================================*/+ PRIVATE void exit_server()+ {+ /* Shut down the information service. */+ + /* Done. Now exit. */+ exit(0);+ }+ + /*===========================================================================*+ * get_work *+ *===========================================================================*/+ PRIVATE void get_work(m_ptr)+ message *m_ptr; /* message buffer */+ {+ int status = 0;+ status = receive(ANY, m_ptr); /* this blocks until message arrives */+ if (OK != status)+ panic("SS","failed to receive message!", status);+ who_e = m_ptr->m_source; /* message arrived! set sender */+ callnr = m_ptr->m_type; /* set function call number */+ }+ + /*===========================================================================*+ * reply *+ *===========================================================================*/+ PRIVATE void reply(who_e, m_ptr)+ int who_e; /* destination */+ message *m_ptr; /* message buffer */+ {+ int s;+ s = send(who_e, m_ptr); /* send the message */+ if (OK != s)+ panic("SS", "unable to send reply!", s);+ }+ diff -c -Nr src.clean/servers/ss/Makefile src/servers/ss/Makefile*** src.clean/servers/ss/Makefile 1970-01-01 08:00:00.000000000 +0800--- src/servers/ss/Makefile 2008-11-15 07:05:06.000000000 +0800****************** 0 ****--- 1,42 ----+ # Makefile for Data Store Server (DS)+ SERVER = ss+ + # directories+ u = /usr+ i = $u/include+ s = $i/sys+ m = $i/minix+ b = $i/ibm+ k = $u/src/kernel+ p = $u/src/servers/pm+ f = $u/src/servers/fs+ + # programs, flags, etc.+ CC = exec cc+ CFLAGS = -I$i+ LDFLAGS = -i+ LIBS = -lsys -lsysutil + + OBJ = main.o semaphore.o + + # build local binary+ all build: $(SERVER)+ $(SERVER): $(OBJ)+ $(CC) -o $@ $(LDFLAGS) $(OBJ) $(LIBS)+ install -S 16k $@+ + # install with other servers+ install: $(SERVER)+ install -o root -c $? /sbin/$(SERVER)+ # install -o root -cs $? $@+ + # clean up local files+ clean:+ rm -f $(SERVER) *.o *.bak + + depend: + /usr/bin/mkdep "$(CC) -E $(CPPFLAGS)" *.c > .depend+ + # Include generated dependencies.+ include .depend+ diff -c -Nr src.clean/servers/ss/proto.h src/servers/ss/proto.h*** src.clean/servers/ss/proto.h 1970-01-01 08:00:00.000000000 +0800--- src/servers/ss/proto.h 2008-11-16 02:05:44.000000000 +0800****************** 0 ****--- 1,11 ----+ /* Function prototypes. */+ + /* main.c */+ _PROTOTYPE(int main, (int argc, char **argv));+ + /* semaphore.c */+ _PROTOTYPE(int init_all_semaphore, (void));+ _PROTOTYPE(int do_sema_init, (message *m_ptr));+ _PROTOTYPE(int do_sema_down, (message *m_ptr));+ _PROTOTYPE(int do_sema_up, (message *m_ptr));+ _PROTOTYPE(int do_sema_release, (message *m_ptr));diff -c -Nr src.clean/servers/ss/semaphore.c src/servers/ss/semaphore.c*** src.clean/servers/ss/semaphore.c 1970-01-01 08:00:00.000000000 +0800--- src/servers/ss/semaphore.c 2008-11-17 07:54:22.000000000 +0800****************** 0 ****--- 1,100 ----+ /* Implementation of the Semaphore Server. */+ + #include "inc.h"+ + PRIVATE Semaphore semaphores[MAX_SEMAPHORE];+ + PUBLIC int init_all_semaphore(void)+ {+ int i;+ for (i=0;i<MAX_SEMAPHORE;i++){+ semaphores[i].actived=FALSE;+ semaphores[i].begin=0;+ semaphores[i].end=0;+ semaphores[i].queue_size=0;+ }+ return(OK);+ }+ + PUBLIC int do_sema_init(m_ptr)+ message *m_ptr; /* request message */+ {+ int number;+ int value;+ number=m_ptr->SS_SEMAPHORE_NUMBER;+ value=m_ptr->SS_START_VALUE;+ if (semaphores[number].actived){+ return(EINVAL);+ }else{+ semaphores[number].actived=TRUE;+ semaphores[number].value=value;+ semaphores[number].begin=0;+ semaphores[number].end=0;+ semaphores[number].queue_size=0;+ }+ return(OK);+ }+ + + PUBLIC int do_sema_down(m_ptr)+ message *m_ptr; /* request message */+ {+ int number;+ Semaphore *s;+ number=m_ptr->SS_SEMAPHORE_NUMBER;+ s=&semaphores[number];+ if (!s->actived){+ return(EINVAL);+ }+ if (s->value > 0){+ s->value--;+ return(OK);+ }else{+ s->queue[s->end]=m_ptr->m_source;+ s->end = (s->end+1) % MAX_QUEUE_SIZE;+ s->queue_size++;+ }+ return(EDONTREPLY); + }+ + + PUBLIC int do_sema_up(m_ptr)+ message *m_ptr; /* request message */+ {+ message m;+ int number;+ Semaphore *s;+ number=m_ptr->SS_SEMAPHORE_NUMBER;+ s=&semaphores[number];+ if (!s->actived){+ return(EINVAL);+ }+ s->value++;+ if (s->queue_size>0){+ m.m_type=OK;+ m.m_source=s->queue[s->begin];+ s->begin = (s->begin+1) % MAX_QUEUE_SIZE;+ s->value--;+ s->queue_size--;+ send(m.m_source,&m);+ }+ return(OK);+ }+ + PUBLIC int do_sema_release(m_ptr)+ message *m_ptr; /* request message */+ {+ int number;+ Semaphore *s;+ number=m_ptr->SS_SEMAPHORE_NUMBER;+ s=&semaphores[number];+ if (!s->actived){+ return(EINVAL);+ }+ s->queue_size=0;+ s->begin=0;+ s->end=0;+ s->actived=FALSE;+ return(OK);+ }+ diff -c -Nr src.clean/servers/ss/semaphore.h src/servers/ss/semaphore.h*** src.clean/servers/ss/semaphore.h 1970-01-01 08:00:00.000000000 +0800--- src/servers/ss/semaphore.h 2008-11-16 00:50:29.000000000 +0800****************** 0 ****--- 1,12 ----+ #define MAX_QUEUE_SIZE 100+ #define MAX_SEMAPHORE 10+ + typedef struct{+ int value;+ int actived;+ int queue[MAX_QUEUE_SIZE];+ int begin;+ int end;+ int queue_size;+ } Semaphore;+ diff -c -Nr src.clean/tools/Makefile src/tools/Makefile*** src.clean/tools/Makefile 2008-11-15 06:52:23.000000000 +0800--- src/tools/Makefile 2008-11-15 07:33:40.000000000 +0800****************** 10,15 ****--- 10,16 ---- ../servers/pm/pm \ ../servers/fs/fs \ ../servers/rs/rs \+ ../servers/ss/ss \ ../servers/ds/ds \ ../drivers/tty/tty \ ../drivers/memory/memory \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -