diff options
author | Michael I. Bushnell <mib@gnu.org> | 1996-07-19 03:03:01 +0000 |
---|---|---|
committer | Michael I. Bushnell <mib@gnu.org> | 1996-07-19 03:03:01 +0000 |
commit | f030ef4e9d02fc0c88113a569773e49d629e9aa2 (patch) | |
tree | c96f17048883df9ad379ea90ae08c8791bf83f21 /libports | |
parent | d8035e3320dd1045c5bb6b97c7a16dff19e0f8ef (diff) |
*** empty log message ***
Diffstat (limited to 'libports')
-rw-r--r-- | libports/ChangeLog | 7 | ||||
-rw-r--r-- | libports/create-port.c | 76 |
2 files changed, 9 insertions, 74 deletions
diff --git a/libports/ChangeLog b/libports/ChangeLog index 4df58e87..16686e5e 100644 --- a/libports/ChangeLog +++ b/libports/ChangeLog @@ -1,3 +1,10 @@ +Thu Jul 18 22:59:14 1996 Michael I. Bushnell, p/BSG <mib@gnu.ai.mit.edu> + + * create-port-noinstall.c: New file. + * create-port.c (ports_create_port): Guts deleted; call new work + function. + * create-internal.c: New file; all the guts from create-port.c. + Wed Jul 3 14:13:53 1996 Michael I. Bushnell, p/BSG <mib@gnu.ai.mit.edu> * get-right.c (ports_get_right): Supply correct sync value in diff --git a/libports/create-port.c b/libports/create-port.c index 09ebae44..4da92d4a 100644 --- a/libports/create-port.c +++ b/libports/create-port.c @@ -20,9 +20,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "ports.h" -#include <assert.h> -#include <cthreads.h> -#include <hurd/ihash.h> /* Create and return in RESULT a new port in CLASS and BUCKET; SIZE bytes will be allocated to hold the port structure and whatever private data the @@ -31,77 +28,8 @@ error_t ports_create_port (struct port_class *class, struct port_bucket *bucket, size_t size, void *result) { - mach_port_t port; - error_t err; - struct port_info *pi; - - err = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE, - &port); - if (err) - return err; - - if (size < sizeof (struct port_info)) - size = sizeof (struct port_info); - - pi = malloc (size); - if (! pi) - { - mach_port_deallocate (mach_task_self (), port); - return ENOMEM; - } - - pi->class = class; - pi->refcnt = 1; - pi->weakrefcnt = 0; - pi->cancel_threshold = 0; - pi->mscount = 0; - pi->flags = 0; - pi->port_right = port; - pi->current_rpcs = 0; - pi->bucket = bucket; - - mutex_lock (&_ports_lock); - - loop: - if (class->flags & PORT_CLASS_NO_ALLOC) - { - class->flags |= PORT_CLASS_ALLOC_WAIT; - if (hurd_condition_wait (&_ports_block, &_ports_lock)) - goto cancelled; - goto loop; - } - if (bucket->flags & PORT_BUCKET_NO_ALLOC) - { - bucket->flags |= PORT_BUCKET_ALLOC_WAIT; - if (hurd_condition_wait (&_ports_block, &_ports_lock)) - goto cancelled; - goto loop; - } - - err = ihash_add (bucket->htable, port, pi, &pi->hentry); - if (err) - goto lose; - - pi->next = class->ports; - pi->prevp = &class->ports; - if (class->ports) - class->ports->prevp = &pi->next; - class->ports = pi; - bucket->count++; - class->count++; - mutex_unlock (&_ports_lock); - - mach_port_move_member (mach_task_self (), pi->port_right, bucket->portset); + return _ports_create_port_internal (class, bucket, size, result, 1); +} - *(void **)result = pi; - return 0; - cancelled: - err = EINTR; - lose: - mutex_unlock (&_ports_lock); - mach_port_mod_refs (mach_task_self (), port, MACH_PORT_RIGHT_RECEIVE, -1); - free (pi); - return err; -} |