externstruct HTABLE *qmgr_transport_byname; /* transport by name */ extern QMGR_TRANSPORT_LIST qmgr_transport_list; /* transports, round robin */
/* *Deliveryagentsprovidefeedback,ashintsthatPostfixshouldexpend *moreorfewerresourcesonaspecificdestinationdomain.Themain.cf *filespecifieshowfeedbackaffectsdeliveryconcurrency:add/subtracta *constant,aratioofconstants,oraconstantdividedbythedelivery *concurrency;anditspecifieshowmuchfeedbackmustaccumulatebetween *concurrencyupdates.
*/ struct QMGR_FEEDBACK { int hysteresis; /* to pass, need to be this tall */ double base; /* pre-computed from main.cf */ int index; /* none, window, sqrt(window) */
};
struct QMGR_TRANSPORT { int flags; /* blocked, etc. */ int pending; /* incomplete DA connections */ char *name; /* transport name */ int dest_concurrency_limit; /* concurrency per domain */ int init_dest_concurrency; /* init. per-domain concurrency */ int recipient_limit; /* recipients per transaction */ int rcpt_per_stack; /* extra slots reserved for jobs put
* on the job stack */ int rcpt_unused; /* available in-core recipient slots */ int refill_limit; /* recipient batch size for message
* refill */ int refill_delay; /* delay before message refill */ int slot_cost; /* cost of new preemption slot (# of
* selected entries) */ int slot_loan; /* preemption boost offset and */ int slot_loan_factor; /* factor, see qmgr_job_preempt() */ int min_slots; /* when preemption can take effect at
* all */ struct HTABLE *queue_byname; /* queues indexed by domain */
QMGR_QUEUE_LIST queue_list; /* queues, round robin order */ struct HTABLE *job_byname; /* jobs indexed by queue id */
QMGR_JOB_LIST job_list; /* list of message jobs (1 per
* message) ordered by scheduler */
QMGR_JOB_LIST job_bytime; /* jobs ordered by time since queued */
QMGR_JOB *job_current; /* keeps track of the current job */
QMGR_JOB *job_next_unread; /* next job with unread recipients */
QMGR_JOB *candidate_cache; /* cached result from
* qmgr_job_candidate() */
QMGR_JOB *candidate_cache_current; /* current job tied to the candidate */
time_t candidate_cache_time; /* when candidate_cache was last
* updated */ int blocker_tag; /* for marking blocker jobs */
QMGR_TRANSPORT_LIST peers; /* linkage */
DSN *dsn; /* why unavailable */
QMGR_FEEDBACK pos_feedback; /* positive feedback control */
QMGR_FEEDBACK neg_feedback; /* negative feedback control */ int fail_cohort_limit; /* flow shutdown control */ int xport_rate_delay; /* suspend per delivery */ int rate_delay; /* suspend per delivery */
};
struct QMGR_JOB {
QMGR_MESSAGE *message; /* message delivered by this job */
QMGR_TRANSPORT *transport; /* transport this job belongs to */
QMGR_JOB_LIST message_peers; /* per message neighbor linkage */
QMGR_JOB_LIST transport_peers; /* per transport neighbor linkage */
QMGR_JOB_LIST time_peers; /* by time neighbor linkage */
QMGR_JOB *stack_parent; /* stack parent */
QMGR_JOB_LIST stack_children; /* all stack children */
QMGR_JOB_LIST stack_siblings; /* stack children linkage */ int stack_level; /* job stack nesting level (-1 means
* it's not on the lists at all) */ int blocker_tag; /* tagged if blocks the job list */ struct HTABLE *peer_byname; /* message job peers, indexed by
* domain */
QMGR_PEER_LIST peer_list; /* list of message job peers */ int slots_used; /* slots used during preemption */ int slots_available; /* slots available for preemption (in
* multiples of slot_cost) */ int selected_entries; /* # of entries selected for delivery
* so far */ int read_entries; /* # of entries read in-core so far */ int rcpt_count; /* used recipient slots */ int rcpt_limit; /* available recipient slots */
};
struct QMGR_PEER {
QMGR_JOB *job; /* job handling this peer */
QMGR_QUEUE *queue; /* queue corresponding with this peer */ int refcount; /* peer entries */
QMGR_ENTRY_LIST entry_list; /* todo message entries queued for
* this peer */
QMGR_PEER_LIST peers; /* neighbor linkage */
};
/* *Queuescancontext.
*/ struct QMGR_SCAN { char *queue; /* queue name */ int flags; /* private, this run */ int nflags; /* private, next run */ struct SCAN_DIR *handle; /* scan */
};
/* *Flagsthatcontrolqueuescansordestinationselection.Theseare *similartotheQMGR_REQ_XXXrequestcodes.
*/ #define QMGR_SCAN_START (1<<0) /* start now/restart when done */ #define QMGR_SCAN_ALL (1<<1) /* all queue file time stamps */ #define QMGR_FLUSH_ONCE (1<<2) /* unthrottle once */ #define QMGR_FLUSH_DFXP (1<<3) /* override defer_transports */ #define QMGR_FLUSH_EACH (1<<4) /* unthrottle per message */ #define QMGR_FORCE_EXPIRE (1<<5) /* force-defer and force-expire */
/* LICENSE /* .ad /* .fi /* The Secure Mailer license must be distributed with this software. /* AUTHOR(S) /* Wietse Venema /* IBM T.J. Watson Research /* P.O. Box 704 /* Yorktown Heights, NY 10598, USA /* /* Wietse Venema /* Google, Inc. /* 111 8th Avenue /* New York, NY 10011, USA /* /* Wietse Venema /* porcupine.org /* /* Preemptive scheduler enhancements: /* Patrik Rak /* Modra 6 /* 155 00, Prague, Czech Republic
/*--*/
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.19Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.