/**************************************************************************** * * Copyright (c) 2001 Novell, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, contact Novell, Inc. * * To contact Novell about this file by physical or electronic mail, you * may find current contact information at www.novell.com. * ****************************************************************************/ #ifndef QUEUE_H #define QUEUE_H #include "queued.h" #include "conf.h" #define SPOOL_LOCK_ARRAY_SIZE 256 #define SPOOL_LOCK_IDARRAY_SIZE 64 typedef struct _QueuePushClient { int port; int queue; unsigned long address; unsigned long usageCount; unsigned long errorCount; unsigned char identifier[MDB_MAX_OBJECT_CHARS + 1]; } QueuePushClient; typedef struct _Queue { /* Queue IDs */ unsigned long queueID; XplMutex queueIDLock; struct { XplSemaphore semaphores[SPOOL_LOCK_ARRAY_SIZE]; unsigned long *entryIDs; } spoolLocks; /* Queue agent management */ struct { XplMutex lock; int count; int allocated; QueuePushClient *array; } pushClients; BOOL pushClientsRegistered[8]; /* Worker threads */ /* FIXME: use a thread pool here */ XplSemaphore todo; XplAtomic activeWorkers; #if QUEUE_COMPLETE XplAtomic maximumWorkers; long defaultSequential; long maxSequential; long check; #endif BOOL restartNeeded; BOOL flushNeeded; /* Bounce management */ time_t lastBounce; unsigned long bounceCount; /* Statistics */ XplAtomic numServicedAgents; XplAtomic queuedLocal; XplAtomic localDeliveryFailed; XplAtomic remoteDeliveryFailed; XplAtomic totalSpam; } MessageQueue; extern MessageQueue Queue; FILE * fopen_check(FILE **handle, char *path, char *mode, int line); int fclose_check(FILE **handle, int line); int unlink_check(char *path, int line); int rename_check(const char *oldpath, const char *newpath, int line); BOOL QueueInit(void); void QueueShutdown(void); int CreateQueueThreads(BOOL failed); int CommandQaddm(void *param); int CommandQaddq(void *param); int CommandQabrt(void *param); int CommandQbody(void *param); int CommandQbraw(void *param); int CommandQcopy(void *param); int CommandQcrea(void *param); int CommandQdele(void *param); int CommandQdone(void *param); int CommandQdspc(void *param); int CommandQend(void *param); int CommandQgrep(void *param); int CommandQhead(void *param); int CommandQinfo(void *param); int CommandQmodFrom(void *param); int CommandQmodFlags(void *param); int CommandQmodLocal(void *param); int CommandQmodMailbox(void *param); int CommandQmodRaw(void *param); int CommandQmodTo(void *param); int CommandQmime(void *param); int CommandQmove(void *param); int CommandQrcp(void *param); int CommandQretr(void *param); int CommandQrts(void *param); int CommandQrun(void *param); int CommandQsql(void *param); int CommandQsrchDomain(void *param); int CommandQsrchHeader(void *param); int CommandQsrchBody(void *param); int CommandQsrchBraw(void *param); int CommandQstorAddress(void *param); int CommandQstorCal(void *param); int CommandQstorFlags(void *param); int CommandQstorFrom(void *param); int CommandQstorLocal(void *param); int CommandQstorMessage(void *param); int CommandQstorRaw(void *param); int CommandQstorTo(void *param); int CommandQwait(void *param); int CommandQflush(void *param); #endif