⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sema.patch

📁 MINIX操作系统的内核修改补丁
💻 PATCH
📖 第 1 页 / 共 2 页
字号:
+ #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 + -