fis-gtm/sr_unix/dbinit_ch.c

135 lines
3.6 KiB
C

/****************************************************************
* *
* Copyright 2001, 2013 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include "gtm_ipc.h"
#include <sys/mman.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include "gtm_unistd.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "error.h"
#include "filestruct.h"
#include "gvcst_protos.h"
#include "jnl.h"
#include "do_semop.h"
#include "mmseg.h"
#include "ipcrmid.h"
#include "util.h"
#include "ftok_sems.h"
#include "gtmimagename.h"
#include "gtmio.h"
#include "have_crit.h"
GBLREF gd_region *db_init_region;
CONDITION_HANDLER(dbinit_ch)
{
START_CH;
if (SUCCESS == SEVERITY || INFO == SEVERITY)
{
PRN_ERROR;
CONTINUE;
}
db_init_err_cleanup(FALSE);
NEXTCH
}
void db_init_err_cleanup(boolean_t retry_dbinit)
{
unix_db_info *udi;
gd_segment *seg;
sgmnt_addrs *csa;
int rc, lcl_new_dbinit_ipc;
assert(NULL != db_init_region);
seg = db_init_region->dyn.addr;
udi = NULL;
if (NULL != seg->file_cntl)
udi = FILE_INFO(db_init_region);
if (NULL != udi)
{
if (FD_INVALID != udi->fd && !retry_dbinit)
CLOSEFILE_RESET(udi->fd, rc); /* resets "udi->fd" to FD_INVALID */
assert(FD_INVALID == udi->fd || retry_dbinit);
csa = &udi->s_addrs;
# ifdef GTM_CRYPT
if (NULL != csa->encrypted_blk_contents)
{
free(csa->encrypted_blk_contents);
csa->encrypted_blk_contents = NULL;
}
# endif
if ((NULL != csa->hdr) && (dba_mm == db_init_region->dyn.addr->acc_meth))
{
assert((NULL != csa->db_addrs[1]) && (csa->db_addrs[1] > csa->db_addrs[0]));
munmap((caddr_t)csa->db_addrs[0], (size_t)(csa->db_addrs[1] - csa->db_addrs[0]));
}
if (NULL != csa->jnl)
{
free(csa->jnl);
csa->jnl = NULL;
}
if (csa->nl)
{
shmdt((caddr_t)csa->nl);
csa->nl = (node_local_ptr_t)NULL;
}
if (udi->new_shm && (INVALID_SHMID != udi->shmid))
{
shm_rmid(udi->shmid);
udi->shmid = INVALID_SHMID;
udi->new_shm = FALSE;
}
if (udi->new_sem && (INVALID_SEMID != udi->semid))
{
sem_rmid(udi->semid);
udi->semid = INVALID_SEMID;
udi->new_sem = FALSE;
udi->grabbed_access_sem = FALSE;
udi->counter_acc_incremented = FALSE;
}
if (udi->counter_acc_incremented)
{
assert((INVALID_SEMID != udi->semid) && !db_init_region->read_only);
do_semop(udi->semid, DB_COUNTER_SEM, -1, SEM_UNDO | IPC_NOWAIT); /* decrement the read-write sem */
udi->counter_acc_incremented = FALSE;
}
if (udi->grabbed_access_sem)
{
do_semop(udi->semid, DB_CONTROL_SEM, -1, SEM_UNDO | IPC_NOWAIT); /* release the startup-shutdown sem */
udi->grabbed_access_sem = FALSE;
}
if (udi->grabbed_ftok_sem)
ftok_sem_release(db_init_region, udi->counter_ftok_incremented, TRUE);
else if (udi->counter_ftok_incremented)
do_semop(udi->ftok_semid, DB_COUNTER_SEM, -1, SEM_UNDO | IPC_NOWAIT);
udi->counter_ftok_incremented =FALSE;
udi->grabbed_ftok_sem = FALSE;
if (!IS_GTCM_GNP_SERVER_IMAGE && !retry_dbinit) /* gtcm_gnp_server reuses file_cntl */
{
free(seg->file_cntl->file_info);
free(seg->file_cntl);
seg->file_cntl = NULL;
}
}
/* Enable interrupts in case we are here with intrpt_ok_state == INTRPT_IN_GVCST_INIT due to an rts error. */
if (!retry_dbinit)
ENABLE_INTERRUPTS(INTRPT_IN_GVCST_INIT);
}