diff options
Diffstat (limited to 'libports/create-internal.c')
-rw-r--r-- | libports/create-internal.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/libports/create-internal.c b/libports/create-internal.c index bc97ce62..7a9b1cb0 100644 --- a/libports/create-internal.c +++ b/libports/create-internal.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996,2001 Free Software Foundation, Inc. Written by Michael I. Bushnell, p/BSG. This file is part of the GNU Hurd. @@ -48,7 +48,9 @@ _ports_create_port_internal (struct port_class *class, pi = malloc (size); if (! pi) { - mach_port_deallocate (mach_task_self (), port); + err = mach_port_mod_refs (mach_task_self (), port, + MACH_PORT_RIGHT_RECEIVE, -1); + assert_perror (err); return ENOMEM; } @@ -80,7 +82,7 @@ _ports_create_port_internal (struct port_class *class, goto loop; } - err = ihash_add (bucket->htable, port, pi, &pi->hentry); + err = hurd_ihash_add (&bucket->htable, port, pi); if (err) goto lose; @@ -94,7 +96,12 @@ _ports_create_port_internal (struct port_class *class, mutex_unlock (&_ports_lock); if (install) - mach_port_move_member (mach_task_self (), pi->port_right, bucket->portset); + { + err = mach_port_move_member (mach_task_self (), pi->port_right, + bucket->portset); + if (err) + goto lose_unlocked; + } *(void **)result = pi; return 0; @@ -103,7 +110,10 @@ _ports_create_port_internal (struct port_class *class, err = EINTR; lose: mutex_unlock (&_ports_lock); - mach_port_mod_refs (mach_task_self (), port, MACH_PORT_RIGHT_RECEIVE, -1); + lose_unlocked: + err = mach_port_mod_refs (mach_task_self (), port, + MACH_PORT_RIGHT_RECEIVE, -1); + assert_perror (err); free (pi); return err; |