85 #include <sys/types.h>
88 #ifdef USE_SYS_SELECT_H
89 #include <sys/select.h>
167 #ifndef QMGR_TRANSPORT_MAX_PEND
168 #define QMGR_TRANSPORT_MAX_PEND 2
181 static void qmgr_transport_unthrottle_wrapper(
int unused_event,
void *context)
190 const char *myname =
"qmgr_transport_unthrottle";
202 if (transport->
dsn == 0)
203 msg_panic(
"%s: transport %s: null reason",
204 myname, transport->
name);
218 const char *myname =
"qmgr_transport_throttle";
227 msg_info(
"%s: transport %s: status: %s reason: %s",
231 msg_panic(
"%s: transport %s: spurious reason: %s",
241 static void qmgr_transport_abort(
int unused_event,
void *context)
250 static void qmgr_transport_rate_event(
int unused_event,
void *context)
260 static void qmgr_transport_event(
int unused_event,
void *context)
291 msg_panic(
"transport_event: missing rate lock for transport %s",
319 #define MIN5af51743e4eef(x, y) ((x) < (y) ? (x) : (y))
321 for (xport = qmgr_transport_list.
next; xport; xport = xport->
peers.
next) {
352 msg_panic(
"qmgr_transport: dead transport: %s", transport->
name);
354 msg_panic(
"qmgr_transport: rate-locked transport: %s", transport->
name);
356 msg_panic(
"qmgr_transport: excess allocation: %s", transport->
name);
390 msg_warn(
"connect to transport %s/%s: %m",
395 #if (EVENTS_STYLE != EVENTS_STYLE_SELECT) && defined(CA_VSTREAM_CTL_DUPFD)
396 #ifndef THRESHOLD_FD_WORKAROUND
397 #define THRESHOLD_FD_WORKAROUND 128
400 CA_VSTREAM_CTL_DUPFD(THRESHOLD_FD_WORKAROUND),
420 msg_panic(
"qmgr_transport_create: transport exists: %s", name);
422 transport->
flags = 0;
488 if (qmgr_transport_byname == 0)
490 htable_enter(qmgr_transport_byname, name, (
void *) transport);
493 msg_info(
"qmgr_transport_create: %s concurrency %d recipients %d",
struct HTABLE * job_byname
void event_enable_read(int fd, EVENT_NOTIFY_RDWR_FN callback, void *context)
int var_xport_refill_limit
int dest_concurrency_limit
int var_delivery_slot_loan
char * mystrdup(const char *str)
#define _MIN_DELIVERY_SLOTS
HTABLE * qmgr_transport_byname
#define _STACK_RCPT_LIMIT
NORETURN msg_panic(const char *fmt,...)
#define _XPORT_RCPT_LIMIT
VSTREAM * mail_connect(const char *class, const char *name, int block_mode)
#define MIN5af51743e4eef(x, y)
#define QMGR_TRANSPORT_MAX_PEND
#define VAR_CONC_NEG_FDBACK
QMGR_TRANSPORT * qmgr_transport_find(const char *name)
QMGR_FEEDBACK neg_feedback
int var_init_dest_concurrency
char * var_conc_pos_feedback
int init_dest_concurrency
#define QMGR_LIST_INIT(head)
#define _XPORT_REFILL_LIMIT
QMGR_TRANSPORT_LIST qmgr_transport_list
HTABLE * htable_create(ssize_t size)
#define QMGR_LIST_ROTATE(head, object)
char * var_conc_neg_feedback
struct HTABLE * queue_byname
#define _XPORT_RATE_DELAY
int var_xport_refill_delay
#define _XPORT_REFILL_DELAY
int get_mail_conf_time2(const char *, const char *, int, int, int, int)
void msg_warn(const char *fmt,...)
int var_min_delivery_slots
int var_delivery_slot_cost
#define VAR_CONC_POS_FDBACK
QMGR_TRANSPORT_LIST peers
QMGR_JOB * job_next_unread
void * htable_find(HTABLE *table, const char *key)
QMGR_JOB * candidate_cache
time_t candidate_cache_time
NORETURN msg_fatal(const char *fmt,...)
#define _DELIVERY_SLOT_DISCOUNT
int get_mail_conf_int2(const char *, const char *, int, int, int)
void qmgr_transport_unthrottle(QMGR_TRANSPORT *transport)
void qmgr_transport_alloc(QMGR_TRANSPORT *transport, QMGR_TRANSPORT_ALLOC_NOTIFY notify)
QMGR_QUEUE_LIST queue_list
void qmgr_feedback_init(QMGR_FEEDBACK *, const char *, const char *, const char *, const char *)
QMGR_TRANSPORT * qmgr_transport_select(void)
QMGR_TRANSPORT * qmgr_transport_create(const char *name)
int non_blocking(int, int)
time_t event_request_timer(EVENT_NOTIFY_TIME_FN callback, void *context, int delay)
QMGR_TRANSPORT * transport
#define QMGR_TRANSPORT_STAT_DEAD
#define QMGR_TRANSPORT_STAT_RATE_LOCK
#define vstream_fileno(vp)
int var_delivery_slot_discount
QMGR_JOB * candidate_cache_current
#define QMGR_LIST_PREPEND(head, object)
#define CA_VSTREAM_CTL_END
QMGR_FEEDBACK pos_feedback
void qmgr_transport_throttle(QMGR_TRANSPORT *transport, DSN *dsn)
#define _DELIVERY_SLOT_LOAN
void vstream_control(VSTREAM *stream, int name,...)
void event_disable_readwrite(int fd)
#define QMGR_QUEUE_READY(q)
#define _DELIVERY_SLOT_COST
int event_cancel_timer(EVENT_NOTIFY_TIME_FN callback, void *context)
void(* QMGR_TRANSPORT_ALLOC_NOTIFY)(QMGR_TRANSPORT *, VSTREAM *)
#define MAIL_CLASS_PRIVATE
int var_transport_retry_time
void * mymalloc(ssize_t len)
int var_conc_cohort_limit
QMGR_TRANSPORT_ALLOC_NOTIFY notify
HTABLE_INFO * htable_enter(HTABLE *table, const char *key, void *value)
void msg_info(const char *fmt,...)