80 #include <sys/types.h>
83 #ifdef USE_SYS_SELECT_H
84 #include <sys/select.h>
162 #ifndef QMGR_TRANSPORT_MAX_PEND
163 #define QMGR_TRANSPORT_MAX_PEND 2
176 static void qmgr_transport_unthrottle_wrapper(
int unused_event,
void *context)
185 const char *myname =
"qmgr_transport_unthrottle";
197 if (transport->
dsn == 0)
198 msg_panic(
"%s: transport %s: null reason",
199 myname, transport->
name);
213 const char *myname =
"qmgr_transport_throttle";
222 msg_info(
"%s: transport %s: status: %s reason: %s",
226 msg_panic(
"%s: transport %s: spurious reason: %s",
236 static void qmgr_transport_abort(
int unused_event,
void *context)
245 static void qmgr_transport_rate_event(
int unused_event,
void *context)
255 static void qmgr_transport_event(
int unused_event,
void *context)
286 msg_panic(
"transport_event: missing rate lock for transport %s",
314 #define MIN5af51743e4eef(x, y) ((x) < (y) ? (x) : (y))
316 for (xport = qmgr_transport_list.
next; xport; xport = xport->
peers.
next) {
347 msg_panic(
"qmgr_transport: dead transport: %s", transport->
name);
349 msg_panic(
"qmgr_transport: rate-locked transport: %s", transport->
name);
351 msg_panic(
"qmgr_transport: excess allocation: %s", transport->
name);
385 msg_warn(
"connect to transport %s/%s: %m",
390 #if (EVENTS_STYLE != EVENTS_STYLE_SELECT) && defined(CA_VSTREAM_CTL_DUPFD)
391 #ifndef THRESHOLD_FD_WORKAROUND
392 #define THRESHOLD_FD_WORKAROUND 128
395 CA_VSTREAM_CTL_DUPFD(THRESHOLD_FD_WORKAROUND),
415 msg_panic(
"qmgr_transport_create: transport exists: %s", name);
417 transport->
flags = 0;
456 if (qmgr_transport_byname == 0)
458 htable_enter(qmgr_transport_byname, name, (
void *) transport);
461 msg_info(
"qmgr_transport_create: %s concurrency %d recipients %d",
void event_enable_read(int fd, EVENT_NOTIFY_RDWR_FN callback, void *context)
int dest_concurrency_limit
char * mystrdup(const char *str)
HTABLE * qmgr_transport_byname
#define MIN5af51743e4eef(x, y)
NORETURN msg_panic(const char *fmt,...)
VSTREAM * mail_connect(const char *class, const char *name, int block_mode)
#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 QMGR_LIST_APPEND(head, object)
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 get_mail_conf_time2(const char *, const char *, int, int, int, int)
void msg_warn(const char *fmt,...)
#define VAR_CONC_POS_FDBACK
QMGR_TRANSPORT_LIST peers
void * htable_find(HTABLE *table, const char *key)
#define QMGR_TRANSPORT_MAX_PEND
NORETURN msg_fatal(const char *fmt,...)
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)
#define CA_VSTREAM_CTL_END
QMGR_FEEDBACK pos_feedback
void qmgr_transport_throttle(QMGR_TRANSPORT *transport, DSN *dsn)
void vstream_control(VSTREAM *stream, int name,...)
void event_disable_readwrite(int fd)
#define QMGR_QUEUE_READY(q)
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,...)