summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--proc/ChangeLog11
-rw-r--r--proc/mgt.c6
2 files changed, 14 insertions, 3 deletions
diff --git a/proc/ChangeLog b/proc/ChangeLog
index 4bb36d93..772abb05 100644
--- a/proc/ChangeLog
+++ b/proc/ChangeLog
@@ -1,3 +1,14 @@
+Sun Mar 7 18:19:07 1999 Thomas Bushnell, BSG <tb@mit.edu>
+
+ * mgt.c (process_has_exited): Use mach_port_destroy instead of
+ mach_port_deallocate to release P->p_msgport.
+ (complete_exit): Likewise for P->p_task.
+ These changes eliminate a race; we are destroying the receiver of
+ the dead-name notifications on these ports, but if that means we
+ lose a notification, then the ref-count on the name will get
+ incremented and we can't re-decrement it since we never hear the
+ notification.
+
1999-03-06 Mark Kettenis <kettenis@gnu.org>
* notify.c (do_mach_notify_dead_name): Deallocate reference to
diff --git a/proc/mgt.c b/proc/mgt.c
index e8af38d4..4a8aa510 100644
--- a/proc/mgt.c
+++ b/proc/mgt.c
@@ -1,5 +1,5 @@
/* Process management
- Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1999 Free Software Foundation, Inc.
This file is part of the GNU Hurd.
@@ -652,7 +652,7 @@ process_has_exited (struct proc *p)
alert_parent (p);
if (p->p_msgport)
- mach_port_deallocate (mach_task_self (), p->p_msgport);
+ mach_port_destroy (mach_task_self (), p->p_msgport);
p->p_msgport = MACH_PORT_NULL;
prociterate ((void (*) (struct proc *, void *))check_message_dying, p);
@@ -717,7 +717,7 @@ complete_exit (struct proc *p)
remove_proc_from_hash (p);
if (p->p_task != MACH_PORT_NULL)
- mach_port_deallocate (mach_task_self (), p->p_task);
+ mach_port_destroy (mach_task_self (), p->p_task);
/* Remove us from our parent's list of children. */
if (p->p_sib)