Changeset 1987 for trunk


Ignore:
Timestamp:
May 12, 2005, 1:16:54 AM (20 years ago)
Author:
bird
Message:

shm + sem debuging.

Location:
trunk/src/emx
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/emx/include/InnoTekLIBC/backend.h

    • Property cvs2svn:cvs-rev changed from 1.24 to 1.25
    r1986 r1987  
    3535#include <sys/wait.h>
    3636#include <sys/sem.h>
     37#include <sys/shm.h>
    3738#include <signal.h>
    3839#include <emx/io.h>
  • trunk/src/emx/include/sys/sem.h

    • Property cvs2svn:cvs-rev changed from 1.3 to 1.4
    r1986 r1987  
    1111 * FreeBSD 5.3
    1212 * @changed     bird: no padding in semid_ds. seminfo and semexit are static in our 'kernel'.
     13 * @changed     bird: added time_t, size_t and pid_t as per POSIX.
    1314 */
    1415
     
    1718
    1819#include <sys/ipc.h>
     20#include <sys/_types.h>
     21
     22#if !defined(_TIME_T_DECLARED) && !defined(_TIME_T) /* bird: EMX */
     23typedef __time_t        time_t;
     24#define _TIME_T_DECLARED
     25#define _TIME_T                         /* bird: EMX */
     26#endif
     27
     28#include <sys/_types.h>
     29#if !defined(_SIZE_T_DECLARED) && !defined(_SIZE_T) /* bird: emx */
     30typedef __size_t        size_t;
     31#define _SIZE_T_DECLARED
     32#define _SIZE_T                         /* bird: emx */
     33#endif
     34
     35#if !defined(_PID_T_DECLARED) && !defined(_PID_T) /* bird:emx */
     36typedef __pid_t         pid_t;          /* process id */
     37#define _PID_T_DECLARED
     38#define _PID_T                          /* bird: emx */
     39#endif
     40
    1941
    2042struct sem;
  • trunk/src/emx/include/sys/shm.h

    • Property cvs2svn:cvs-rev changed from 1.3 to 1.4
    r1986 r1987  
    3939/** @file
    4040 * FreeBSD 5.3
    41  * @changed the SHMLBA to 64KB.
     41 * @changed     bird: the SHMLBA to 64KB.
     42 * @changed     bird: added pid_t, time_t and size_t (POSIX).
    4243 */
    4344
     
    4647
    4748#include <sys/ipc.h>
     49
     50#include <sys/_types.h>
     51
     52#if !defined(_TIME_T_DECLARED) && !defined(_TIME_T)
     53typedef __time_t        time_t;
     54#define _TIME_T_DECLARED
     55#define _TIME_T
     56#endif
     57
     58#include <sys/_types.h>
     59#if !defined(_SIZE_T_DECLARED) && !defined(_SIZE_T)
     60typedef __size_t        size_t;
     61#define _SIZE_T_DECLARED
     62#define _SIZE_T
     63#endif
     64
     65#if !defined(_PID_T_DECLARED) && !defined(_PID_T)
     66typedef __pid_t         pid_t;         
     67#define _PID_T_DECLARED
     68#define _PID_T
     69#endif
    4870
    4971#define SHM_RDONLY  010000  /* Attach read-only (else read-write) */
  • trunk/src/emx/src/lib/sys/sysv_sem.c

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r1986 r1987  
    562562        uid_t uid;
    563563        uintptr_t hmtx;
    564 
     564        int semid_in = semid;
    565565
    566566        /*
     
    608608        case IPC_RMID:
    609609                __libc_Back_safesemMtxLock(hmtx = semaptr->hmtx);
    610                 if ((error = semvalid(semid, semaptr)) != 0)
     610                if ((error = semvalid(semid_in, semaptr)) != 0)
    611611                        goto done2;
    612612                if ((error = -__libc_spmCanIPC(&semaptr->u.sem_perm, IPC_M)))
     
    634634                        goto done2;
    635635                __libc_Back_safesemMtxLock(hmtx = semaptr->hmtx);
    636                 if ((error = semvalid(semid, semaptr)) != 0)
     636                if ((error = semvalid(semid_in, semaptr)) != 0)
    637637                        goto done2;
    638638                if ((error = -__libc_spmCanIPC(&semaptr->u.sem_perm, IPC_M)))
     
    647647        case IPC_STAT:
    648648                __libc_Back_safesemMtxLock(hmtx = semaptr->hmtx);
    649                 if ((error = semvalid(semid, semaptr)) != 0)
     649                if ((error = semvalid(semid_in, semaptr)) != 0)
    650650                        goto done2;
    651651                if ((error = -__libc_spmCanIPC(&semaptr->u.sem_perm, IPC_R)))
     
    659659        case GETNCNT:
    660660                __libc_Back_safesemMtxLock(hmtx = semaptr->hmtx);
    661                 if ((error = semvalid(semid, semaptr)) != 0)
     661                if ((error = semvalid(semid_in, semaptr)) != 0)
    662662                        goto done2;
    663663                if ((error = -__libc_spmCanIPC(&semaptr->u.sem_perm, IPC_R)))
     
    672672        case GETPID:
    673673                __libc_Back_safesemMtxLock(hmtx = semaptr->hmtx);
    674                 if ((error = semvalid(semid, semaptr)) != 0)
     674                if ((error = semvalid(semid_in, semaptr)) != 0)
    675675                        goto done2;
    676676                if ((error = -__libc_spmCanIPC(&semaptr->u.sem_perm, IPC_R)))
     
    685685        case GETVAL:
    686686                __libc_Back_safesemMtxLock(hmtx = semaptr->hmtx);
    687                 if ((error = semvalid(semid, semaptr)) != 0)
     687                if ((error = semvalid(semid_in, semaptr)) != 0)
    688688                        goto done2;
    689689                if ((error = -__libc_spmCanIPC(&semaptr->u.sem_perm, IPC_R)))
     
    699699                array = _hmalloc(sizeof(*array) * semaptr->u.sem_nsems);
    700700                __libc_Back_safesemMtxLock(hmtx = semaptr->hmtx);
    701                 if ((error = semvalid(semid, semaptr)) != 0)
     701                if ((error = semvalid(semid_in, semaptr)) != 0)
    702702                        goto done2;
    703703                if ((error = -__libc_spmCanIPC(&semaptr->u.sem_perm, IPC_R)))
     
    712712        case GETZCNT:
    713713                __libc_Back_safesemMtxLock(hmtx = semaptr->hmtx);
    714                 if ((error = semvalid(semid, semaptr)) != 0)
     714                if ((error = semvalid(semid_in, semaptr)) != 0)
    715715                        goto done2;
    716716                if ((error = -__libc_spmCanIPC(&semaptr->u.sem_perm, IPC_R)))
     
    725725        case SETVAL:
    726726                __libc_Back_safesemMtxLock(hmtx = semaptr->hmtx);
    727                 if ((error = semvalid(semid, semaptr)) != 0)
     727                if ((error = semvalid(semid_in, semaptr)) != 0)
    728728                        goto done2;
    729729                if ((error = -__libc_spmCanIPC(&semaptr->u.sem_perm, IPC_W)))
     
    747747                __libc_Back_safesemMtxLock(hmtx = semaptr->hmtx);
    748748raced:
    749                 if ((error = semvalid(semid, semaptr)) != 0)
     749                if ((error = semvalid(semid_in, semaptr)) != 0)
    750750                        goto done2;
    751751                count = semaptr->u.sem_nsems;
     
    756756                        break;
    757757                __libc_Back_safesemMtxLock(hmtx = semaptr->hmtx);
    758                 if ((error = semvalid(semid, semaptr)) != 0)
     758                if ((error = semvalid(semid_in, semaptr)) != 0)
    759759                        goto done2;
    760760                /* we could have raced? */
     
    894894
    895895found:
    896         errno = -IXSEQ_TO_IPCID(semid, sema[semid].u.sem_perm);
     896        error = -IXSEQ_TO_IPCID(semid, sema[semid].u.sem_perm);
    897897done2:
    898898        __libc_Back_safesemMtxUnlock(gpGlobals->hmtx);
     
    948948        int error;
    949949        int do_wakeup, do_undos;
     950        int semid_in = semid;
    950951
    951952        /*
     
    996997                goto done2;
    997998        }
    998         if (semaptr->u.sem_perm.seq != IPCID_TO_SEQ(semid)) {
     999        if (semaptr->u.sem_perm.seq != IPCID_TO_SEQ(semid_in)) {
    9991000                error = EINVAL;
    10001001                goto done2;
     
    11151116                 */
    11161117                if ((semaptr->u.sem_perm.mode & SEM_ALLOC) == 0 ||
    1117                     semaptr->u.sem_perm.seq != IPCID_TO_SEQ(semid)) {
     1118                    semaptr->u.sem_perm.seq != IPCID_TO_SEQ(semid_in)) {
    11181119                        error = EIDRM;
    11191120                        goto done2;
     
    12211222{
    12221223        LIBCLOG_ENTER("\n");
     1224        static volatile int fDone = 0;
    12231225        struct sem_undo *suptr;
    12241226        struct sem_undo **supptr;
     
    12271229         * If no pointer to globals then there is nothing to do (nearly impossible).
    12281230         */
    1229         if (!gpGlobals)
     1231        if (!gpGlobals || fDone)
    12301232            LIBCLOG_RETURN_VOID();
     1233        fDone = 1;
    12311234
    12321235        /*
  • trunk/src/emx/src/lib/sys/sysv_shm.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.2
    r1986 r1987  
    122122#define SHMSEG_ALLOCATED        0x0800
    123123//#define       SHMSEG_WANTED           0x1000 - cannot happen with our locking policy.
     124/** Set when the segment is captured by the server.
     125 * if cleared it equals the SHMSEG_REMOVED when shm_nattch <= 0. */
     126#define SHMSEG_SERVER           0x1000
    124127
    125128static void shm_deallocate_segment(struct shmid_ds *);
     
    127130static struct shmid_ds *shm_find_segment_by_shmid(int);
    128131static struct shmid_ds *shm_find_segment_by_shmidx(int);
    129 static int shm_delete_mapping(struct shmmap_state *);
     132static int shm_delete_mapping(struct shmmap_state *, int);
    130133static int shminit(void);
    131134static void shmexit_myhook(void);
     
    287290
    288291static int
    289 shm_delete_mapping(struct shmmap_state *shmmap_s)
     292shm_delete_mapping(struct shmmap_state *shmmap_s, int fExitting)
    290293{
    291294        struct __libc_SysV_Shm *pGlobals = gpGlobals;
     
    306309        shmseg->shm_dtime = fibGetUnixSeconds();
    307310        if ((--shmseg->shm_nattch <= 0) &&
    308             (shmseg->shm_perm.mode & SHMSEG_REMOVED)) {
     311            (   (shmseg->shm_perm.mode & SHMSEG_REMOVED)
     312             || (fExitting && !(shmseg->shm_perm.mode & SHMSEG_SERVER)))) {
    309313                shm_deallocate_segment(shmseg);
    310314                pGlobals->shm_last_free = segnum;
     
    359363                goto done2;
    360364        }
    361         error = shm_delete_mapping(shmmap_s);
     365        error = shm_delete_mapping(shmmap_s, 0);
    362366done2:
    363367        __libc_Back_safesemMtxUnlock(gpGlobals->hmtx);
     
    825829shmexit_myhook(void)
    826830{
     831        static volatile int fDone = 0;
    827832        struct __libc_SysV_Shm *pGlobals = gpGlobals;
    828         if (pGlobals) {
    829                 gpGlobals = NULL;
     833        if (pGlobals && !fDone) {
     834                fDone = 1;
     835                __libc_Back_safesemMtxLock(pGlobals->hmtx);
    830836                struct shmmap_state *shm = g_vm_shm;
    831837                if (shm) {
    832838                        g_vm_shm = NULL;
    833                         __libc_Back_safesemMtxLock(pGlobals->hmtx);
    834839                        int c = shminfo.shmseg;
    835840                        while (c-- > 0) {
    836                                 if (shm->shmid != -1)
    837                                         shm_delete_mapping(shm);
     841                                if (shm->shmid != -1) {
     842                                        shm_delete_mapping(shm, 1);
     843                                }
    838844                                shm++;
    839845                        }
    840                         __libc_Back_safesemMtxUnlock(pGlobals->hmtx);
    841846                }
     847
     848                /* Clean out non-referenced objects when the server isn't around for them. */
     849                int c = pGlobals->shm_nused;
     850                if (c > 0)
     851                {
     852                    int i = pGlobals->shmalloced;
     853                    struct shmid_ds *shmseg = pGlobals->shmsegs;
     854                    while (i-- > 0)
     855                    {
     856                        if (shmseg->shm_perm.mode & SHMSEG_ALLOCATED)
     857                        {
     858                            if (    shmseg->shm_nattch <= 0
     859                                &&  (   !(shmseg->shm_perm.mode & SHMSEG_SERVER)
     860                                     ||  (shmseg->shm_perm.mode & SHMSEG_REMOVED)))
     861                                shm_deallocate_segment(shmseg);
     862                            if (c-- <= 0)
     863                                break;
     864                        }
     865
     866                        /* next */
     867                        shmseg++;
     868                    }
     869                }
     870                __libc_Back_safesemMtxUnlock(pGlobals->hmtx);
    842871                __atomic_decrement_u32(&pGlobals->cUsers);
     872                gpGlobals = NULL;
    843873        }
    844874}
     
    890920        if (rc)
    891921            LIBCLOG_RETURN_INT(rc);
    892         if (!pSPMHdr->pSysVSem)
     922        if (!pSPMHdr->pSysVShm)
    893923        {
    894924            pGlobals = (struct __libc_SysV_Shm *)__libc_spmAllocLocked(cb);
Note: See TracChangeset for help on using the changeset viewer.