/* * Copyright (c) 2003-2006 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. * * $Id: occ.h,v 1.31 2006/02/17 18:45:11 ca Exp $ */ #ifndef SM_OCC_H #define SM_OCC_H 1 #include "sm/generic.h" #include "sm/magic.h" #include "sm/types.h" #include "sm/time.h" #include "sm/net.h" /* IPv4 type */ #include "sm/pthread.h" #include "sm/queue.h" #include "sm/qmgr.h" #include "sm/occstr.h" #include "sm/io.h" #if DA_OCC_RSC # include "sm/rsc.h" # define OCC_HT_P rsc_P #else # include "sm/bhtable.h" # define OCC_HT_P bht_P #endif #ifndef OCC_CHECK # define OCC_CHECK 1 #endif typedef struct occ_entry_S occ_entry_T, *occ_entry_P; typedef SIMPLEQ_HEAD(, occ_entry_S) occ_entry_hd_T, *occ_entry_hd_P; /* Outgoing (open) Connection Cache context */ struct occ_ctx_S { #if OCC_CHECK sm_magic_T sm_magic; #endif pthread_mutex_t occx_mutex; /* strings to perform lookups */ sm_str_P occx_lhs; sm_str_P occx_tag; sm_str_P occx_rhs; occ_entry_hd_T occx_fl_hd; /* list of free OCC entries */ OCC_HT_P occx_ht; /* connection cache */ }; /* Outgoing (open) Connection Cache entry */ struct occ_entry_S { #if OCC_CHECK sm_magic_T sm_magic; #endif /* individual locking required? pthread_mutex_t occe_mutex; */ ipv4_T occe_srv_ipv4; /* XXX HACK! */ uint occe_flags; /* concurrency control: initial, current, maximum */ uint occe_init_conc; uint occe_cur_conc; uint occe_max_conc; uint occe_open_se; /* # of open sessions */ uint occe_open_ta; /* # of open transaction */ #if 0 time_T occe_last_conn; /* time of last connect */ #endif time_T occe_last_upd; /* time of last update */ uint occe_timeout; /* expire entry after this timeout */ SIMPLEQ_ENTRY(occ_entry_S) occ_fl; /* next free entry */ }; /* OCC entry flags; see also DA entry flags */ #define OCCE_FL_NONE 0x0000 /* guess */ #define OCCE_FL_USED 0x0001 /* in use */ /* inform scheduler when a session is done */ #define OCCE_FL_SE_WAIT 0x0002 /* inform scheduler when a transaction is done */ #define OCCE_FL_TA_WAIT 0x0004 #define OCCE_FL_LOGEXC 0x0008 /* "limit exceeded" has been logged */ #define OCCE_FL_BLW_LIM 0x0010 /* occe_open_se < occe_cur_conc */ #define OCCE_SET_FLAG(occ_entry, fl) (occ_entry)->occe_flags |= (fl) #define OCCE_CLR_FLAG(occ_entry, fl) (occ_entry)->occe_flags &= ~(fl) #define OCCE_IS_FLAG(occ_entry, fl) (((occ_entry)->occe_flags & (fl)) != 0) #define OCCFL_INIT(occ_fl_hd) SIMPLEQ_INIT(occ_fl_hd) #define OCCFL_FIRST(occ_fl_hd) SIMPLEQ_FIRST(occ_fl_hd) #define OCCFL_END(occ_fl_hd) SIMPLEQ_END(occ_fl_hd) #define OCCFL_EMPTY(occ_fl_hd) SIMPLEQ_EMPTY(occ_fl_hd) #define OCCFL_NEXT(occ_entry) SIMPLEQ_NEXT(occ_entry, occ_fl) #define OCCFL_PRE(occ_fl_hd, occ_entry) SIMPLEQ_INSERT_HEAD(occ_fl_hd, occ_entry, occ_fl) #define OCCFL_APP(occ_fl_hd, occ_entry) SIMPLEQ_INSERT_TAIL(occ_fl_hd, occ_entry, occ_fl) #define OCCFL_REMOVE(occ_fl_hd) SIMPLEQ_REMOVE_HEAD(occ_fl_hd, occ_fl) sm_ret_T occ_entry_find(OCC_HT_P occ_ht, ipv4_T ipv4, occ_entry_P *pocc_entry, pthread_mutex_t *occ_mutex, thr_lock_T locktype); sm_ret_T occ_print(occ_ctx_P _occ_ctx, sm_file_T *_fp, thr_lock_T _locktype); #endif /* SM_OCC_H */