summaryrefslogtreecommitdiff
path: root/debian/patches/introspection0003-libports-implement-the-Hurd-server-introspection-pro.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/introspection0003-libports-implement-the-Hurd-server-introspection-pro.patch')
-rw-r--r--debian/patches/introspection0003-libports-implement-the-Hurd-server-introspection-pro.patch479
1 files changed, 0 insertions, 479 deletions
diff --git a/debian/patches/introspection0003-libports-implement-the-Hurd-server-introspection-pro.patch b/debian/patches/introspection0003-libports-implement-the-Hurd-server-introspection-pro.patch
deleted file mode 100644
index 096cfe64..00000000
--- a/debian/patches/introspection0003-libports-implement-the-Hurd-server-introspection-pro.patch
+++ /dev/null
@@ -1,479 +0,0 @@
-From 2caf570c676b4b0df3dc54fa4f1f9d99a6fe3202 Mon Sep 17 00:00:00 2001
-From: Justus Winter <4winter@informatik.uni-hamburg.de>
-Date: Wed, 21 May 2014 16:47:14 +0200
-Subject: [PATCH hurd 3/8] libports: implement the Hurd server introspection
- protocol
-
-Add a compact and self-contained introspection server to libports.
-Add functions to to label port buckets and classes. Make it possible
-to provide a function that given an object of a class, returns a
-human-readable representation for it.
-
-* libports/introspection.c: New file.
-* libports/create-bucket.c (ports_label_bucket): New function.
-* libports/create-class.c (ports_set_debug_info): Likewise.
-* libports/manage-multithread.c (internal_demuxer): Trace messages if
-desired.
-* libports/manage-one-thread.c (internal_demuxer): Likewise.
-* libports/ports.h (struct port_bucket): Add label.
-(struct port_class): Add debug_info and label.
-(ports_label_bucket): New declaration.
-(ports_set_debug_info): Likewise.
-* libports/Makefile (SRCS): Add introspection.c.
-(OBJS): Add hurd_portServer.o.
----
- ext2fs/Makefile | 3 +-
- fatfs/Makefile | 3 +-
- isofs/Makefile | 3 +-
- libports/Makefile | 6 +-
- libports/create-bucket.c | 7 ++
- libports/create-class.c | 16 ++++
- libports/introspection.c | 189 ++++++++++++++++++++++++++++++++++++++++++
- libports/manage-multithread.c | 9 ++
- libports/manage-one-thread.c | 10 +++
- libports/ports.h | 14 ++++
- tmpfs/Makefile | 3 +-
- 11 files changed, 256 insertions(+), 7 deletions(-)
- create mode 100644 libports/introspection.c
-
-diff --git a/ext2fs/Makefile b/ext2fs/Makefile
-index 8d2e68c..9d72fda 100644
---- a/ext2fs/Makefile
-+++ b/ext2fs/Makefile
-@@ -23,7 +23,8 @@ target = ext2fs
- SRCS = balloc.c dir.c ext2fs.c getblk.c hyper.c ialloc.c \
- inode.c pager.c pokel.c truncate.c storeinfo.c msg.c xinl.c
- OBJS = $(SRCS:.c=.o)
--HURDLIBS = diskfs pager iohelp fshelp store ports ihash shouldbeinlibc
-+HURDLIBS = diskfs pager iohelp fshelp store ports ihash introspection \
-+ shouldbeinlibc
- OTHERLIBS = -lpthread $(and $(HAVE_LIBBZ2),-lbz2) $(and $(HAVE_LIBZ),-lz)
-
- include ../Makeconf
-diff --git a/fatfs/Makefile b/fatfs/Makefile
-index 6224b64..e4f01ec 100644
---- a/fatfs/Makefile
-+++ b/fatfs/Makefile
-@@ -22,7 +22,8 @@ target = fatfs
- SRCS = inode.c main.c dir.c pager.c fat.c virt-inode.c node-create.c
-
- OBJS = $(SRCS:.c=.o)
--HURDLIBS = diskfs iohelp fshelp store pager ports ihash shouldbeinlibc
-+HURDLIBS = diskfs iohelp fshelp store pager ports ihash introspection \
-+ shouldbeinlibc
- OTHERLIBS = -lpthread $(and $(HAVE_LIBBZ2),-lbz2) $(and $(HAVE_LIBZ),-lz)
-
- include ../Makeconf
-diff --git a/isofs/Makefile b/isofs/Makefile
-index 6475c52..9e399bf 100644
---- a/isofs/Makefile
-+++ b/isofs/Makefile
-@@ -21,7 +21,8 @@ target = iso9660fs
- SRCS = inode.c main.c lookup.c pager.c rr.c
-
- OBJS = $(SRCS:.c=.o)
--HURDLIBS = diskfs iohelp fshelp store pager ports ihash shouldbeinlibc
-+HURDLIBS = diskfs iohelp fshelp store pager ports ihash introspection \
-+ shouldbeinlibc
- OTHERLIBS = -lpthread $(and $(HAVE_LIBBZ2),-lbz2) $(and $(HAVE_LIBZ),-lz)
-
- include ../Makeconf
-diff --git a/libports/Makefile b/libports/Makefile
-index b8b82ee..b9283ac 100644
---- a/libports/Makefile
-+++ b/libports/Makefile
-@@ -36,13 +36,13 @@ SRCS = create-bucket.c create-class.c \
- interrupt-operation.c interrupt-on-notify.c interrupt-notified-rpcs.c \
- dead-name.c create-port.c import-port.c default-uninhibitable-rpcs.c \
- claim-right.c transfer-right.c create-port-noinstall.c create-internal.c \
-- interrupted.c extern-inline.c port-deref-deferred.c
-+ interrupted.c extern-inline.c port-deref-deferred.c introspection.c
-
- installhdrs = ports.h
-
--HURDLIBS= ihash
-+HURDLIBS= ihash introspection
- LDLIBS += -lpthread
--OBJS = $(SRCS:.c=.o) notifyServer.o interruptServer.o
-+OBJS = $(SRCS:.c=.o) notifyServer.o interruptServer.o hurd_portServer.o
-
- MIGCOMSFLAGS = -prefix ports_
- MIGSFLAGS = -imacros $(srcdir)/mig-mutate.h
-diff --git a/libports/create-bucket.c b/libports/create-bucket.c
-index 82c00a4..34559f5 100644
---- a/libports/create-bucket.c
-+++ b/libports/create-bucket.c
-@@ -49,5 +49,12 @@ ports_create_bucket ()
- hurd_ihash_init (&ret->htable, offsetof (struct port_info, hentry));
- ret->rpcs = ret->flags = ret->count = 0;
- _ports_threadpool_init (&ret->threadpool);
-+ ret->label = "unlabeled bucket";
- return ret;
- }
-+
-+/* Label BUCKET with LABEL. */
-+void ports_label_bucket (struct port_bucket *bucket, const char *label)
-+{
-+ bucket->label = label;
-+}
-diff --git a/libports/create-class.c b/libports/create-class.c
-index 782f52b..8abf643 100644
---- a/libports/create-class.c
-+++ b/libports/create-class.c
-@@ -41,6 +41,22 @@ ports_create_class (void (*clean_routine)(void *),
- cl->rpcs = 0;
- cl->count = 0;
- cl->uninhibitable_rpcs = ports_default_uninhibitable_rpcs;
-+ cl->debug_info = NULL;
-+ cl->label = "unlabeled class";
-+ cl->trace_port = MACH_PORT_NULL;
-
- return cl;
- }
-+
-+/* Label CLASS with LABEL. Use DEBUG_INFO to format human-readable
-+ information about a given object belonging to CLASS into an buffer,
-+ or the default formatting function if DEBUG_INFO is NULL. */
-+void
-+ports_label_class (struct port_class *class,
-+ const char *label,
-+ error_t (*debug_info) (const void *, char *, size_t))
-+{
-+ class->label = label;
-+ if (debug_info)
-+ class->debug_info = debug_info;
-+}
-diff --git a/libports/introspection.c b/libports/introspection.c
-new file mode 100644
-index 0000000..05aee92
---- /dev/null
-+++ b/libports/introspection.c
-@@ -0,0 +1,189 @@
-+/* Hurd server introspection.
-+
-+ Copyright (C) 2014 Free Software Foundation, Inc.
-+
-+ This file is part of the GNU Hurd.
-+
-+ The GNU Hurd is free software; you can redistribute it and/or
-+ modify it under the terms of the GNU General Public License as
-+ published by the Free Software Foundation; either version 2, or (at
-+ your option) any later version.
-+
-+ The GNU Hurd is distributed in the hope that it will be useful, but
-+ WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */
-+
-+#include <error.h>
-+#include <hurd/introspection.h>
-+#include <pthread.h>
-+#include <stdio.h>
-+#include <string.h>
-+
-+#include "ports.h"
-+#include "hurd_port_U.h"
-+
-+/* We service introspection requests on this port. */
-+static mach_port_t introspection_port;
-+
-+/* We use a separate thread to service the introspection requests. It
-+ is a straight forward Mach server for the hurd_port protocol. */
-+static void *
-+service_introspection_requests (void *arg)
-+{
-+ error_t err;
-+
-+ err = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE,
-+ &introspection_port);
-+ if (err)
-+ {
-+ error (0, err, "mach_port_allocate");
-+ return NULL;
-+ }
-+
-+ err = mach_port_insert_right (mach_task_self (),
-+ introspection_port, introspection_port,
-+ MACH_MSG_TYPE_MAKE_SEND);
-+ if (err)
-+ {
-+ error (0, err, "mach_port_insert_right");
-+ return NULL;
-+ }
-+
-+ err = introspection_set_port (mach_task_self (), introspection_port);
-+ if (err)
-+ {
-+ error (0, err, "introspection_set_port");
-+ return NULL;
-+ }
-+
-+ /* XXX mig should emit this declaration. */
-+ boolean_t ports_hurd_port_server (mach_msg_header_t *InHeadP,
-+ mach_msg_header_t *OutHeadP);
-+
-+ while (1)
-+ mach_msg_server (ports_hurd_port_server, 0, introspection_port);
-+
-+ /* Not reached. */
-+ return NULL;
-+}
-+
-+/* Start the introspection server before main is called. */
-+static void __attribute__ ((constructor))
-+init (void)
-+{
-+ error_t err;
-+
-+ pthread_t thread;
-+ pthread_attr_t attr;
-+#define STACK_SIZE (64 * 1024)
-+ pthread_attr_init (&attr);
-+ pthread_attr_setstacksize (&attr, STACK_SIZE);
-+#undef STACK_SIZE
-+
-+ err = pthread_create (&thread, &attr,
-+ service_introspection_requests, NULL);
-+ if (err)
-+ error (1, err, "pthread_create");
-+ pthread_detach (thread);
-+}
-+
-+/* Return the number of hard and weak references of the object
-+ directly associated with the receive right NAME.
-+
-+ Return EINVAL if NAME does not denote a receive right managed by
-+ the port-to-object mapper, or if the concept of reference counting
-+ simply does not apply. */
-+error_t
-+ports_S_hurd_port_get_refcounts (mach_port_t port,
-+ mach_port_t name,
-+ natural_t *hard,
-+ natural_t *weak)
-+{
-+ struct references result;
-+ struct port_info *pi;
-+
-+ if (port != introspection_port)
-+ return EOPNOTSUPP;
-+
-+ pi = ports_lookup_port (0, name, 0);
-+ if (pi == NULL)
-+ return EINVAL;
-+
-+ refcounts_references (&pi->refcounts, &result);
-+
-+ *hard = result.hard - 1;
-+ *weak = result.weak;
-+ ports_port_deref (pi);
-+ return 0;
-+}
-+
-+static error_t
-+default_debug_info (const void *port, char *buffer, size_t size)
-+{
-+ const struct port_info *pi = port;
-+ snprintf (buffer, size,
-+ "bucket: %s, class: %s",
-+ pi->bucket->label, pi->class->label);
-+ return 0;
-+}
-+
-+/* Return a compact, human-readable description of the object related
-+ with the receive right NAME.
-+
-+ This description is meant for debugging purposes and should include
-+ relevant internal state. If possible, it should include
-+ information that is meaningful in other contexts (like a file name,
-+ or the inode number).
-+
-+ Return EINVAL if NAME does not denote a receive right managed by
-+ the port-to-object mapper. */
-+error_t
-+ports_S_hurd_port_debug_info (mach_port_t port,
-+ mach_port_t name,
-+ char *info)
-+{
-+ error_t err;
-+ struct port_info *pi;
-+
-+ if (port != introspection_port)
-+ return EOPNOTSUPP;
-+
-+ pi = ports_lookup_port (0, name, 0);
-+ if (pi == NULL)
-+ return EINVAL;
-+
-+ if (pi->class->debug_info)
-+ err = pi->class->debug_info (pi, info, 1024 /* XXX */);
-+ else
-+ err = default_debug_info (pi, info, 1024 /* XXX */);
-+ info[1023] = 0;
-+
-+ ports_port_deref (pi);
-+ return err;
-+}
-+
-+error_t
-+ports_S_hurd_port_trace_class_rpcs (mach_port_t port,
-+ mach_port_t name,
-+ mach_port_t trace_port)
-+{
-+ struct port_info *pi;
-+
-+ if (port != introspection_port)
-+ return EOPNOTSUPP;
-+
-+ pi = ports_lookup_port (0, name, 0);
-+ if (pi == NULL)
-+ return EINVAL;
-+
-+ if (MACH_PORT_VALID (pi->class->trace_port))
-+ mach_port_deallocate (mach_task_self (), pi->class->trace_port);
-+
-+ pi->class->trace_port = trace_port;
-+
-+ return 0;
-+}
-diff --git a/libports/manage-multithread.c b/libports/manage-multithread.c
-index dcb6905..8fa31ff 100644
---- a/libports/manage-multithread.c
-+++ b/libports/manage-multithread.c
-@@ -21,6 +21,7 @@
- #include "ports.h"
- #include <assert.h>
- #include <error.h>
-+#include <hurd/introspection.h>
- #include <stdio.h>
- #include <mach/message.h>
- #include <mach/thread_info.h>
-@@ -184,6 +185,10 @@ ports_manage_port_operations_multithread (struct port_bucket *bucket,
-
- if (pi)
- {
-+ mach_port_t trace_port = pi->class->trace_port;
-+ if (__builtin_expect (MACH_PORT_VALID (trace_port), 0))
-+ introspection_trace_message (trace_port, inp);
-+
- error_t err = ports_begin_rpc (pi, inp->msgh_id, &link);
- if (err)
- {
-@@ -202,6 +207,10 @@ ports_manage_port_operations_multithread (struct port_bucket *bucket,
- ports_end_rpc (pi, &link);
- }
- ports_port_deref (pi);
-+
-+ if (__builtin_expect (MACH_PORT_VALID (trace_port), 0)
-+ && outp->RetCode != MIG_NO_REPLY)
-+ introspection_trace_message (trace_port, outp);
- }
- else
- {
-diff --git a/libports/manage-one-thread.c b/libports/manage-one-thread.c
-index 192907a..2df2826 100644
---- a/libports/manage-one-thread.c
-+++ b/libports/manage-one-thread.c
-@@ -18,6 +18,8 @@
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-+#include <hurd/introspection.h>
-+
- #include "ports.h"
-
- void
-@@ -75,6 +77,10 @@ ports_manage_port_operations_one_thread (struct port_bucket *bucket,
-
- if (pi)
- {
-+ mach_port_t trace_port = pi->class->trace_port;
-+ if (__builtin_expect (MACH_PORT_VALID (trace_port), 0))
-+ introspection_trace_message (trace_port, inp);
-+
- err = ports_begin_rpc (pi, inp->msgh_id, &link);
- if (err)
- {
-@@ -91,6 +97,10 @@ ports_manage_port_operations_one_thread (struct port_bucket *bucket,
- ports_end_rpc (pi, &link);
- }
- ports_port_deref (pi);
-+
-+ if (__builtin_expect (MACH_PORT_VALID (trace_port), 0)
-+ && outp->RetCode != MIG_NO_REPLY)
-+ introspection_trace_message (trace_port, outp);
- }
- else
- {
-diff --git a/libports/ports.h b/libports/ports.h
-index 9299bc4..a31b894 100644
---- a/libports/ports.h
-+++ b/libports/ports.h
-@@ -76,6 +76,7 @@ struct port_bucket
- int flags;
- int count;
- struct ports_threadpool threadpool;
-+ const char *label;
- };
- /* FLAGS above are the following: */
- #define PORT_BUCKET_INHIBITED PORTS_INHIBITED
-@@ -91,7 +92,10 @@ struct port_class
- int count;
- void (*clean_routine) (void *);
- void (*dropweak_routine) (void *);
-+ error_t (*debug_info) (const void *, char *, size_t);
- struct ports_msg_id_range *uninhibitable_rpcs;
-+ const char *label;
-+ mach_port_t trace_port;
- };
- /* FLAGS are the following: */
- #define PORT_CLASS_INHIBITED PORTS_INHIBITED
-@@ -160,6 +164,9 @@ extern struct ports_msg_id_range *ports_default_uninhibitable_rpcs;
- /* Create and return a new bucket. */
- struct port_bucket *ports_create_bucket (void);
-
-+/* Label BUCKET with LABEL. */
-+void ports_label_bucket (struct port_bucket *bucket, const char *label);
-+
- /* Create and return a new port class. If nonzero, CLEAN_ROUTINE will
- be called for each allocated port object in this class when it is
- being destroyed. If nonzero, DROPWEAK_ROUTINE will be called
-@@ -169,6 +176,12 @@ struct port_bucket *ports_create_bucket (void);
- struct port_class *ports_create_class (void (*clean_routine)(void *),
- void (*dropweak_routine)(void *));
-
-+/* Label CLASS with LABEL. Use DEBUG_INFO to format human-readable
-+ information about a given object belonging to CLASS into an buffer,
-+ or the default formatting function if DEBUG_INFO is NULL. */
-+void ports_label_class (struct port_class *class, const char *label,
-+ error_t (*debug_info) (const void *, char *, size_t));
-+
- /* 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
- user desires. */
-@@ -482,5 +495,6 @@ extern int _ports_flags;
- void _ports_complete_deallocate (struct port_info *);
- error_t _ports_create_port_internal (struct port_class *, struct port_bucket *,
- size_t, void *, int);
-+error_t _ports_trace_message (mach_port_t, const mach_msg_header_t *);
-
- #endif
-diff --git a/tmpfs/Makefile b/tmpfs/Makefile
-index fdcae34..fc27909 100644
---- a/tmpfs/Makefile
-+++ b/tmpfs/Makefile
-@@ -23,7 +23,8 @@ target = tmpfs
- SRCS = tmpfs.c node.c dir.c pager-stubs.c
- OBJS = $(SRCS:.c=.o) default_pagerUser.o
- # XXX The shared libdiskfs requires libstore even though we don't use it here.
--HURDLIBS = diskfs pager iohelp fshelp store ports ihash shouldbeinlibc
-+HURDLIBS = diskfs pager iohelp fshelp store ports ihash introspection \
-+ shouldbeinlibc
- OTHERLIBS = -lpthread
-
- include ../Makeconf
---
-2.1.4
-