]> Zhao Yanbai Git Server - minix.git/commitdiff
ipc.h - IPC defined as functions again
authorTomas Hruby <tom@minix3.org>
Wed, 14 Nov 2012 22:00:29 +0000 (22:00 +0000)
committerTomas Hruby <thruby@few.vu.nl>
Thu, 15 Nov 2012 15:51:59 +0000 (16:51 +0100)
- CHOOSETRAP define makes impossible to use some common words
  like send, receive and notify in any other context, for
  instance as members or structures

- any reasonable compiler inlines the static inline functions so
  no extra function call overhead is introduced by this change

- this gets us back to the situation before the SYSCALL/SYSENTER
  change. It is not perfect, but it used to work and still does.

include/minix/ipc.h
servers/procfs/root.c

index 48a92da521b47e8d62db9c946623a98557f0b71c..c8c4efbf74e4788595bc64e3a23e4bbbd86ae092 100644 (file)
@@ -163,6 +163,15 @@ int _do_kernel_call_orig(message *m_ptr);
 
 int _minix_kernel_info_struct(struct minix_kerninfo **);
 
+/* Hide names to avoid name space pollution. */
+#define notify          _notify
+#define sendrec         _sendrec
+#define receive         _receive
+#define receivenb       _receivenb
+#define send            _send
+#define sendnb          _sendnb
+#define senda           _senda
+
 struct minix_ipcvecs {
        int (*send_ptr)(endpoint_t dest, message *m_ptr);
        int (*receive_ptr)(endpoint_t src, message *m_ptr, int *st);
@@ -176,14 +185,39 @@ struct minix_ipcvecs {
 /* kernel-set IPC vectors retrieved by a constructor in libc/sys-minix/init.c */
 extern struct minix_ipcvecs _minix_ipcvecs;
 
-#define CHOOSETRAP(name) (_minix_ipcvecs. name ## _ptr)
+static inline int _send(endpoint_t dest, message *m_ptr)
+{
+       return _minix_ipcvecs.send_ptr(dest, m_ptr);
+}
+
+static inline int _receive(endpoint_t src, message *m_ptr, int *st)
+{
+       return _minix_ipcvecs.receive_ptr(src, m_ptr, st);
+}
 
-#define send           CHOOSETRAP(send)
-#define receive                CHOOSETRAP(receive)
-#define sendrec                CHOOSETRAP(sendrec)
-#define sendnb         CHOOSETRAP(sendnb)
-#define notify         CHOOSETRAP(notify)
-#define do_kernel_call CHOOSETRAP(do_kernel_call)
-#define senda          CHOOSETRAP(senda)
+static inline int _sendrec(endpoint_t src_dest, message *m_ptr)
+{
+       return _minix_ipcvecs.sendrec_ptr(src_dest, m_ptr);
+}
+
+static inline int _sendnb(endpoint_t dest, message *m_ptr)
+{
+       return _minix_ipcvecs.send_ptr(dest, m_ptr);
+}
+
+static inline int _notify(endpoint_t dest)
+{
+       return _minix_ipcvecs.notify_ptr(dest);
+}
+
+static inline int do_kernel_call(message *m_ptr)
+{
+       return _minix_ipcvecs.do_kernel_call_ptr(m_ptr);
+}
+
+static inline int _senda(asynmsg_t *table, size_t count)
+{
+       return _minix_ipcvecs.senda_ptr(table, count);
+}
 
 #endif /* _IPC_H */
index f97a9dad47afbc09a8a93b81df81fe66a9e4351b..44ee10539bb5d179225ee9be5fcdcab8820bc207 100644 (file)
@@ -185,7 +185,7 @@ static void root_ipcvecs(void)
         * to distinguish them from regular symbols.
         */
 #define PRINT_ENTRYPOINT(name) \
-       buf_printf("%08lx T %s(k)\n", _minix_ipcvecs.name ## _ptr, #name)
+       buf_printf("%08lx T %s(k)\n", _minix_ipcvecs.name, #name)
 
        PRINT_ENTRYPOINT(sendrec);
        PRINT_ENTRYPOINT(send);