Ignore:
Timestamp:
Mar 25, 2007, 1:33:05 PM (18 years ago)
Author:
Yuri Dario
Message:

Rewrote of locking code, closes ticket:4.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/samba-3.0.25pre1/source/tdb/common/open.c

    r1 r10  
    160160        tdb->hash_fn = hash_fn ? hash_fn : default_tdb_hash;
    161161
     162#ifdef __OS2__
     163        if (!(tdb->flags & TDB_INTERNAL))
     164        {
     165                char    szSem[_MAX_PATH];
     166                char    drive[_MAX_DRIVE], dir[_MAX_DIR];
     167                char    fname[_MAX_FNAME], ext[_MAX_EXT];
     168                APIRET  rc;
     169                // extract path info
     170                _splitpath( name, drive, dir, fname, ext);
     171                sprintf( szSem, "\\SEM32\\TDB_GL_%s%s%s", dir, fname, ext);
     172                rc = DosCreateMutexSem( szSem, &tdb->hGlobalLock, 0, FALSE);
     173                if (rc == ERROR_DUPLICATE_NAME)
     174                        rc = DosOpenMutexSem( szSem, &tdb->hGlobalLock);
     175                if (rc != NO_ERROR) {
     176                        printf( "cannot open %s %d\n", szSem, rc);
     177                        errno = EINVAL;
     178                        goto fail;
     179                }
     180                sprintf( szSem, "\\SEM32\\TDB_AL_%s%s%s", dir, fname, ext);
     181                rc = DosCreateMutexSem( szSem, &tdb->hActiveLock, 0, FALSE);
     182                if (rc == ERROR_DUPLICATE_NAME)
     183                        rc = DosOpenMutexSem( szSem, &tdb->hActiveLock);
     184                if (rc != NO_ERROR) {
     185                        printf( "cannot open %s %d\n", szSem, rc);
     186                        errno = EINVAL;
     187                        goto fail;
     188                }
     189                sprintf( szSem, "\\SEM32\\TDB_TL_%s%s%s", dir, fname, ext);
     190                rc = DosCreateMutexSem( szSem, &tdb->hTransactionLock, 0, FALSE);
     191                if (rc == ERROR_DUPLICATE_NAME)
     192                        rc = DosOpenMutexSem( szSem, &tdb->hTransactionLock);
     193                if (rc != NO_ERROR) {
     194                        printf( "cannot open %s %d\n", szSem, rc);
     195                        errno = EINVAL;
     196                        goto fail;
     197                }
     198        }
     199#endif
     200
    162201        /* cache the page size */
    163202        tdb->page_size = getpagesize();
     
    207246
    208247        /* we need to zero database if we are the only one with it open */
    209         if ((tdb_flags & TDB_CLEAR_IF_FIRST) &&
    210             (locked = (tdb->methods->tdb_brlock(tdb, ACTIVE_LOCK, F_WRLCK, F_SETLK, 0, 1) == 0))) {
     248        if ((tdb_flags & TDB_CLEAR_IF_FIRST)
     249#ifndef __OS2__ // we already have global lock
     250            && (locked = (tdb->methods->tdb_brlock(tdb, ACTIVE_LOCK, F_WRLCK, F_SETLK, 0, 1) == 0))
     251#endif
     252        ) {
    211253                open_flags |= O_CREAT;
    212254                if (ftruncate(tdb->fd, 0) == -1) {
     
    266308        tdb_mmap(tdb);
    267309        if (locked) {
     310#ifndef __OS2__
    268311                if (tdb->methods->tdb_brlock(tdb, ACTIVE_LOCK, F_UNLCK, F_SETLK, 0, 1) == -1) {
    269312                        TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: "
     
    272315                        goto fail;
    273316                }
    274 
     317#endif
    275318        }
    276319
     
    279322           users know we're using it. */
    280323
     324#ifndef __OS2__
    281325        if (tdb_flags & TDB_CLEAR_IF_FIRST) {
    282326                /* leave this lock in place to indicate it's in use */
     
    284328                        goto fail;
    285329        }
     330#endif
    286331
    287332        /* if needed, run recovery */
     
    289334                goto fail;
    290335        }
     336
     337        // YD internal databases do not get global lock!
     338        if (tdb->methods->tdb_brlock(tdb, GLOBAL_LOCK, F_UNLCK, F_SETLKW, 0, 1) == -1)
     339                goto fail;
    291340
    292341 internal:
     
    294343         * do with disk files, and resume here by releasing their
    295344         * global lock and hooking into the active list. */
    296         if (tdb->methods->tdb_brlock(tdb, GLOBAL_LOCK, F_UNLCK, F_SETLKW, 0, 1) == -1)
    297                 goto fail;
    298345        tdb->next = tdbs;
    299346        tdbs = tdb;
     
    302349 fail:
    303350        { int save_errno = errno;
     351        tdb->methods->tdb_brlock(tdb, GLOBAL_LOCK, F_UNLCK, F_SETLKW, 0, 1);
    304352
    305353        if (!tdb)
     
    313361        }
    314362        SAFE_FREE(tdb->name);
     363#ifdef __OS2__
     364        DosCloseMutexSem( tdb->hGlobalLock);
     365        DosCloseMutexSem( tdb->hActiveLock);
     366        DosCloseMutexSem( tdb->hTransactionLock);
     367#endif
    315368        if (tdb->fd != -1)
    316369                if (close(tdb->fd) != 0)
     
    343396        }
    344397        SAFE_FREE(tdb->name);
     398        tdb->methods->tdb_brlock(tdb, GLOBAL_LOCK, F_UNLCK, F_SETLK, 0, 1);
    345399        if (tdb->fd != -1)
    346400                ret = close(tdb->fd);
    347401        SAFE_FREE(tdb->lockrecs);
     402#ifdef __OS2__
     403        DosCloseMutexSem( tdb->hGlobalLock);
     404        tdb->hGlobalLock = 0;
     405        DosCloseMutexSem( tdb->hActiveLock);
     406        tdb->hActiveLock = 0;
     407        DosCloseMutexSem( tdb->hTransactionLock);
     408        tdb->hTransactionLock = 0;
     409#endif
    348410
    349411        /* Remove from contexts list */
Note: See TracChangeset for help on using the changeset viewer.