[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Confusing definitions and declarations of mig_dealloc_reply_port()
From: |
Svante Signell |
Subject: |
Confusing definitions and declarations of mig_dealloc_reply_port() |
Date: |
Tue, 03 Nov 2015 13:51:03 +0100 |
Hello,
The definitions and declarations of mig_dealloc_reply_port() are
confusing, some use an argument, some don't:
Declaration (function argument): glibc-2.19/mach/mach/mig_support.h
/* Reply-port management support functions. */
extern void __mig_dealloc_reply_port (mach_port_t);
extern void mig_dealloc_reply_port (mach_port_t);
Definition (no function argument): glibc/sysdeps/mach/hurd/mig-reply.c
/* Called by MiG to deallocate the reply port. */
void __mig_dealloc_reply_port (mach_port_t arg)
{
mach_port_t port = __hurd_local_reply_port;
__hurd_local_reply_port = MACH_PORT_NULL; /* So the mod_refs RPC
won't use it. */
if (MACH_PORT_VALID (port))
__mach_port_mod_refs (__mach_task_self (), port,
MACH_PORT_RIGHT_RECEIVE, -1);
}
weak_alias (__mig_dealloc_reply_port, mig_dealloc_reply_port)
Calls in glibc (function argument): glibc/sysdeps/mach/hurd/dl-sysdep.c
/* Deallocate the reply port and task port rights acquired by
__mach_init. We are done with them now, and the user will
reacquire them for himself when he wants them. */
__mig_dealloc_reply_port (MACH_PORT_NULL);
Calls in mig: mig-1.4/user.c
static void
WriteMsgCheckReceive(FILE *file, const routine_t *rt, const char
*success)
{
...
/* If we aren't using a user-supplied reply port,
then deallocate the reply port on any message transmission
errors. */
fprintf(file, "\t\t%smig_dealloc_reply_port(%s);\n",
SubrPrefix, "InP->Head.msgh_reply_port");
...
}
static void
WriteCheckIdentity(FILE *file, const routine_t *rt)
{
...
fprintf(file, "\t\telse {\n");
fprintf(file, "\t\t\t%smig_dealloc_reply_port(%s);\n\t",
SubrPrefix,"InP->Head.msgh_reply_port");
WriteMsgError(file, rt, "MIG_REPLY_MISMATCH");
...
}
WriteGlobalDecls(FILE *file)
{
...
fprintf(file, "#define msgh_reply_port\t\tmsgh_local_port\n");
...
}
Since the mach_msg_header_t struct in mach/message.h has a
member msgh_local_port and the above the msgh_reply_port referred to
the InP struct in mig/user.c should be the same (true?) as
_hurd_local_reply_port in mig-reply.c the functionality should not
affected. Hence, no bug here??
_hurd_reply_port is defined in /usr/include/hurd/threadvar.h:
#define __hurd_local_reply_port (*(__LIBC_NO_TLS() ?
&__hurd_reply_port0 : &THREAD_SELF->reply_port))
and __LIBC_NO_TLS() is defined at compile/runtime
in sysdeps/mach/hurd/i386/tls.h:
#define __LIBC_NO_TLS() \
({ unsigned short ds,gs; \
asm ("movw %%ds,%w0; movw %%gs,%w1" : "=q" (ds), "=q" (gs)); \
ds == gs; })
which returns to ?? (probable result: &THREAD_SELF->reply_port)
However, it's confusing that the definition of _mig_dealloc_reply_port
in mig-reply.c ignores the function argument and the calls in mig and
dl-sysdeps.c do use an argument, a patch like the one below could make
things much clearer:
Index: glibc-2.19/sysdeps/mach/hurd/mig-reply.c
===================================================================
--- glibc-2.19.orig/sysdeps/mach/hurd/mig-reply.c
+++ glibc-2.19/sysdeps/mach/hurd/mig-reply.c
@@ -39,7 +39,7 @@ weak_alias (__mig_get_reply_port, mig_ge
void
__mig_dealloc_reply_port (mach_port_t arg)
{
- mach_port_t port = __hurd_local_reply_port;
+ mach_port_t port = arg;
__hurd_local_reply_port = MACH_PORT_NULL; /* So the mod_refs RPC
won't use it. */
if (MACH_PORT_VALID (port))
Another solution could be to remove the argument in the
mig_dealloc_reply_port definition, but that would require a change also
to mig.
- Confusing definitions and declarations of mig_dealloc_reply_port(),
Svante Signell <=
- Message not available
- Re: Confusing definitions and declarations of mig_dealloc_reply_port(), Svante Signell, 2015/11/04
- Re: Confusing definitions and declarations of mig_dealloc_reply_port(), Diego Nieto Cid, 2015/11/04
- Re: Confusing definitions and declarations of mig_dealloc_reply_port(), Samuel Thibault, 2015/11/04
- Re: Confusing definitions and declarations of mig_dealloc_reply_port(), Svante Signell, 2015/11/04
- Re: Confusing definitions and declarations of mig_dealloc_reply_port(), Samuel Thibault, 2015/11/04
- Re: Confusing definitions and declarations of mig_dealloc_reply_port(), Diego Nieto Cid, 2015/11/04
- Re: Confusing definitions and declarations of mig_dealloc_reply_port(), Svante Signell, 2015/11/05
- Re: Confusing definitions and declarations of mig_dealloc_reply_port(), Pino Toscano, 2015/11/05
- Re: Confusing definitions and declarations of mig_dealloc_reply_port(), Svante Signell, 2015/11/05
- Re: Confusing definitions and declarations of mig_dealloc_reply_port(), Samuel Thibault, 2015/11/06