summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael I. Bushnell <mib@gnu.org>1993-12-03 02:47:54 +0000
committerMichael I. Bushnell <mib@gnu.org>1993-12-03 02:47:54 +0000
commit0ad68e2accfb2d76561a629572f7a73c6dc659d2 (patch)
tree4a5866018069b1025781305719c56b69fd321a5a
parentd2e77ac7fcdafd451a12652eb2a886221e1ec097 (diff)
Initial revision
-rw-r--r--libiohelp/iohelp.h61
-rw-r--r--libiohelp/verify_user_conch.c33
2 files changed, 94 insertions, 0 deletions
diff --git a/libiohelp/iohelp.h b/libiohelp/iohelp.h
new file mode 100644
index 00000000..35cb11d2
--- /dev/null
+++ b/libiohelp/iohelp.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 1993 Free Software Foundation
+
+ This program 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.
+
+ This program 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 this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include <mach.h>
+#include <hurd/hurd_types.h>
+#include <cthreads.h>
+#include <hurd/shared.h>
+
+/* Conch manipulation. */
+struct conch
+{
+ struct mutex *lock;
+ struct condition wait;
+ void *holder;
+ struct shared_io *holder_shared_page;
+};
+
+/* Initialize a conch box */
+void initialize_conch (struct conch *, struct mutex *);
+
+/* These routines are not reentrant. The server is responsible
+ for ensuring that all calls to these routines are serialized
+ by locking the lock passed to initialize_conch. */
+
+/* Handle a user request to obtain the conch (io_get_conch) */
+error_t handle_io_get_conch (struct conch *, void *, struct shared_io *);
+
+/* Obtain the conch for the server */
+error_t get_conch (struct conch *);
+
+/* Handle a user request to release the conch (io_release_conch). */
+error_t handle_io_release_conch (struct conch *, void *);
+
+/* Check if the user is allowed to make a shared-data notification
+ message. */
+error_t verify_user_conch (struct conch *, void *);
+
+/* This function must by defined by the server. It should transfer
+ information from the current conch holder's shared page to the server's
+ data (the arg is the conch owner). */
+error_t fetch_shared_data (void *);
+
+/* This function must be defined by the server. It should transfer
+ information from the server's data to the current conch holder's
+ shared page (the arg is the conch owner). */
+error_t put_shared_data (void *);
+
diff --git a/libiohelp/verify_user_conch.c b/libiohelp/verify_user_conch.c
new file mode 100644
index 00000000..180d132f
--- /dev/null
+++ b/libiohelp/verify_user_conch.c
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) 1993 Free Software Foundation
+
+ This program 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.
+
+ This program 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 this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+error_t
+verify_user_conch (struct conch *c, void *user)
+{
+ struct shared_io *user_sh;
+
+ if (user != c->holder)
+ return EPERM;
+ user_sh = c->holder_shared_page;
+ spin_lock (&user_sh->lock);
+ if (user_sh != USER_HAS_CONCH && user_sh != USER_RELEASE_CONCH)
+ {
+ spin_unlock (&user_sh->lock);
+ return EPERM;
+ }
+ spin_unlock (&user_sh->lock);
+}