fis-gtm/sr_port/performcaslatchcheck.c

54 lines
1.8 KiB
C

/****************************************************************
* *
* Copyright 2001, 2012 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. *
* *
****************************************************************/
/* Check that a CAS latch is not stuck on a dead process. If it is release it */
#include "mdef.h"
#include "gtm_limits.h"
#include "compswap.h"
#include "lockconst.h"
#include "util.h"
#include "is_proc_alive.h"
#include "performcaslatchcheck.h"
#ifdef UNIX
#include "sleep_cnt.h"
#include "io.h"
#include "gtmsecshr.h"
#endif
GBLREF pid_t process_id;
GBLREF uint4 image_count;
GBLREF int4 exi_condition;
void performCASLatchCheck(sm_global_latch_ptr_t latch, boolean_t cont_proc)
{
pid_t holder_pid;
VMS_ONLY(uint4 holder_imgcnt;)
holder_pid = latch->u.parts.latch_pid;
VMS_ONLY(holder_imgcnt = latch->u.parts.latch_image_count);
if (LOCK_AVAILABLE != holder_pid)
{ /* should never be done recursively - but signal case is permitted for now as it will never return */
/* remove 0 == exi_condition below when fixed */
if ((process_id == holder_pid) && (0 == exi_condition) VMS_ONLY(&& image_count == holder_imgcnt))
GTMASSERT;
if ((process_id == holder_pid VMS_ONLY(&& image_count == holder_imgcnt))
|| (FALSE == is_proc_alive(holder_pid, UNIX_ONLY(0) VMS_ONLY(holder_imgcnt))))
{ /* remove (processe_id == holder && image_count == holder_pid) when fixed */
COMPSWAP_UNLOCK(latch, holder_pid, holder_imgcnt, LOCK_AVAILABLE, 0);
}
UNIX_ONLY(else if (cont_proc)
continue_proc(holder_pid);) /* Attempt wakeup in case process is stuck */
}
}