fis-gtm/sr_port_cm/gvcmy_remlkmgr.c

215 lines
5.9 KiB
C

/****************************************************************
* *
* Copyright 2001, 2010 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_stdio.h>
#include "gtm_string.h"
#include "gdsroot.h"
#include "gdsbt.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsfhead.h"
#include "cmidef.h"
#include "hashtab_mname.h" /* needed for cmmdef.h */
#include "cmmdef.h"
#include "cmi.h"
#include "gt_timer.h"
#include "gvcmy_remlkmgr.h"
#include "gvcmz.h"
#include "lock_cmtimeout.h"
#include "iosp.h"
GBLREF volatile int4 outofband;
GBLREF unsigned char cm_action;
GBLDEF unsigned short lkresponse_count;
GBLDEF struct CLB *lktask_x;
GBLDEF uint4 lkstatus;
GBLDEF unsigned char lkerror;
GBLDEF struct CLB *lkerrlnk;
GBLREF cm_lk_response *lk_granted, *lk_suspended;
GBLREF unsigned short lksusp_sent, lksusp_rec;
GBLREF bool out_of_time;
GBLDEF bool lk_cm_noresponse;
#define CM_LKWAIT_TIME 100 /* ms */
#define CM_LKNORESPONSE_TIME 60 * 1000 /* ms */
bool gvcmy_remlkmgr(unsigned short count)
{
char errbuf[90];
unsigned char *c_ptr;
int4 *delay;
uint4 status, norm_stat;
boolean_t one_try, noresponse_timer;
cm_lk_response *lk_res_ptr, *lk_resume;
error_def(ERR_BADSRVRNETMSG);
error_def(ERR_TEXT);
one_try = TRUE;
lk_cm_noresponse = FALSE;
noresponse_timer = FALSE;
while (CMMS_M_LKGRANTED != lkstatus)
{
while (lkresponse_count < count && !lkerror)
{
if (!one_try && (outofband || out_of_time))
{
lkstatus = CMMS_L_LKCANCEL;
break;
}
if (one_try && out_of_time && !noresponse_timer)
{
start_timer((TID)lock_cmtimeout, CM_LKNORESPONSE_TIME, lock_cmtimeout, 0, NULL);
noresponse_timer = TRUE;
}
if (one_try && lk_cm_noresponse)
{
lkstatus = CMMS_L_LKCANCEL;
break;
}
CMI_IDLE(CM_LKWAIT_TIME);
}
if (noresponse_timer && (FALSE == lk_cm_noresponse))
cancel_timer((TID)lock_cmtimeout);
lk_cm_noresponse = FALSE; /* reset flags */
noresponse_timer = FALSE;
if (lkerror)
{
if (CMI_CLB_ERROR(lkerrlnk))
gvcmz_error(lkerror, CMI_CLB_IOSTATUS(lkerrlnk));
else
{
if (CMMS_E_ERROR != *(lkerrlnk->mbf))
{
SPRINTF(errbuf, "gvcmy_remlkmgr 1: expected CMMS_E_ERROR, got %d", (int)(*(lkerrlnk->mbf)));
rts_error(VARLSTCNT(6) ERR_BADSRVRNETMSG, 0, ERR_TEXT, 2, LEN_AND_STR(errbuf));
} else
gvcmz_errmsg(lkerrlnk, FALSE);
}
}
one_try = FALSE;
if (SS_NORMAL == lkstatus)
lkstatus = CMMS_M_LKGRANTED;
else if (CMMS_L_LKCANCEL == lkstatus)
{
gvcmz_int_lkcancel();
return FALSE;
} else
{
assert(lktask_x);
lktask_x->ast = gvcmz_lkacquire_ast;
status = cmi_read(lktask_x);
if (CMI_ERROR(status))
{
((link_info *)(lktask_x->usr))->neterr = TRUE;
gvcmz_error(CMMS_L_LKACQUIRE, status);
return FALSE;
}
while ((lksusp_sent != lksusp_rec) || lktask_x->ast)
{
if (lkerror || ((lksusp_sent == lksusp_rec) && (CMMS_L_LKCANCEL == lkstatus)))
break;
if (outofband || out_of_time)
{
lkstatus = CMMS_L_LKCANCEL;
break;
}
CMI_IDLE(CM_LKWAIT_TIME);
}
if (lkerror)
{
if (CMI_CLB_ERROR(lkerrlnk))
gvcmz_error(lkerror, CMI_CLB_IOSTATUS(lkerrlnk));
else
{ if (CMMS_E_ERROR != *(lkerrlnk->mbf))
{
SPRINTF(errbuf, "gvcmy_remlkmgr 2: expected CMMS_E_ERROR, got %d",
(int)(*(lkerrlnk->mbf)));
rts_error(VARLSTCNT(6) ERR_BADSRVRNETMSG, 0, ERR_TEXT, 2, LEN_AND_STR(errbuf));
} else
gvcmz_errmsg(lkerrlnk, FALSE);
}
}
if (CMMS_L_LKCANCEL == lkstatus)
{
gvcmz_int_lkcancel();
return FALSE;
}
if (CMMS_M_LKGRANTED != *lktask_x->mbf)
{
if (CMMS_E_ERROR != *(lktask_x->mbf))
{
SPRINTF(errbuf, "gvcmy_remlkmgr 3: expected CMMS_E_ERROR, got %d", (int)(*(lkerrlnk->mbf)));
rts_error(VARLSTCNT(6) ERR_BADSRVRNETMSG, 0, ERR_TEXT, 2, LEN_AND_STR(errbuf));
}
gvcmz_errmsg(lktask_x, FALSE);
}
((link_info *)(lktask_x->usr))->lck_info |=
(CM_ZALLOCATES == cm_action) ? REMOTE_ZALLOCATES : REMOTE_LOCKS;
lk_res_ptr = &((link_info *)(lktask_x->usr))->lk_response;
lk_res_ptr->response = lktask_x;
lk_res_ptr->next = lk_granted;
lk_granted = lk_res_ptr;
lktask_x = 0;
lkstatus = SS_NORMAL;
lk_resume = lk_suspended;
while (lk_resume)
{
lk_suspended = lk_suspended->next;
lk_resume->response->ast = 0;
c_ptr = lk_resume->response->mbf;
*c_ptr++ = CMMS_L_LKRESUME;
*c_ptr++ = cm_action;
lk_resume->response->cbl = S_HDRSIZE + S_LAFLAGSIZE;
status = cmi_write(lk_resume->response);
if (CMI_ERROR(status))
{
((link_info *)(lk_resume->response->usr))->neterr = TRUE;
gvcmz_error(CMMS_L_LKRESUME, status);
return FALSE;
}
((link_info *)(lk_resume->response->usr))->lck_info -=
(CM_ZALLOCATES == cm_action) ? REMOTE_ZALLOCATES : REMOTE_LOCKS;
lk_resume->response->ast = gvcmz_lkread_ast;
status = cmi_read(lk_resume->response);
if (CMI_ERROR(status))
{
((link_info *)(lk_resume->response->usr))->neterr = TRUE;
gvcmz_error(CMMS_L_LKRESUME, status);
return FALSE;
}
lk_resume->next = NULL;
lk_resume = lk_suspended;
}
if (lkerror)
{
if (CMI_CLB_ERROR(lkerrlnk))
gvcmz_error(lkerror, CMI_CLB_IOSTATUS(lkerrlnk));
else
{
if (CMMS_E_ERROR != *(lkerrlnk->mbf))
{
SPRINTF(errbuf, "gvcmy_remlkmgr 4: expected CMMS_E_ERROR, got %d",
(int)(*(lkerrlnk->mbf)));
rts_error(VARLSTCNT(6) ERR_BADSRVRNETMSG, 0, ERR_TEXT, 2, LEN_AND_STR(errbuf));
} else
gvcmz_errmsg(lkerrlnk,FALSE);
}
}
lkresponse_count = 1; /* smw 97/7/7 what is this */
}
}
return TRUE;
}