/*
* Copyright (c) 2005 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
* forth in the LICENSE file which can be found at the top level of
* the sendmail distribution.
*/
#include "sm/generic.h"
SM_RCSID("@(#)$Id: qm_rsr.c,v 1.5 2006/04/02 06:34:18 ca Exp $")
#include "sm/error.h"
#include "sm/assert.h"
#include "sm/qmgr.h"
#include "sm/qmgr-int.h"
#include "qmgr.h"
#include "qm_throttle.h"
#include "log.h"
/*
** QMGR experienced a severe resource problem, e.g., memory or disk space,
** which prevented an "essential" update (e.g., after a delivery attempt).
** Deal with it... for now: shut down the system.
** Question: how to do that? Some task must return EVTHR_TERM to the
** evthr library.
*/
/*
** QM_RSR_PROBLEM -- Deal with severe resource problem
**
** Parameters:
** qmgr_ctx -- QMGR context
** resource -- which resource?
** locktype -- kind of locking
**
** Returns:
** usual sm_error code; see qm_control()
**
** Side Effects: sets qmgr_status
**
** Locking:
** locks qmgr_ctx if requested
**
** Last code review: 2005-04-21 22:01:25
** Last code change:
*/
sm_ret_T
qm_rsr_problem(qmgr_ctx_P qmgr_ctx, uint resource, thr_lock_T locktype)
{
sm_ret_T ret;
int r;
SM_IS_QMGR_CTX(qmgr_ctx);
SM_REQUIRE(resource <= QMGR_RFL_LAST_I);
ret = SM_SUCCESS;
if (thr_lock_it(locktype))
{
r = pthread_mutex_lock(&qmgr_ctx->qmgr_mutex);
SM_LOCK_OK(r);
if (r != 0)
{
sm_log_write(qmgr_ctx->qmgr_lctx,
QM_LCAT_CONTROL, QM_LMOD_CONTROL,
SM_LOG_CRIT, 4,
"sev=CRIT, func=qm_rsr, lock=%d\n", r);
return sm_error_temp(SM_EM_Q, r);
}
}
ret = qm_control(qmgr_ctx, 1, 100, resource, THR_NO_LOCK);
qmgr_ctx->qmgr_status = QMGR_ST_RSR;
if (thr_unl_always(locktype))
{
r = pthread_mutex_unlock(&qmgr_ctx->qmgr_mutex);
SM_ASSERT(r == 0);
if (r != 0 && sm_is_success(ret))
ret = sm_error_perm(SM_EM_Q, r);
}
return ret;
}
syntax highlighted by Code2HTML, v. 0.9.1