From: Sébastien Boisvert Date: Sat, 8 Sep 2012 15:46:06 +0000 (+0200) Subject: IPC server: do not loop to find syscall handler X-Git-Tag: v3.2.1~340 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/man.rndc-confgen.html?a=commitdiff_plain;h=373cb6526c0137da96452682436159f476889d72;p=minix.git IPC server: do not loop to find syscall handler Instead of using a loop to find a matching ipc (inter process communication) system call type, the offset in the call table can be simply calculated in constant time. Also, when the interprocess communication server receives an ipc system call from a process, ipc should tell VM to watch the process only once. This patch fixes that also. (Patch and commit message slightly edited by committer.) --- diff --git a/servers/ipc/main.c b/servers/ipc/main.c index ef92bb17f..de371e598 100644 --- a/servers/ipc/main.c +++ b/servers/ipc/main.c @@ -38,7 +38,7 @@ int main(int argc, char *argv[]) while (TRUE) { int r; - int i; + int ipc_number; if ((r = sef_receive(ANY, &m)) != OK) printf("sef_receive failed %d.\n", r); @@ -62,8 +62,22 @@ int main(int argc, char *argv[]) continue; } - /* dispatch messages */ - for (i = 0; i < SIZE(ipc_calls); i++) { + /* + * The ipc number in the table can be obtained + * with a simple equation because the values of + * IPC system calls are consecutive and begin + * at ( IPC_BASE + 1 ) + */ + + ipc_number = call_type - (IPC_BASE + 1); + + /* dispatch message */ + if (ipc_number >= 0 && ipc_number < SIZE(ipc_calls)) { + int result; + + if (ipc_calls[ipc_number].type != call_type) + panic("IPC: call table order mismatch"); + /* If any process does an IPC call, * we have to know about it exiting. * Tell VM to watch it for us. @@ -72,13 +86,13 @@ int main(int argc, char *argv[]) printf("IPC: watch failed on %d\n", m.m_source); } - if (ipc_calls[i].type == call_type) { - int result; - - result = ipc_calls[i].func(&m); + result = ipc_calls[ipc_number].func(&m); - if (ipc_calls[i].reply) - break; + /* + * The handler of the IPC call did not + * post a reply. + */ + if (!ipc_calls[ipc_number].reply) { m.m_type = result; @@ -88,11 +102,8 @@ int main(int argc, char *argv[]) if ((r = sendnb(who_e, &m)) != OK) printf("IPC send error %d.\n", r); - break; } - } - - if (i == SIZE(ipc_calls)) { + } else { /* warn and then ignore */ printf("IPC unknown call type: %d from %d.\n", call_type, who_e);