QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *transport, const char *name, const char *nexthop) { QMGR_QUEUE *queue; /* * If possible, choose an initial concurrency of > 1 so that one bad * message or one bad network won't slow us down unnecessarily. */ queue = (QMGR_QUEUE *) mymalloc(sizeof(QMGR_QUEUE)); qmgr_queue_count++; queue->dflags = 0; queue->last_done = 0; queue->name = mystrdup(name); queue->nexthop = mystrdup(nexthop); queue->todo_refcount = 0; queue->busy_refcount = 0; queue->transport = transport; queue->window = transport->init_dest_concurrency; queue->success = queue->failure = queue->fail_cohorts = 0; QMGR_LIST_INIT(queue->todo); QMGR_LIST_INIT(queue->busy); queue->dsn = 0; queue->clog_time_to_warn = 0; QMGR_LIST_PREPEND(transport->queue_list, queue); htable_enter(transport->queue_byname, name, (char *) queue); return (queue); }
QMGR_TRANSPORT *qmgr_transport_create(const char *name) { QMGR_TRANSPORT *transport; if (htable_find(qmgr_transport_byname, name) != 0) msg_panic("qmgr_transport_create: transport exists: %s", name); transport = (QMGR_TRANSPORT *) mymalloc(sizeof(QMGR_TRANSPORT)); transport->flags = 0; transport->pending = 0; transport->name = mystrdup(name); /* * Use global configuration settings or transport-specific settings. */ transport->dest_concurrency_limit = get_mail_conf_int2(name, _DEST_CON_LIMIT, var_dest_con_limit, 0, 0); transport->recipient_limit = get_mail_conf_int2(name, _DEST_RCPT_LIMIT, var_dest_rcpt_limit, 0, 0); transport->init_dest_concurrency = get_mail_conf_int2(name, _INIT_DEST_CON, var_init_dest_concurrency, 1, 0); transport->xport_rate_delay = get_mail_conf_time2(name, _XPORT_RATE_DELAY, var_xport_rate_delay, 's', 0, 0); transport->rate_delay = get_mail_conf_time2(name, _DEST_RATE_DELAY, var_dest_rate_delay, 's', 0, 0); if (transport->rate_delay > 0) transport->dest_concurrency_limit = 1; if (transport->dest_concurrency_limit != 0 && transport->dest_concurrency_limit < transport->init_dest_concurrency) transport->init_dest_concurrency = transport->dest_concurrency_limit; transport->slot_cost = get_mail_conf_int2(name, _DELIVERY_SLOT_COST, var_delivery_slot_cost, 0, 0); transport->slot_loan = get_mail_conf_int2(name, _DELIVERY_SLOT_LOAN, var_delivery_slot_loan, 0, 0); transport->slot_loan_factor = 100 - get_mail_conf_int2(name, _DELIVERY_SLOT_DISCOUNT, var_delivery_slot_discount, 0, 100); transport->min_slots = get_mail_conf_int2(name, _MIN_DELIVERY_SLOTS, var_min_delivery_slots, 0, 0); transport->rcpt_unused = get_mail_conf_int2(name, _XPORT_RCPT_LIMIT, var_xport_rcpt_limit, 0, 0); transport->rcpt_per_stack = get_mail_conf_int2(name, _STACK_RCPT_LIMIT, var_stack_rcpt_limit, 0, 0); transport->refill_limit = get_mail_conf_int2(name, _XPORT_REFILL_LIMIT, var_xport_refill_limit, 1, 0); transport->refill_delay = get_mail_conf_time2(name, _XPORT_REFILL_DELAY, var_xport_refill_delay, 's', 1, 0); transport->queue_byname = htable_create(0); QMGR_LIST_INIT(transport->queue_list); transport->job_byname = htable_create(0); QMGR_LIST_INIT(transport->job_list); QMGR_LIST_INIT(transport->job_bytime); transport->job_current = 0; transport->job_next_unread = 0; transport->candidate_cache = 0; transport->candidate_cache_current = 0; transport->candidate_cache_time = (time_t) 0; transport->blocker_tag = 1; transport->dsn = 0; qmgr_feedback_init(&transport->pos_feedback, name, _CONC_POS_FDBACK, VAR_CONC_POS_FDBACK, var_conc_pos_feedback); qmgr_feedback_init(&transport->neg_feedback, name, _CONC_NEG_FDBACK, VAR_CONC_NEG_FDBACK, var_conc_neg_feedback); transport->fail_cohort_limit = get_mail_conf_int2(name, _CONC_COHORT_LIM, var_conc_cohort_limit, 0, 0); if (qmgr_transport_byname == 0) qmgr_transport_byname = htable_create(10); htable_enter(qmgr_transport_byname, name, (void *) transport); QMGR_LIST_PREPEND(qmgr_transport_list, transport, peers); if (msg_verbose) msg_info("qmgr_transport_create: %s concurrency %d recipients %d", transport->name, transport->dest_concurrency_limit, transport->recipient_limit); return (transport); }