/* * 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: dadbstr.h,v 1.23 2007/05/28 17:15:36 ca Exp $ */ #ifndef SM_DADBSTR_H #define SM_DADBSTR_H 1 #include "sm/generic.h" #include "sm/magic.h" #include "sm/types.h" #include "sm/pthread.h" #include "sm/net.h" #include "sm/ring.h" #include "sm/str.h" #ifndef DADB_CHECK # define DADB_CHECK 1 #endif typedef struct dadb_ctx_S dadb_ctx_T, *dadb_ctx_P; typedef struct dadb_entry_S dadb_entry_T, *dadb_entry_P; /* ** Delivery Agent (SMTPC) DataBase Context ** For each SMTP client process one dadb_ctx is created which keeps track ** of that client. It keeps track of all possible threads in that process ** by creating an array of dadb_entries. The size of that array is the ** maximum number of threads in the DA. The number of active entries can ** be dynamically limited to control the load the DA generates. ** Each dadb_entry describes a session in the DA. */ struct dadb_ctx_S { #if DADB_CHECK sm_magic_T sm_magic; #endif /* locks state, entries_{lim,cur}, entries */ pthread_mutex_t dadb_mutex; /* ** dadb_state MUST be checked by every function that wants to ** access/modify elements of dadb_ctx. ** This way state can be used as additional "mutex" for dadb_ctx: ** lock(dadb_mutex); ** check state: don't do anything if !DADB_IS_OK() (except unlock) ** to stop others: set state appropriately ** unlock(dadb_mutex); */ uint dadb_state; uint dadb_entries_max; /* maximum number of entries */ uint dadb_entries_lim; /* current max (dynamic) */ uint dadb_entries_cur; /* current number of entries */ uint dadb_entries_idle; /* idle entries */ dadb_entry_P *dadb_entries; /* array of entries for DA status */ /* this array is from 0 to dadb_entries_max-1 */ #if DADB_STATS /* maximum number of entries ever used (statistics only) */ uint dadb_entries_max_used; #endif }; struct dadb_entry_S { #if DADB_CHECK sm_magic_T sm_magic; #endif #if DADBE_MUTEX pthread_mutex_t dadbe_mutex; /* really needed??? */ #endif uint dadbe_flags; /* ** DA session id: primary key in bht(? not yet!) ** only used to tell DA the session id */ sessta_id_T dadbe_da_se_id; /* DA transaction id: secondary key in bht */ sessta_id_T dadbe_da_ta_id; sessta_id_T dadbe_ss_ta_id; /* copy of SMTPS TA id */ /* this doesn't belong here... -> OCC (open connection cache) */ ipv4_T dadbe_srv_ipv4; /* XXX HACK! */ /* ** Pointer to one recipient for the transaction. ** Outgoing from this rcpt all others can be found via aqr_da_link ** in the aq_rcpt structure. */ aq_rcpt_P dadbe_rcpt; time_T dadbe_lastuse; /* DA last used */ #if MTA_USE_TLS sm_ret_T dadbe_se_maprescnf; /* map lookup result for session conf */ sm_str_P dadbe_se_conf; /* extra session configuration data */ sm_str_P dadbe_lhs; sm_str_P dadbe_tag; #endif #if DADB_STATS /* statistics; used to implement limits */ uint dadbe_ntas; /* number of transactions */ uint dadbe_nrcpts; /* number of recipients */ time_T dadbe_opened; /* session opened */ #endif /* DA_DB_STATS */ }; #if DADB_CHECK # define SM_IS_DADB(dadb) SM_REQUIRE_ISA((dadb), SM_DADB_MAGIC) # define SM_IS_DADBE(dadbe) SM_REQUIRE_ISA((dadbe), SM_DADBE_MAGIC) #else # define SM_IS_DADB(dadb) SM_REQUIRE((dadb) != NULL) # define SM_IS_DADBE(dadbe) SM_REQUIRE((dadbe) != NULL) #endif #endif /* SM_DADBSTR_H */