aboutsummaryrefslogtreecommitdiff
path: root/hurd
diff options
context:
space:
mode:
Diffstat (limited to 'hurd')
-rw-r--r--hurd/hurd/port.h25
-rw-r--r--hurd/hurd/userlink.h24
2 files changed, 49 insertions, 0 deletions
diff --git a/hurd/hurd/port.h b/hurd/hurd/port.h
index 0779578..769e44b 100644
--- a/hurd/hurd/port.h
+++ b/hurd/hurd/port.h
@@ -127,6 +127,31 @@ _hurd_port_get (struct hurd_port *port,
#endif
+/* Relocate LINK to NEW_LINK.
+ To be used when e.g. reallocating a link array. */
+
+extern void
+_hurd_port_move (struct hurd_port *port,
+ struct hurd_userlink *new_link,
+ struct hurd_userlink *link);
+
+#if defined __USE_EXTERN_INLINES && defined _LIBC
+# if IS_IN (libc)
+_HURD_PORT_H_EXTERN_INLINE void
+_hurd_port_move (struct hurd_port *port,
+ struct hurd_userlink *new_link,
+ struct hurd_userlink *link)
+{
+ HURD_CRITICAL_BEGIN;
+ __spin_lock (&port->lock);
+ _hurd_userlink_move (new_link, link);
+ __spin_unlock (&port->lock);
+ HURD_CRITICAL_END;
+}
+# endif
+#endif
+
+
/* Free a reference gotten with `USED_PORT = _hurd_port_get (PORT, LINK);' */
extern void
diff --git a/hurd/hurd/userlink.h b/hurd/hurd/userlink.h
index f936255..484706a 100644
--- a/hurd/hurd/userlink.h
+++ b/hurd/hurd/userlink.h
@@ -142,6 +142,30 @@ _hurd_userlink_unlink (struct hurd_userlink *link)
# endif
#endif
+/* Relocate LINK to NEW_LINK.
+ To be used when e.g. reallocating a link array. */
+
+extern void _hurd_userlink_move (struct hurd_userlink *new_link,
+ struct hurd_userlink *link);
+
+#if defined __USE_EXTERN_INLINES && defined _LIBC
+# if IS_IN (libc)
+_HURD_USERLINK_H_EXTERN_INLINE void
+_hurd_userlink_move (struct hurd_userlink *new_link,
+ struct hurd_userlink *link)
+{
+ *new_link = *link;
+
+ if (new_link->resource.next != NULL)
+ new_link->resource.next->resource.prevp = &new_link->resource.next;
+ *new_link->resource.prevp = link;
+
+ if (new_link->thread.next != NULL)
+ new_link->thread.next->thread.prevp = &new_link->thread.next;
+ *new_link->thread.prevp = link;
+}
+# endif
+#endif
/* Clear all users from *CHAINP. Call this when the resource *CHAINP
protects is changing. If the return value is nonzero, no users are on