OSDN Git Service

* dcrt0.cc (dll_crt0_1): Move internal locale setting prior to potential
[pf3gnuchains/pf3gnuchains3x.git] / winsup / cygwin / cygserver_ipc.h
index 0d0ebbc..d25a3bd 100644 (file)
@@ -1,8 +1,6 @@
 /* cygserver_ipc.h
 
-   Copyright 2002 Red Hat, Inc.
-
-   Originally written by Conrad Scott <conrad.scott@dsl.pipex.com>
+   Copyright 2002, 2003, 2004 Red Hat, Inc.
 
 This file is part of Cygwin.
 
@@ -13,72 +11,74 @@ details. */
 #ifndef __CYGSERVER_IPC_H__
 #define __CYGSERVER_IPC_H__
 
-#include <assert.h>
-#include <limits.h>            /* For OPEN_MAX. */
-
 /*
- * The sysv ipc id's (msgid, semid, shmid) are integers arranged such
- * that they no subsystem will generate the same id as some other
- * subsystem; nor do these ids overlap file descriptors (the other
- * common integer ids).  Since Cygwin can allocate more than OPEN_MAX
- * file descriptors, it can't be guaranteed not to overlap, but it
- * should help catch some errors.
- *
- * msgid's: OPEN_MAX,     OPEN_MAX + 3, OPEN_MAX + 6, . . .
- * semid's: OPEN_MAX + 1, OPEN_MAX + 4, OPEN_MAX + 7, . . .
- * shmid's: OPEN_MAX + 2, OPEN_MAX + 5, OPEN_MAX + 8, . . .
- *
- * To further ensure that ids are unique, if ipc objects are created
- * and destroyed and then re-created, they are given new ids by
- * munging the basic id (as above) with a sequence number.
- *
- * Internal ipc id's, which are 0, 1, ... within each subsystem (and
- * not munged with a sequence number), are used solely by the ipcs(8)
- * interface.
+ * Datastructure which is part of any IPC input parameter block.
  */
-
-enum ipc_subsys_t
-  {
-    IPC_MSGOP = 0,
-    IPC_SEMOP = 1,
-    IPC_SHMOP = 2,
-    IPC_SUBSYS_COUNT
+struct vmspace {
+  void *vm_map;                        /* UNUSED */
+  struct shmmap_state *vm_shm;
+};
+
+struct proc {
+  pid_t cygpid;
+  DWORD winpid;
+  __uid32_t uid;
+  __gid32_t gid;
+  int gidcnt;
+  __gid32_t *gidlist;
+  bool is_admin;
+  struct vmspace *p_vmspace;
+  HANDLE signal_arrived;
+};
+
+#ifdef __INSIDE_CYGWIN__
+inline void
+ipc_set_proc_info (proc &blk)
+{
+  blk.cygpid = getpid ();
+  blk.winpid = GetCurrentProcessId ();
+  blk.uid = geteuid32 ();
+  blk.gid = getegid32 ();
+  blk.gidcnt = 0;
+  blk.gidlist = NULL;
+  blk.is_admin = false;
+  blk.signal_arrived = signal_arrived;
+}
+#endif /* __INSIDE_CYGWIN__ */
+
+#ifndef __INSIDE_CYGWIN__
+class ipc_retval {
+private:
+  union {
+    int i;
+    unsigned int u;
+    vm_offset_t off;
+    vm_object_t obj;
   };
 
-/*
- * IPCMNI - The absolute maximum number of simultaneous ipc ids for
- * any one subsystem.
- */
+public:
+  ipc_retval (int ni) { i = ni; }
 
-enum
-  {
-    IPCMNI = 0x10000           // Must be a power of two.
-  };
+  operator int () const { return i; }
+  int operator = (int ni) { return i = ni; }
 
-inline int
-ipc_int2ext (const int intid, const ipc_subsys_t subsys, long & sequence)
-{
-  assert (0 <= intid && intid < IPCMNI);
+  operator unsigned int () const { return u; }
+  unsigned int operator = (unsigned int nu) { return u = nu; }
 
-  const long tmp = InterlockedIncrement (&sequence);
+  operator vm_offset_t () const { return off; }
+  vm_offset_t operator = (vm_offset_t noff) { return off = noff; }
 
-  return (((tmp & 0x7fff) << 16)
-         | (OPEN_MAX + (intid * IPC_SUBSYS_COUNT) + subsys));
-}
+  operator vm_object_t () const { return obj; }
+  vm_object_t operator = (vm_object_t nobj) { return obj = nobj; }
+};
 
-inline int
-ipc_ext2int_subsys (const int extid)
-{
-  return ((extid & (IPCMNI - 1)) - OPEN_MAX) % IPC_SUBSYS_COUNT;
-}
-
-inline int
-ipc_ext2int (const int extid, const ipc_subsys_t subsys)
-{
-  if (ipc_ext2int_subsys (extid) != subsys)
-    return -1;
-  else
-    return ((extid & (IPCMNI - 1)) - OPEN_MAX) / IPC_SUBSYS_COUNT;
-}
+struct thread {
+  class process *client;
+  proc *ipcblk;
+  ipc_retval td_retval[2];
+};
+#define td_proc ipcblk
+#define p_pid cygpid
+#endif
 
 #endif /* __CYGSERVER_IPC_H__ */