summaryrefslogtreecommitdiff
path: root/libports
diff options
context:
space:
mode:
authorMichael I. Bushnell <mib@gnu.org>1996-07-19 03:03:01 +0000
committerMichael I. Bushnell <mib@gnu.org>1996-07-19 03:03:01 +0000
commitf030ef4e9d02fc0c88113a569773e49d629e9aa2 (patch)
treec96f17048883df9ad379ea90ae08c8791bf83f21 /libports
parentd8035e3320dd1045c5bb6b97c7a16dff19e0f8ef (diff)
*** empty log message ***
Diffstat (limited to 'libports')
-rw-r--r--libports/ChangeLog7
-rw-r--r--libports/create-port.c76
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;
-}