Annotation of parser3/src/lib/sdbm/sdbm_lock.c, revision 1.2

1.1       paf         1: /* ====================================================================
                      2:  * The Apache Software License, Version 1.1
                      3:  *
                      4:  * Copyright (c) 2000-2002 The Apache Software Foundation.  All rights
                      5:  * reserved.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  *
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  *
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in
                     16:  *    the documentation and/or other materials provided with the
                     17:  *    distribution.
                     18:  *
                     19:  * 3. The end-user documentation included with the redistribution,
                     20:  *    if any, must include the following acknowledgment:
                     21:  *       "This product includes software developed by the
                     22:  *        Apache Software Foundation (http://www.apache.org/)."
                     23:  *    Alternately, this acknowledgment may appear in the software itself,
                     24:  *    if and wherever such third-party acknowledgments normally appear.
                     25:  *
                     26:  * 4. The names "Apache" and "Apache Software Foundation" must
                     27:  *    not be used to endorse or promote products derived from this
                     28:  *    software without prior written permission. For written
                     29:  *    permission, please contact apache@apache.org.
                     30:  *
                     31:  * 5. Products derived from this software may not be called "Apache",
                     32:  *    nor may "Apache" appear in their name, without prior written
                     33:  *    permission of the Apache Software Foundation.
                     34:  *
                     35:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
                     36:  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     37:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
                     38:  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
                     39:  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
                     40:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
                     41:  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
                     42:  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
                     43:  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
                     44:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
                     45:  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     46:  * SUCH DAMAGE.
                     47:  * ====================================================================
                     48:  *
                     49:  * This software consists of voluntary contributions made by many
                     50:  * individuals on behalf of the Apache Software Foundation.  For more
                     51:  * information on the Apache Software Foundation, please see
                     52:  * <http://www.apache.org/>.
                     53:  */
                     54: 
1.2     ! moko       55: #include "pa_file_info.h"
        !            56: #include "pa_file_io.h"
        !            57: #include "pa_sdbm.h"
1.1       paf        58: 
                     59: #include "sdbm_private.h"
                     60: #include "sdbm_tune.h"
                     61: 
                     62: /* NOTE: this function blocks until it acquires the lock */
1.2     ! moko       63: pa_status_t pa_sdbm_lock(pa_sdbm_t *db, int type)
1.1       paf        64: {
1.2     ! moko       65:     pa_status_t status;
1.1       paf        66: 
1.2     ! moko       67:     if (!(type == PA_FLOCK_SHARED || type == PA_FLOCK_EXCLUSIVE))
        !            68:         return PA_EINVAL;
1.1       paf        69: 
                     70:     if (db->flags & SDBM_EXCLUSIVE_LOCK) {
                     71:         ++db->lckcnt;
1.2     ! moko       72:         return PA_SUCCESS;
1.1       paf        73:     }
                     74:     else if (db->flags & SDBM_SHARED_LOCK) {
                     75:         /*
                     76:          * Cannot promote a shared lock to an exlusive lock
                     77:          * in a cross-platform compatibile manner.
                     78:          */
1.2     ! moko       79:         if (type == PA_FLOCK_EXCLUSIVE)
        !            80:             return PA_EINVAL;
1.1       paf        81:         ++db->lckcnt;
1.2     ! moko       82:         return PA_SUCCESS;
1.1       paf        83:     }
                     84:     /*
                     85:      * zero size: either a fresh database, or one with a single,
                     86:      * unsplit data page: dirpage is all zeros.
                     87:      */
1.2     ! moko       88:     if ((status = pa_file_lock(db->dirf, type)) == PA_SUCCESS) 
1.1       paf        89:     {
1.2     ! moko       90:         pa_finfo_t finfo;
        !            91:         if ((status = pa_file_info_get(&finfo, PA_FINFO_SIZE, db->dirf))
        !            92:                 != PA_SUCCESS) {
        !            93:             (void) pa_file_unlock(db->dirf);
1.1       paf        94:             return status;
                     95:         }
                     96: 
                     97:         SDBM_INVALIDATE_CACHE(db, finfo);
                     98: 
                     99:         ++db->lckcnt;
1.2     ! moko      100:         if (type == PA_FLOCK_SHARED)
1.1       paf       101:             db->flags |= SDBM_SHARED_LOCK;
1.2     ! moko      102:         else if (type == PA_FLOCK_EXCLUSIVE)
1.1       paf       103:             db->flags |= SDBM_EXCLUSIVE_LOCK;
                    104:     }
                    105:     return status;
                    106: }
                    107: 
1.2     ! moko      108: pa_status_t pa_sdbm_unlock(pa_sdbm_t *db)
1.1       paf       109: {
                    110:     if (!(db->flags & (SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK)))
1.2     ! moko      111:         return PA_EINVAL;
1.1       paf       112:     if (--db->lckcnt > 0)
1.2     ! moko      113:         return PA_SUCCESS;
1.1       paf       114:     db->flags &= ~(SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK);
1.2     ! moko      115:     return pa_file_unlock(db->dirf);
1.1       paf       116: }

E-mail: