]> sourceware.org Git - newlib-cygwin.git/blobdiff - winsup/cygserver/sysv_shm.cc
Cygwin: set NTDDI_VERSION to enable more recent windows definitions
[newlib-cygwin.git] / winsup / cygserver / sysv_shm.cc
index 70ed1a3d48248d069d25a69460f30479d6db4be6..4578c53a2cea120c629438685ae2f63ea5720cfe 100644 (file)
@@ -40,6 +40,7 @@
 #define __FBSDID(s)    const char version[] = (s)
 #endif
 __FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/kern/sysv_shm.c,v 1.89 2003/11/07 04:47:14 rwatson Exp $");
+/* CV, 2006-01-09: Inspected upstream up to version 1.104. */
 
 #define _KERNEL 1
 #define __BSD_VISIBLE 1
@@ -67,8 +68,11 @@ __FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/kern/sysv_shm.c,v 1.89 2003/11/07 04
 #endif
 #define btoc(b)        (((b) + PAGE_MASK) / PAGE_SIZE)
 #define round_page(p) ((((unsigned long)(p)) + PAGE_MASK) & ~(PAGE_MASK))
-#define ACCESSPERMS (0777)
+#ifdef __CYGWIN__
+#define GIANT_REQUIRED
+#else
 #define GIANT_REQUIRED mtx_assert(&Giant, MA_OWNED)
+#endif
 #define KERN_SUCCESS 0
 #define VM_PROT_READ   PROT_READ
 #define VM_PROT_WRITE  PROT_WRITE
@@ -80,10 +84,7 @@ __FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/kern/sysv_shm.c,v 1.89 2003/11/07 04
 #define vm_object_clear_flag(a,b)
 #define vm_object_set_flag(a,b)
 #define VM_OBJECT_UNLOCK(a)
-#define vm_object_reference(a)
 #define vm_map_remove(a,b,c) KERN_SUCCESS
-#define vm_map_find(a,b,c,d,e,f,g,h,i) KERN_SUCCESS
-#define vm_map_inherit(a,b,c,d)
 typedef int vm_prot_t;
 #endif /* __CYGWIN__ */
 
@@ -257,7 +258,7 @@ shm_delete_mapping(struct vmspace *vm, struct shmmap_state *shmmap_s)
 {
        struct shmid_ds *shmseg;
        int segnum, result;
-       size_t size;
+       size_t size __attribute__ ((unused));
 
        GIANT_REQUIRED;
 
@@ -334,14 +335,18 @@ int
 kern_shmat(struct thread *td, int shmid, const void *shmaddr, int shmflg)
 {
        struct proc *p = td->td_proc;
-       int i, flags;
+       int i, flags __attribute__ ((unused));
        struct shmid_ds *shmseg;
        struct shmmap_state *shmmap_s = NULL;
+#ifndef __CYGWIN__
        struct shm_handle *shm_handle;
+#endif
        vm_offset_t attach_va;
        vm_prot_t prot;
        vm_size_t size;
+#ifndef __CYGWIN__
        int rv;
+#endif
        int error = 0;
 
        if (!jail_sysvipc_allowed && jailed(td->td_ucred))
@@ -382,6 +387,14 @@ kern_shmat(struct thread *td, int shmid, const void *shmaddr, int shmflg)
        if ((shmflg & SHM_RDONLY) == 0)
                prot |= VM_PROT_WRITE;
        flags = MAP_ANON | MAP_SHARED;
+       debug_printf ("shmaddr: %x, shmflg: %x", shmaddr, shmflg);
+#ifdef __CYGWIN__
+       /* The alignment checks have already been made in the Cygwin DLL
+          and shmat's only job is to keep record of the attached mem.
+          These checks break shm on 9x since MapViewOfFileEx apparently
+          returns memory which isn't aligned to SHMLBA.  Go figure!  */
+       attach_va = (vm_offset_t)shmaddr;
+#else
        if (shmaddr) {
                flags |= MAP_FIXED;
                if (shmflg & SHM_RND) {
@@ -397,12 +410,8 @@ kern_shmat(struct thread *td, int shmid, const void *shmaddr, int shmflg)
                 * This is just a hint to vm_map_find() about where to
                 * put it.
                 */
-#ifdef __CYGWIN__
-               attach_va = 0;
-#else
                attach_va = round_page((vm_offset_t)p->p_vmspace->vm_taddr
                    + maxtsiz + maxdsiz);
-#endif
        }
 
        shm_handle = shmseg->shm_internal;
@@ -415,6 +424,7 @@ kern_shmat(struct thread *td, int shmid, const void *shmaddr, int shmflg)
        }
        vm_map_inherit(&p->p_vmspace->vm_map,
                attach_va, attach_va + size, VM_INHERIT_SHARE);
+#endif
 
        shmmap_s->va = attach_va;
        shmmap_s->shmid = shmid;
@@ -502,7 +512,7 @@ done2:
        return (EINVAL);
 #endif
 }
-#endif /* __CYGWIN__ */
+#endif /* !__CYGWIN__ */
 
 #ifndef _SYS_SYSPROTO_H_
 struct shmctl_args {
@@ -718,7 +728,7 @@ shmget_allocate_segment(struct thread *td, struct shmget_args *uap, int mode)
        if (shm_nused >= shminfo.shmmni) /* Any shmids left? */
                return (ENOSPC);
        size = round_page(uap->size);
-       if (shm_committed + btoc(size) > (unsigned long) shminfo.shmall)
+       if (shm_committed + btoc(size) > shminfo.shmall)
                return (ENOMEM);
        if (shm_last_free < 0) {
                shmrealloc();   /* Maybe expand the shmsegs[] array. */
@@ -808,6 +818,12 @@ shmget(struct thread *td, struct shmget_args *uap)
        mode = uap->shmflg & ACCESSPERMS;
        if (uap->key != IPC_PRIVATE) {
        again:
+#ifdef __CYGWIN__
+               if (uap->shmflg & IPC_KEY_IS_SHMID)
+                 segnum = shm_find_segment_by_shmid ((int) uap->key) ?
+                          IPCID_TO_IX((int) uap->key) : -1;
+               else
+#endif
                segnum = shm_find_segment_by_key(uap->key);
                if (segnum >= 0) {
                        error = shmget_existing(td, uap, mode, segnum);
@@ -825,6 +841,8 @@ done2:
 #ifdef __CYGWIN__
        if (!error)
                ipcexit_creat_hookthread (td);
+       else
+               td->td_retval[0] = -1;
 #endif
        mtx_unlock(&Giant);
        return (error);
@@ -933,18 +951,20 @@ void
 shminit(void)
 {
        int i;
+       tun_bool_t shm_ar;
 
        TUNABLE_INT_FETCH("kern.ipc.shmmaxpgs", &shminfo.shmall);
        for (i = PAGE_SIZE; i > 0; i--) {
-               shminfo.shmmax = shminfo.shmall * PAGE_SIZE;
+               shminfo.shmmax = shminfo.shmall * i;
                if (shminfo.shmmax >= shminfo.shmall)
                        break;
        }
        TUNABLE_INT_FETCH("kern.ipc.shmmin", &shminfo.shmmin);
        TUNABLE_INT_FETCH("kern.ipc.shmmni", &shminfo.shmmni);
        TUNABLE_INT_FETCH("kern.ipc.shmseg", &shminfo.shmseg);
-       TUNABLE_INT_FETCH("kern.ipc.shm_use_phys", &shm_use_phys);
-
+       TUNABLE_BOOL_FETCH("kern.ipc.shm_allow_removed", &shm_ar);
+       if (shm_ar == TUN_TRUE)
+         shm_allow_removed = 1;
        shmalloced = shminfo.shmmni;
        shmsegs = (struct shmid_ds *) sys_malloc(shmalloced * sizeof(shmsegs[0]), M_SHM, M_WAITOK);
        if (shmsegs == NULL)
This page took 0.025473 seconds and 5 git commands to generate.