summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-05-28 07:41:20 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:17:09 -0500
commit5aacc765e15a212af7bb97e35cd2340f7eafd2b1 (patch)
tree8b6aa26472719ee67b3cb4238f1ba2b3be1fa9df
parent27284d47af27f705f055f1e9cbd85e304b72f0c6 (diff)
downloadsamba-5aacc765e15a212af7bb97e35cd2340f7eafd2b1.tar.gz
samba-5aacc765e15a212af7bb97e35cd2340f7eafd2b1.tar.bz2
samba-5aacc765e15a212af7bb97e35cd2340f7eafd2b1.zip
r7051: remove an unused file
(This used to be commit 7e6fbd4889a92ec985b8c6c70005cab76d64d262)
-rw-r--r--source4/web_server/ejs/mpr.h2259
1 files changed, 0 insertions, 2259 deletions
diff --git a/source4/web_server/ejs/mpr.h b/source4/web_server/ejs/mpr.h
deleted file mode 100644
index 848518befa..0000000000
--- a/source4/web_server/ejs/mpr.h
+++ /dev/null
@@ -1,2259 +0,0 @@
-///
-/// @file mpr.h
-/// @brief Header for the Mbedthis Portable Runtime (MPR)
-// @copy default
-//
-// Copyright (c) Mbedthis Software LLC, 2003-2005. All Rights Reserved.
-//
-// This software is distributed under commercial and open source licenses.
-// You may use the GPL open source license described below or you may acquire
-// a commercial license from Mbedthis Software. You agree to be fully bound
-// by the terms of either license. Consult the LICENSE.TXT distributed with
-// this software for full details.
-//
-// This software is open source; you can redistribute it and/or modify it
-// under the terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2 of the License, or (at your
-// option) any later version. See the GNU General Public License for more
-// details at: http://www.mbedthis.com/downloads/gplLicense.html
-//
-// This program is distributed WITHOUT ANY WARRANTY; without even the
-// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-//
-// This GPL license does NOT permit incorporating this software into
-// proprietary programs. If you are unable to comply with the GPL, you must
-// acquire a commercial license to use this software. Commercial licenses
-// for this software and support services are available from Mbedthis
-// Software at http://www.mbedthis.com
-//
-// @end
-//////////////////////////////// Documentation /////////////////////////////////
-//
-// See mpr.dox for additional documentation.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-#error foo
-
-#ifndef _h_MPR
-#define _h_MPR 1
-/////////////////////////////////// Includes ///////////////////////////////////
-
-#include "web_server/ejs/config.h"
-#include "web_server/ejs/mprOs.h"
-
-////////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////// C API ////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////
-#ifdef __cplusplus
-extern "C" {
-#else
-typedef int bool;
-#endif
-
-extern void mprBreakpoint(const char *file, int line, const char *msg);
-
-#if BLD_FEATURE_ASSERT
-#define mprAssert(C) \
- if (C) ; else mprError(MPR_L, MPR_TRAP, "%s", #C)
-#define inlineAssert(C) \
- if (C) ; else mprBreakpoint(MPR_L, #C)
-#else
- #define mprAssert(C) if (1) ; else
- #define inlineAssert(C) if (1) ; else
-#endif
-
-/////////////////////////////////// Constants //////////////////////////////////
-
-#if BLD_FEATURE_SQUEEZE
-///
-/// Maximum length of a file path name. Reduced from the system maximum to
-/// save memory space.
-///
-#define MPR_MAX_PATH 256 ///< Reasonable max path name
-#else
-#define MPR_MAX_PATH 1024
-#endif
-
-#if BLD_FEATURE_SQUEEZE
-///
-/// Reasonable length of a file name used by the product. Use where you know
-/// the expected file name and it is certain to be less than this limit.
-///
-#define MPR_MAX_FNAME 128 ///< Reasonable size of a file name
-#define MPR_DEFAULT_ALLOC 64 // Default small alloc size
-#define MPR_DEFAULT_HASH_SIZE 23 // Default size of hash table index
-#define MPR_DEFAULT_STACK (32 * 1024) // Default stack size
-#else
-#define MPR_MAX_FNAME 256
-#define MPR_DEFAULT_ALLOC 128 // Default small alloc size
-#define MPR_DEFAULT_HASH_SIZE 43 // Default size of hash table index
-#define MPR_DEFAULT_STACK (64 * 1024) // Default stack size
-#endif
-
-#if BLD_FEATURE_SQUEEZE
-#define MPR_MAX_ARGC 32 // Reasonable max of args
-#define MPR_MAX_STRING 512 // Maximum string size
-#define MPR_MAX_LOG_STRING 512 // Maximum log message
-#define MPR_MAX_URL 256 ///< Reasonable size of a URL
-#define MPR_BUFSIZE 512 ///< Reasonable size for buffers
-// FUTURE -- could be named better
-#define MPR_MAX_HEAP_SIZE (32 * 1024) // Maximum heap allocation size
-#else
-#define MPR_MAX_ARGC 128 // Reasonable max of args
-#define MPR_MAX_STRING 4096 ///< Maximum string size
-#define MPR_MAX_LOG_STRING 8192 // Maximum log message
-#define MPR_MAX_URL 1024 ///< Reasonable size of a URL
-#define MPR_BUFSIZE 1024 // Reasonable size for buffers
-#define MPR_MAX_HEAP_SIZE (64 * 1024) // Maximum heap allocation size
-#endif
-
-#define MPR_DEFAULT_BREAK_PORT 9473
-#define MPR_TIMEOUT_LOG_STAMP 3600000 // Time between log time stamps
-#define MPR_TIMEOUT_PRUNER 60000 // Time between pruner runs
-#define MPR_TIMEOUT_STOP_TASK 10000 // Timeout to stop running tasks
-#define MPR_TIMEOUT_STOP_THREAD 10000 // Timeout to stop running threads
-#define MPR_TIMEOUT_CMD_WAIT 50 // Poll for cmd processes
-#define MPR_TIMEOUT_STOP 5000 // Wait when stopping resources
-#define MPR_NUM_DIALOG 5 // Maximum number of user dialogs
-#define MPR_MAX_LOG_SIZE 5 // Default size of a log file (MB)
-#define MPR_MAX_IP_NAME 128 // Max size of an IP name
-#define MPR_MAX_IP_ADDR 16 // Max size of an IP string addr
-#define MPR_MAX_IP_ADDR_PORT 32 // Max size of IP with port
-
-#define MPR_TEST_TIMEOUT 10000 // Ten seconds
-#define MPR_TEST_LONG_TIMEOUT 300000 // 5 minutes
-#define MPR_TEST_SHORT_TIMEOUT 200 // 1/5 sec
-#define MPR_TEST_NAP 50 // When we must not block
-
-#if BLD_FEATURE_MULTITHREAD
-#define MPR_DEFAULT_MIN_THREADS 0 // Default min threads (0)
-#define MPR_DEFAULT_MAX_THREADS 10 // Default max threads (10)
-#else
-#define MPR_DEFAULT_MIN_THREADS 0 // Default min threads
-#define MPR_DEFAULT_MAX_THREADS 0 // Default max threads
-#endif
-
-//
-// MPR priorities (0 to 99)
-//
-#define MPR_BACKGROUND_PRIORITY 15 // May only get CPU if idle
-#define MPR_LOW_PRIORITY 25
-#define MPR_NORMAL_PRIORITY 50
-#define MPR_HIGH_PRIORITY 75
-#define MPR_CRITICAL_PRIORITY 99 // May not yield
-
-#define MPR_SELECT_PRIORITY 75 // Run select at higher priority
-#define MPR_POOL_PRIORITY 50 // Normal
-
-//
-// Debug control
-//
-#define MPR_MAX_BLOCKED_LOCKS 100 // Max threads blocked on lock
-#define MPR_MAX_RECURSION 15 // Max recursion with one thread
-#define MPR_MAX_LOCKS 512 // Total lock count max
-#define MPR_MAX_LOCK_TIME (60 * 1000) // Time in millisecs to hold a lock
-
-//
-// Service / daemon control
-//
-#define MPR_INSTALL_SERVICE 1
-#define MPR_UNINSTALL_SERVICE 2
-#define MPR_GO_SERVICE 3
-#define MPR_STOP_SERVICE 4
-
-//
-// Parameter values for serviceEvents(loopOnce)
-//
-#define MPR_LOOP_ONCE 1
-#define MPR_LOOP_FOREVER 0
-
-//
-// Select service flags
-//
-#define MPR_ASYNC_SELECT 0x1 // Using async select in windows
-#define MPR_BREAK_REQUESTED 0x2 // Breakout of a select wait
-#define MPR_WAITING_FOR_SELECT 0x4 // Waiting for select to complete
-
-///////////////////////////////// Error Codes //////////////////////////////////
-
-//
-// Standard MPR return and error codes
-//
-
-/// Base error code
-#define MPR_ERR_BASE (-200)
-/// General error
-#define MPR_ERR_GENERAL (MPR_ERR_BASE - 1)
-/// Action aborted
-#define MPR_ERR_ABORTED (MPR_ERR_BASE - 2)
-/// Item already exists
-#define MPR_ERR_ALREADY_EXISTS (MPR_ERR_BASE - 3)
-/// Bad arguments or paramaeters
-#define MPR_ERR_BAD_ARGS (MPR_ERR_BASE - 4)
-/// Bad input format
-#define MPR_ERR_BAD_FORMAT (MPR_ERR_BASE - 5)
-#define MPR_ERR_BAD_HANDLE (MPR_ERR_BASE - 6)
-/// Module is in a bad state
-#define MPR_ERR_BAD_STATE (MPR_ERR_BASE - 7)
-/// Input has bad syntax
-#define MPR_ERR_BAD_SYNTAX (MPR_ERR_BASE - 8)
-#define MPR_ERR_BAD_TYPE (MPR_ERR_BASE - 9)
-#define MPR_ERR_BAD_VALUE (MPR_ERR_BASE - 10)
-#define MPR_ERR_BUSY (MPR_ERR_BASE - 11)
-/// Cant access the file or resource
-#define MPR_ERR_CANT_ACCESS (MPR_ERR_BASE - 12)
-#define MPR_ERR_CANT_COMPLETE (MPR_ERR_BASE - 13)
-/// Cant create the file or resource
-#define MPR_ERR_CANT_CREATE (MPR_ERR_BASE - 14)
-#define MPR_ERR_CANT_INITIALIZE (MPR_ERR_BASE - 15)
-/// Cant open the file or resource
-#define MPR_ERR_CANT_OPEN (MPR_ERR_BASE - 16)
-/// Cant read from the file or resource
-#define MPR_ERR_CANT_READ (MPR_ERR_BASE - 17)
-/// Cant write to the file or resource
-#define MPR_ERR_CANT_WRITE (MPR_ERR_BASE - 18)
-#define MPR_ERR_DELETED (MPR_ERR_BASE - 19)
-#define MPR_ERR_NETWORK (MPR_ERR_BASE - 20)
-#define MPR_ERR_NOT_FOUND (MPR_ERR_BASE - 21)
-/// Module or resource is not initialized
-#define MPR_ERR_NOT_INITIALIZED (MPR_ERR_BASE - 22)
-#define MPR_ERR_NOT_READY (MPR_ERR_BASE - 23)
-#define MPR_ERR_READ_ONLY (MPR_ERR_BASE - 24)
-/// The operation timed out
-#define MPR_ERR_NOT_INITIALIZED (MPR_ERR_BASE - 22)
-#define MPR_ERR_TIMEOUT (MPR_ERR_BASE - 25)
-#define MPR_ERR_TOO_MANY (MPR_ERR_BASE - 26)
-#define MPR_ERR_WONT_FIT (MPR_ERR_BASE - 27)
-#define MPR_ERR_WOULD_BLOCK (MPR_ERR_BASE - 28)
-#define MPR_ERR_CANT_ALLOCATE (MPR_ERR_BASE - 29)
-#define MPR_ERR_MAX (MPR_ERR_BASE - 30)
-
-//
-// Standard error severity and trace levels. These are ored with the error
-// severities below. The MPR_LOG_MASK is used to extract the trace level
-// from a flags word. We expect most apps to run with level 2 trace.
-//
-#define MPR_FATAL 0 ///< Fatal error trace level. Cant continue.
-#define MPR_ERROR 1 ///< Hard error trace level
-#define MPR_WARN 2 ///< Soft warning trace level
-#define MPR_CONFIG 2 ///< Configuration settings trace level.
-#define MPR_INFO 3 ///< Informational trace only
-#define MPR_DEBUG 4 ///< Debug information trace level
-#define MPR_VERBOSE 9 ///< Highest level of trace
-#define MPR_LOG_MASK 0xf ///< Level mask
-
-//
-// Error flags. Specify where the error should be sent to. Note that the
-// product.xml setting "headless" will modify how errors are reported.
-// Assert errors are trapped when in DEV mode. Otherwise ignored.
-//
-#define MPR_TRAP 0x10 // Assert mprError flags -- trap in debugger
-#define MPR_LOG 0x20 ///< Log to the O/S event log mprError flag
-#define MPR_USER 0x40 ///< Display to the user mprError flag
-#define MPR_ALERT 0x80 // Send a management alert
-#define MPR_TRACE 0x100 // Trace
-
-//
-// Error format flags
-//
-#define MPR_RAW 0x200 // Raw trace output
-
-//
-// Error line number information
-//
-#define MPR_L __FILE__, __LINE__
-
-////////////////////////////////////////////////////////////////////////////////
-/////////////////////////////// Function Remappings ////////////////////////////
-////////////////////////////////////////////////////////////////////////////////
-//
-// Unsafe functions that should not be used. Define UNSAFE_STRINGS_OK before
-// including mpr.h if you really want to use these functions. A better approach
-// is to undefine them just prior to using them in your C/C++ source file.
-//
-#if BLD_FEATURE_SAFE_STRINGS
-
-#if BLD_FEATURE_PHP4_MODULE || BLD_FEATURE_PHP5_MODULE
-#ifndef UNSAFE_FUNCTIONS_OK
-#define UNSAFE_FUNCTIONS_OK 1
-#endif
-#endif
-
-#ifndef UNSAFE_FUNCTIONS_OK
-#define sprintf UseMprSprintfInstead
-#define printf UseMprPrintfInstead
-#define fprintf UseMprFprintfInstead
-#define vsprintf UseMprVsprintfInstead
-#define strtok UseMprStrTokInstead
-#define gethostbyname UseMprGetHostByNameInstead
-#define ctime UseMprCtimeInstead
-#define asctime UseMprAsctimeInstead
-#define localtime UseMprLocaltimeInstead
-#define gmtime UseMprGmtimeInstead
-#define malloc UseMprMallocInstead
-#define free UseMprFreeInstead
-#define realloc UseMprReallocInstead
-#define calloc UseMprCallocInstead
-#define strncpy UseMprStrcpyInstead
-#define inet_ntoa UseMprInetNtoaInstead
-
-//
-// FUTURE -- to the whole way
-//
-//#define strlen UseMprStrlenInstead
-//#define strcpy UseMprStrcpyInstead
-
-#endif // UNSAFE_FUNCTIONS_OK
-#endif // BLD_FEATURE_SAFE_STRINGS
-
-//
-// File information structure
-//
-struct MprFileInfo {
- uint size; // File length
- uint mtime; // Modified time
- uint inode; // Inode number
- bool isDir; // Set if directory
- bool isReg; // Set if a regular file
-};
-
-//
-// Mpr time structure. Used for mprGetTime(). Matches requirements of select().
-//
-struct MprTime {
- long sec; // Seconds
- long usec; // Microseconds (NOT milliseconds)
-};
-typedef struct MprTime MprTime;
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////// C++ APIs ///////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////
-#if __cplusplus
-
-class MprBuf;
-class MprFile;
-class MprFileSystem;
-class MprHashTable;
-class MprLink;
-class MprList;
-class MprPoolService;
-class MprPoolThread;
-class MprSelectService;
-class MprSelectHandler;
-class MprSocket;
-class MprSocketService;
-class MprStringData;
-class MprStringList;
-class MprTask;
-class MprTimerService;
-class MprTimer;
-
-#if BLD_FEATURE_LOG
-class MprLogModule;
-class MprLogService;
-class MprLogListener;
-class MprLogToFile;
-class MprLogToWindow;
-#endif
-
-#if BLD_FEATURE_CGI_MODULE
-class MprCmd;
-class MprCmdFiles;
-class MprCmdService;
-#endif
-
-#if BLD_FEATURE_MULTITHREAD
-class MprCond;
-class MprMutex;
-class MprThreadService;
-class MprThread;
-#else
-typedef void *MprMutex;
-#endif
-
-#if BLD_FEATURE_RUN_AS_SERVICE && WIN
-class MprWinService;
-#endif
-
-/////////////////////////////////// MprLink ////////////////////////////////////
-
-//
-// This define is used by classes that include a Link field member, to get
-// the base class pointer
-//
-#define MPR_GET_BASE(type, ptr, field) \
- ((type) ((int) ptr - ((int) &(((type) 1)->field) - (int) ((type) 1))))
-
-//
-// The MprLink class enables subclassed objects to be inserted in a MprList. It
-// provides forward and back links for fast insertion, removal and iteration.
-// To use MprLink, subclasses must inherit MprLink as a base class. Use
-// MprList for the dummy list header and MprLink for the list members.
-// This class is NOT thread-safe. Callers must do their own thread
-// synchronization. It is designed to be "inline", very fast and no-frills.
-//
-
-class MprLink {
- // FUTURE -- revert to protected
- public:
- MprLink *next; // Ptr to next member in list
- MprLink *prev; // Ptr to prev member in list
- MprList *head; // Ptr to the list head
-
- public:
- MprLink() { ///< Constructor
- next = prev = this;
- head = 0;
- };
- ~MprLink() {}; ///< Destructor
- MprList *getList() { return head; };///< Return the owning list
-
- inline void insertAfter(MprLink *item); ///< Insert after this member
- inline void insertPrior(MprLink *item); ///< Insert prior to this member
-};
-
-/////////////////////////////////// MprList ////////////////////////////////////
-//
-// The MprList class defines the list (dummy) header for doubly linked objects.
-// It provides forward and back links for fast insertion, removal and
-// iteration. To use MprLink, subclasses must inherit MprLink as a base class.
-// Use MprList for the dummy list header and MprLink for the list members.
-// This class is NOT thread-safe. Callers must do their own thread
-// synchronization. It is designed to be "inline", very fast and no-frills.
-//
-
-class MprList : public MprLink {
- protected:
- int numItems; // Number of items in the list
-
- public:
- MprList() {
- numItems = 0;
- head = this;
- next = prev = this;
- };
- ~MprList() {
- };
- inline void insert(MprLink *item) { /// Add to the end of the list
- inlineAssert(item->head == 0);
- if (item->head == 0) {
- numItems++;
- }
- item->head = this;
- item->next = head;
- item->prev = head->prev;
- prev->next = item;
- prev = item;
- };
- inline MprLink *remove(MprLink *item) { /// Remove this item
- inlineAssert(item->head == this);
- item->next->prev = item->prev;
- item->prev->next = item->next;
- item->prev = 0;
- item->next = 0;
- inlineAssert(numItems > 0);
- if (item->head == head) {
- numItems--;
- }
- item->head = 0;
- return next;
- };
- inline MprLink *getFirst() { /// Get first item
- return (next == head) ? 0 : next;
- };
- inline MprLink *getLast() { /// Get last item
- return (next == head) ? 0 : prev;
- };
- inline MprLink *getNext(MprLink *item) { /// Get next item
- inlineAssert(item->head == this);
- return (item->next == head) ? 0 : item->next;
- };
- inline MprLink *getPrev(MprLink *item) { /// Get previous item
- inlineAssert(item->head == this);
- return (item->prev == head) ? 0 : item->prev;
- };
- int getNumItems() { /// Get number of items.
- return numItems;
- };
- bool emptyOk() {
- if ((head == this) && (next == head) &&
- (prev == head) && (numItems == 0)) {
- return 1;
- } else {
- return 0;
- }
- };
-
- friend class MprLink;
-};
-
-//
-// Inline methods for MprLink
-//
-inline void MprLink::insertAfter(MprLink *item) {
- inlineAssert(item->head == 0);
- item->head = head;
- next->prev = item;
- item->prev = this;
- item->next = next;
- next = item;
- head->numItems++;
- };
-inline void MprLink::insertPrior(MprLink *item) {
- inlineAssert(item->head == 0);
- item->head = head;
- prev->next = item;
- item->next = this;
- item->prev = prev;
- prev = item;
- head->numItems++;
- };
-
-//////////////////////////////// MprStringList /////////////////////////////////
-
-class MprStringData : public MprLink {
- public:
- MprStr string;
-
- public:
- MprStringData(char *s);
- ~MprStringData();
- inline char *getValue() { return string; };
-};
-
-class MprStringList : public MprList {
- public:
- MprStringList(char *str);
- MprStringList();
- ~MprStringList();
- void insert(char *str);
- void parse(char *str);
-};
-
-////////////////////////////////// MprCmdLine //////////////////////////////////
-
-class MprCmdLine {
- private:
- int argc;
- char **argv; // Not duped
- void *argvBuf; // Storage for argv and args
- bool inSwitch;
- int optc;
- int optind;
- char *switches; // Not duped
-
- public:
- MprCmdLine(int argc, char **argv, char *switches);
- MprCmdLine(char *args, char *switches);
- ~MprCmdLine();
- char **getArgv() { return argv; };
- int getArgc() { return argc; };
- int next(char **argp = 0);
- int firstArg();
-};
-
-/////////////////////////////////// MprCond ////////////////////////////////////
-#if BLD_FEATURE_MULTITHREAD
-
-//
-// Condition variable for multi-thread synchronization
-//
-// Condition variables can be used to coordinate threads when running in a
-// multi-threaded mode. These condition variables are level triggered in that
-// a condition can be signalled prior to another thread waiting. That thread
-// will then not block if it calls waitForCond().
-//
-
-class MprCond {
- private:
- #if BLD_DEBUG
- //
- // This must be the first item in the class
- //
- MprLink link; // Cond-var leak monitoring
- #endif
- #if LINUX || MACOSX || SOLARIS
- pthread_cond_t
- cv; // Pthreads condition variable
- #endif
- #if WIN
- HANDLE cv; // Windows event handle
- int numWaiting; // Number waiting to be signalled
- #endif
- #if VXWORKS
- SEM_ID cv; // Condition variable
- #endif
- MprMutex *mutex; // Thread sync
- int triggered; // Value of the condition
-
-#if UNUSED
- int wakeAll; // Wake all waiters on signalCond()
-#endif
-
- public:
- MprCond();
- ~MprCond();
- int waitForCond(long timeout = -1);
- void signalCond();
-
-#if UNUSED
- int multiWait(MprMutex *externalMutex, long timeout = -1);
- void reset();
- void signalAll();
-#endif
-};
-
-#endif // BLD_FEATURE_MULTITHREAD
-/////////////////////////////////// MprDebug ///////////////////////////////////
-#if BLD_DEBUG
-
-class MprDebug {
- public:
-#if BLD_FEATURE_MULTITHREAD
- int getMutexNum();
-#endif
-};
-
-#endif
-/////////////////////////////////// MprFile ////////////////////////////////////
-
-class MprFile {
- private:
- MprBuf *inBuf;
- int fd;
- public:
- MprFile();
- virtual ~MprFile();
- virtual int open(char* path, int flags, int mode);
- virtual void close();
- virtual char *gets(char *buf, int len);
- virtual int read(void* buf, int len);
- virtual int write(void* buf, int len);
- virtual long lseek(long offset, int origin);
-};
-
-//////////////////////////////// MprFileSystem /////////////////////////////////
-
-class MprFileSystem {
- private:
- public:
- MprFileSystem();
- virtual ~MprFileSystem();
- virtual MprFile *newFile();
- virtual int stat(char* path, MprFileInfo* info);
- virtual bool isDir(char* path);
- virtual void setRoot(char* path);
-};
-
-/////////////////////////////////// MprMutex ///////////////////////////////////
-#if BLD_FEATURE_MULTITHREAD
-
-//
-// Mutual exclusion locks
-//
-class MprMutex {
- public:
- #if BLD_DEBUG
- MprLink link; // Must be the first in the class
- #endif
- #if WIN
- CRITICAL_SECTION cs; // O/S critical section
- #endif
- #if LINUX || MACOSX || SOLARIS
- pthread_mutex_t cs; // O/S critical section
- #endif
- #if VXWORKS
- SEM_ID cs; // Semaphore
- #endif
-
- public:
- MprMutex();
- ~MprMutex();
- int tryLock();
-
- // FUTURE -- should do Windows inline also.
-
- #if LINUX || MACOSX || SOLARIS
- inline void lock() { pthread_mutex_lock(&cs); };
- inline void unlock() { pthread_mutex_unlock(&cs); };
- #elif VXWORKS && 0
- inline void lock() { semTake(cs, WAIT_FOREVER); };
- inline void unlock() { semGive(cs); };
- #else
- void lock();
- void unlock();
- #endif
-
- friend class MprCond;
-};
-
-#endif // BLD_FEATURE_MULTITHREAD
-////////////////////////////////////// Mpr /////////////////////////////////////
-//
-// Mpr flags
-//
-#define MPR_EXITING 0x1 // Mpr is exiting
-#define MPR_ASYNC_SELECTING 0x2 // Using async select
-#define MPR_HEADLESS 0x4 // No user interface
-#define MPR_SERVICE_THREAD 0x10 // Using a service thread for events
-#define MPR_IS_DAEMON 0x20 // Is a daemon / service
-#define MPR_STOPPED 0x40 // Mpr services stopped
-#define MPR_STARTED 0x80 // Mpr services started
-#define MPR_KILLABLE 0x100 // MPR can be killed (need a pid file)
-#define MPR_USER_START_FLAGS (MPR_SERVICE_THREAD | MPR_KILLABLE)
-
-typedef int (*MprDllEntryProc)(void *arg);
-
-//
-// The Mbedthis Portable Runtime (MPR) internal state class.
-//
-class Mpr {
- private:
- MprStr appName; // One word name of the application
- MprStr appTitle; // Displayable name of the product
- int buildNumber; // Build number
- MprStr buildType; // Build type
- MprHashTable *configSettings; // Configuration settings for app
- MprStr cpu; // Procesor
- MprStr domainName; // Domain portion
- MprStr hostName; // Host name (fully qualified name)
- MprStr installDir; // Installation directory (!= cwd)
- MprStr os; // Operating system
- MprStr serverName; // Server name portion (no domain)
- MprStr version; // Application version number (x.y.z)
-
- //
- // FUTURE -- Convert to flags
- //
- int flags; // Processing state
- int headless; // Run headless
- bool runAsService; // Running as a service (daemon)
- bool eventsThread; // Running an events thread
-
-#if WIN
- long appInstance; // Application instance (windows)
- HWND hwnd; // Window handle
-#endif
-
-#if BLD_FEATURE_LOG
- MprLogModule *defaultLog; // Default log module
-#endif
-
-#if BLD_FEATURE_MULTITHREAD
- MprMutex *mutex; // Thread synchronization
- MprMutex *timeMutex; // Thread sync for mprGetTime
- MprMutex *eventsMutex; // Thread sync for serviceEvents
-#endif
-
- public:
-#if BLD_FEATURE_LOG
- MprLogService *logService; // Log service object
-#endif
- MprPoolService *poolService; // Pool service object
- MprSelectService *selectService; // Select service object
- MprSocketService *socketService; // MprSocket service object
- MprTimerService *timerService; // Timer service object
- MprList modules; // List of modules
-
-#if BLD_FEATURE_CGI_MODULE
- MprCmdService *cmdService; // Run command service object
-#endif
-#if BLD_FEATURE_MULTITHREAD
- MprThreadService *threadService; // Thread service object
-#endif
-
- public:
- //
- // Published API
- //
- Mpr(char *appName);
- ~Mpr();
-#if BLD_FEATURE_LOG
- void addListener(MprLogListener *lp);
-#endif
- bool getAsyncSelectMode();
- int getIdleTime();
- bool isExiting(void);
- int runTasks();
- int runTimers();
- void serviceEvents(bool loopOnce, int maxTimeout);
- void setAsyncSelectMode(bool on);
- int setLogSpec(char *spec);
- int start(int startFlags = 0);
- int stop(bool immediateStop);
- void terminate(bool graceful = 1);
-#if WIN
- void setHwnd(HWND appHwnd);
- void setSocketHwnd(HWND socketHwnd);
- void setSocketMessage(int msgId);
-#endif
-
- //
- // Unpublished API
- //
-
- int configure(char *configFile);
- char *getAppName(void);
- char *getAppTitle(void);
- int getBuildNumber(void);
- char *getBuildType(void);
- char *getCpu(void);
- char *getDomainName(void);
- int getFds(fd_set *readInterest, fd_set *writeInterest,
- fd_set *exceptInterest, int *maxFd, int *lastGet);
- int getHeadless(void);
- char *getHostName(void);
- char *getInstallDir(void);
- char *getOs(void);
- char *getServerName(void);
- char *getVersion(void);
- bool isRunningEventsThread() { return eventsThread; };
- bool isService();
- int killMpr();
- int makeDaemon(int parentExit);
- void serviceIO(int readyFds, fd_set *readFds, fd_set *writeFds,
- fd_set *exceptFds);
- void serviceIO(int sockFd, int winMask);
- void setAppName(char *name);
- void setAppTitle(char *name);
- void setBuildNumber(int buildNumber);
- void setBuildType(char *type);
- void setCpu(char *cpu);
- void setDomainName(char *host);
- void setHeadless(int headless);
- void setHostName(char *host);
- void setInstallDir(char *dir);
- void setOs(char *os);
- void setPriority(int pri);
- void setServerName(char *host);
- void setService(bool service);
- void setVersion(char *version);
- void setWebServerAddress(char *path);
- void writeToOsLog(char *msg, int etype);
-
-#if BLD_FEATURE_MULTITHREAD
- void startEventsThread();
- void setMinPoolThreads(int n);
- void setMaxPoolThreads(int n);
- int getMinPoolThreads();
- int getMaxPoolThreads();
- int getNextThreadNum();
- MprThread *getCurrentThread();
- inline void lock() {
- if (mutex) {
- mutex->lock();
- }
- };
- inline void unlock() {
- if (mutex) {
- mutex->unlock();
- }
- };
- void timeLock() { timeMutex->lock(); };
- void timeUnlock() { timeMutex->unlock(); };
-#else
- int getMaxPoolThreads() { return 0; };
- inline void lock() {};
- inline void unlock() {};
- inline void timeLock() {};
- inline void timeUnlock() {};
-#endif
-
-#if WIN
- HWND getHwnd();
- long getInst();
- void setInst(long inst);
-#endif
-
-#if BLD_FEATURE_DLL
- int loadDll(char *path, char *fnName, void *arg, void **handle);
- void unloadDll(void *handle);
-#endif
-
-#if BLD_FEATURE_XML_CONFIG
- int openConfigFile(char *path);
- int openXmlFile(char *path);
- int readXmlInt(MprHashTable *symTab, char *key, int *value);
- int readXmlStr(MprHashTable *symTab, char *key, char **value);
-#endif
- char *getConfigStr(char *key, char *defaultValue);
- int getConfigInt(char *key, int defaultValue);
-
-#if BLD_FEATURE_CGI_MODULE
- MprCmdService *getCmdService() { return cmdService; };
-#endif
-
- private:
- int platformInitialize();
- int platformTerminate();
- int platformStart(int startFlags);
- int platformStop();
-};
-
-#if MPR_IN_MPR
-extern Mpr *mpr; // Default global Mpr class
-#endif
-
-extern Mpr *mprGetMpr();
-
-//////////////////////////////// MprHashEntry //////////////////////////////////
-//
-// Master hash entry type. Not thread safe.
-//
-
-class MprHashEntry : public MprLink {
- private:
- MprStr key;
- MprList *bucket;
-
- public:
- MprHashEntry();
- MprHashEntry(char *key);
- virtual ~MprHashEntry();
- char *getKey();
- void setKey(char *key);
- friend class MprHashTable;
-};
-
-//
-// String entry type
-//
-class MprStringHashEntry : public MprHashEntry {
- private:
- MprStr value;
- public:
- MprStringHashEntry(char *key, char *str);
- virtual ~MprStringHashEntry();
- char *getValue() { return value; };
-};
-
-//
-// Static string (not duplicated)
-//
-class MprStaticHashEntry : public MprHashEntry {
- private:
- char *value;
- public:
- MprStaticHashEntry(char *key, char *str);
- virtual ~MprStaticHashEntry();
- char *getValue() { return value; };
-};
-
-#if PERHAPS
-//
-// Object string (not duplicated)
-//
-class MprObjectHashEntry : public MprHashEntry {
- private:
- char *value;
- public:
- MprObjectHashEntry(char *key, char *str);
- virtual ~MprObjectHashEntry();
- char *getValue() { return value; };
-};
-#endif
-
-///////////////////////////////// MprHashTable /////////////////////////////////
-
-class MprHashTable {
- private:
- MprList *buckets;
- int size;
- int count;
-
- public:
- MprHashTable(int hash_size = MPR_DEFAULT_HASH_SIZE);
- ~MprHashTable();
- MprHashEntry *getFirst();
- MprHashEntry *getNext(MprHashEntry *ep);
- int getNumItems() { return count; };
- int insert(MprHashEntry *entry);
- MprHashEntry *lookup(char *key);
- int remove(char *key);
- int remove(MprHashEntry *entry);
- int removeAll();
-
- private:
- MprHashEntry *lookupInner(char *key, MprList **bucket);
- int hashIndex(char *key);
- int getNextPrime(int size);
-};
-
-//////////////////////////////// MprLogService /////////////////////////////////
-#if BLD_FEATURE_LOG
-
-class MprLogListener : public MprLink {
- private:
- int maxSize; // Max size of log
- public:
- //
- // Published API
- //
- MprLogListener(); ///< Constructor
- virtual ~MprLogListener(); ///< Destructor
- virtual void logEvent(char *module, int flags, int level, char *thread,
- char *msg);
- virtual int start();
-
- //
- // Unpublished API
- //
- virtual void shuttingDown();
- virtual int setLogSpec(char *path, int maxSize);
- virtual void stop();
-};
-
-
-class MprLogToFile : public MprLogListener {
- private:
- int logFd; // MprLogService file handle
- MprStr logFileName; // Current name of log file
- bool timeStamps; // Output high res time stamps
- uint maxSize; // Maximum extent of trace file
- int rotationCount; // Number of times logs rotated
- MprTimer *timer; // Log file time stamp timer
- public:
- MprLogToFile(); ///< Constructor
- ~MprLogToFile(); ///< Destructor
- void logEvent(char *module, int flags, int level, char *thread,
- char *msg);
- void enableTimeStamps(bool on);
- void logConfig();
- void rotate();
- void shuttingDown();
- int setLogSpec(char *path, int maxSize);
- int start();
- void stop();
- void writeTimeStamp();
-};
-
-
-class MprLogToWindow : public MprLogListener {
- private:
- public:
- MprLogToWindow(); ///< Constructor
- ~MprLogToWindow(); ///< Destructor
- void logEvent(char *module, int flags, int level, char *thread,
- char *msg);
-};
-
-
-//
-// Overall logging service
-//
-class MprLogService {
- private:
- MprList listeners; // Users registered for output
- uint defaultLevel; // Default level for modules
- MprLogModule *defaultModule; // Default log module for this log
- MprList moduleList; // List of modules to trace
- char *moduleSpecs; // Module level spec string
- char *logSpec; // Saved logging spec string
- bool logging; // Logging is enabled
-#if BLD_FEATURE_MULTITHREAD
- MprMutex *mutex; // Mutex lock
-#endif
-
- public:
- MprLogService();
- ~MprLogService(void);
- void addListener(MprLogListener *lp);
- void insertModule(MprLogModule *module);
- void error(char *file, int line, int flags, char *fmt,
- va_list args);
- MprLogModule *getDefaultModule() { return defaultModule; };
- int getDefaultLevel() { return defaultLevel; };
- char *getLogSpec() { return logSpec; };
- char *getModuleSpecs();
- bool isLogging();
- void removeListener(MprLogListener *lp);
- void removeModule(MprLogModule *module);
- void setDefaultLevel(int l);
- void setDefaultModule(MprLogModule *m) { defaultModule = m; };
- int setLogSpec(char *fileSpec);
- void shuttingDown();
- void start();
- void stop();
- void traceCore(int level, int flags, MprLogModule *module,
- char *fmt, va_list ap);
- void writeHeader();
- void writeLogStamp();
-
-#if BLD_FEATURE_MULTITHREAD
- void lock() {
- if (mutex) {
- mutex->lock();
- }
- };
- void unlock() {
- if (mutex) {
- mutex->unlock();
- }
- };
-#else
- inline void lock() {};
- inline void unlock() {};
-#endif
-
- private:
- void output(MprLogModule *module, int flags, int level,
- char *msg);
- void breakpoint(char *file, int line);
-};
-
-extern void mprLog(int level, MprLogModule *module, char *fmt, ...);
-extern void mprLog(int level, int flags, MprLogModule *module,
- char *fmt, ...);
-extern void mprLog(char *fmt, ...);
-
-#else // !BLD_FEATURE_LOG
-//
-// If logging is not enabled, we inline these functions to nothing
-//
-class MprLogModule {
- void *x;
- public:
- MprLogModule(char *name) {}
-};
-inline void mprLog(int level, MprLogModule *module, char *fmt, ...) {};
-inline void mprLog(char *fmt, ...) {}
-extern "C" void mprLog(int level, char *fmt, ...);
-#endif
-
-///////////////////////////////// MprLogModule /////////////////////////////////
-#if BLD_FEATURE_LOG
-//
-// Class to describe a trace log module
-//
-
-class MprLogModule : public MprLink {
- private:
- MprStr name;
- int level; // Current trace output level
- bool enabled;
-
- public:
- MprLogModule(char *name);
- ~MprLogModule();
- void innerMprLogModule(char *name);
- int getLevel(void) { return level; };
- void disable() { enabled = 0; };
- void enable() { enabled = 1; };
- int getEnabled() { return enabled; };
- char *getName() { return name; };
- void setLevel(int l) { level = l; };
-};
-
-#endif // BLD_FEATURE_LOG
-//////////////////////////////////// MprBuf ////////////////////////////////////
-
-typedef int (*MprBufProc)(MprBuf* bp, void *arg);
-
-class MprBuf {
- private:
- uchar *buf; // Actual buffer for data
- uchar *endbuf; // Pointer one past the end of buffer
- uchar *start; // Pointer to next data char
- uchar *end; // Pointer one past the last data char
- int buflen; // Current size of buffer
- int maxsize; // Max size the buffer can ever grow
- int growBy; // Next growth increment to use
- MprBufProc refillProc; // Function to refill the buffer
- void *refillArg; // Arg to refill proc
-
- public:
- MprBuf();
- MprBuf(int initialSize, int maxsize = -1);
- ~MprBuf();
- inline void addNull() {
- *((char*) end) = (char) '\0';
- };
- void adjustStart(int size);
- void adjustEnd(int size);
- void copyDown();
- inline void flush() {
- start = buf;
- end = buf;
- };
- inline int get() {
- if (start == end) {
- return -1;
- }
- int c = (uchar) *start++;
- if (start >= endbuf) {
- start = buf;
- }
- return c;
- };
- int get(uchar *buf, int len);
- inline char *getBuf() { return (char*) buf; };
- inline char *getEnd() { return (char*) end; };
- inline char *getEndBuf() { return (char*) endbuf; };
- inline int getLength() {
- return ((start > end) ?
- (buflen + (end - start)) : (end - start));
- };
- inline int getLinearData() {
- return min((endbuf - start), getLength());
- }
- inline int getLinearSpace() {
- int len = getLength();
- int space = buflen - len - 1;
- return min((endbuf - end), space);
- }
- inline int getSpace() {
- return buflen - getLength() - 1;
- };
- inline char *getStart() { return (char*) start; };
- inline int getSize() { return buflen; };
- int insert(char c);
- inline int look() {
- if (start == end) {
- return -1;
- }
- return* start;
- }
- int lookLast();
- int put(char c);
- int put(char *str);
- int putInt(int i);
- int putFmt(char *fmt, ...);
- int put(uchar *buf, int len);
- inline int refill() {
- return (refillProc) ?
- (refillProc)(this, refillArg) : 0;
- };
- inline void resetIfEmpty() {
- if (getLength() == 0) {
- flush();
- }
- };
- void setBuf(uchar *userBuf, int size);
- void setBuf(int initialSize, int maxSize);
- void setRefillProc(MprBufProc fn, void *arg) {
- refillProc = fn;
- refillArg = arg;
- };
- uchar *takeBuffer();
- private:
- int grow();
-};
-
-//////////////////////////////// MprCmdService /////////////////////////////////
-#if BLD_FEATURE_CGI_MODULE
-//
-// Flags for MprCmd
-//
-#define MPR_CMD_BACKGROUND 0x1 // Continue running if MPR exits
-#define MPR_CMD_REAP_MAX 24
-
-//
-// Cmd service control
-//
-
-class MprCmdService {
- private:
- MprList cmdList; // List of commands
- MprMutex *mutex; // Multi-thread sync
- ulong completedCmds[MPR_CMD_REAP_MAX];
- int exitStatus[MPR_CMD_REAP_MAX];
- MprTimer *timer; // Timer to poll for child completion
-
- public:
- MprCmdService();
- ~MprCmdService();
- void cmdWatcher();
- void cmdWatcherTimer(MprTimer *tp);
- void insertCmd(MprCmd* rp);
- void removeCmd(MprCmd* rp);
- int start();
- void startWatcher();
- int stop();
-
-#if LINUX || SOLARIS || VXWORKS
- void processStatus(int pid, int status);
- void initSignals();
-#endif
-
-#if BLD_FEATURE_MULTITHREAD
- void lock() { mutex->lock(); };
- void unlock() { mutex->unlock(); };
-#else
- inline void lock() {};
- inline void unlock() {};
-#endif
-};
-
-//////////////////////////////////// MprCmd ////////////////////////////////////
-
-//
-// Cmd procs must return the number of bytes read or -1 for errors.
-//
-typedef void (*MprCmdProc)(MprCmd* rp, void *data);
-
-#define MPR_CMD_EOF -1 // EOF return value
-
-//
-// Flags
-//
-#define MPR_CMD_DETACHED 0x1
-#define MPR_CMD_NEW_SESSION 0x2
-#define MPR_CMD_CHDIR 0x4
-#define MPR_CMD_WAIT 0x8
-#define MPR_CMD_SHOW 0x10
-#define MPR_CMD_USER_FLAGS 0x1f
-
-#define MPR_CMD_COMPLETE 0x40
-#define MPR_CMD_DISPOSED 0x80
-#define MPR_CMD_STDIO_MADE 0x100
-
-//
-// Indicies for clientFd and serverFd
-//
-#define MPR_CMD_IN 0 // Stdin for the server
-#define MPR_CMD_OUT 1 // Stdout for the server
-#define MPR_CMD_MAX_FD 2
-
-#define MPR_CMD_WATCHER_NAP 100 // Timeout for watcher while polling
-#define MPR_CMD_WATCHER_TIMEOUT 5000 // Timeout for child to start
-
-class MprCmdFiles {
- public:
- MprStr name[MPR_CMD_MAX_FD];
- int fd[MPR_CMD_MAX_FD];
- int clientFd[MPR_CMD_MAX_FD];
- public:
- MprCmdFiles();
- ~MprCmdFiles();
-};
-
-//
-// MprCmd class
-//
-class MprCmd : public MprLink {
- private:
- MprStr cwd; // Current working dir for the process
- void *data; // Callback user data
- int exitStatus; // Command exit status
- int flags; // Control flags (userFlags not here)
- MprCmdFiles files; // Stdin, stdout for the command
- int inUse; // Used by dispose()
- MprLogModule *log;
- MprCmdProc cmdDoneProc; // Handler for client completion
-
-#if VXWORKS
- MprSelectHandler
- *handler;
- int waitFd; // Pipe to await child exit
-#endif
- ulong process; // Id/handle of the created process
-
-#if BLD_FEATURE_MULTITHREAD
-#if VXWORKS
- MprCond *startCond;
- MprCond *exitCond;
-#endif
- MprMutex *mutex;
-#endif
-
- public:
- MprCmd();
- ~MprCmd();
- void closeWriteFd();
- int dispose();
- int getExitCode(int *code = 0);
- int getWriteFd();
- int getReadFd();
- void invokeCallback(MprMutex *callerMutex);
- bool isRunning();
- int makeStdio();
- void setCwd(char *dir);
- int setInuse();
- int start(char *cmd, int flags);
- int start(char *cmd, char **argv, char **envp,
- MprCmdProc completionProc, void *data, int flags);
- void stop();
-
- //
- // Internal API
- //
- ulong getProcess() { return process; };
- void reset();
- void resetFiles();
- void setExitStatus(int status);
-
- private:
- int waitForChild(int timeout);
-
-#if BLD_FEATURE_MULTITHREAD
- void lock() { mutex->lock(); };
- void unlock() { mutex->unlock(); };
-#else
- inline void lock() {};
- inline void unlock() {};
-#endif
-
- friend class MprCmdService;
-};
-
-#endif // BLD_FEATURE_CGI_MODULE
-////////////////////////////// MprSelectService ////////////////////////////////
-//
-// Standard select bit mask options
-//
-#define MPR_READABLE 0x2
-#define MPR_WRITEABLE 0x4
-#define MPR_EXCEPTION 0x8
-
-typedef void (*MprSelectProc)(void *data, int mask, int isMprPoolThread);
-
-class MprSelectService {
- private:
- struct sockaddr_in
- breakAddress; // Breakout port socket address
- int breakSock; // MprSocket to wakeup select service
- int breakPort; // Port to talk to the select service
- int breakRetries; // Retry attempts to open breakout port
- MprList list; // List of select handlers
- int flags; // State flags
- int maskGeneration; // Generation number for mask changes
- int listGeneration; // Generation number for list changes
- MprLogModule *log;
- int rebuildMasks; // Complete select mask rebuild required
- int delayedFds[FD_SETSIZE];
- int maxDelayedFd;
-#if WIN
- int sockMessage; // MprSocket message for AsyncSelect
- HWND hwnd; // Window handle to use for AsyncSelect
-#endif
-
-#if BLD_FEATURE_MULTITHREAD
- MprCond *cond; // Wait for select to breakout
- MprMutex *mutex; // General multi-thread synchronization
-#endif
-
- public:
- //
- // Published API
- //
- MprSelectService();
- ~MprSelectService();
- int getFds(fd_set *readInterest, fd_set *writeInterest,
- fd_set *exceptInterest, int *maxFd, int *lastGet);
- void serviceIO(int readyFds, fd_set *readFds, fd_set *writeFds,
- fd_set *exceptFds);
- void serviceIO(int sockFd, int winMask);
-
- //
- // Unpublished API
- //
- int insertHandler(MprSelectHandler *sp);
- void awaken(int wait = 0);
- void delayedClose(int fd);
- bool getAsyncSelectMode();
- int getFlags() { return flags; };
- int modifyHandler(MprSelectHandler *sp, bool wakeUp);
- void removeHandler(MprSelectHandler *sp);
- MprLogModule *getLog() { return log; };
- int openBreakoutPort();
- void setPort(int n);
- int start();
- int stop();
-
-#if BLD_FEATURE_MULTITHREAD
- void lock() { mutex->lock(); };
- void unlock() { mutex->unlock(); };
-#else
- inline void lock() {};
- inline void unlock() {};
-#endif
-
-#if WIN
- HWND getHwnd() { return hwnd; };
- int getMessage() { return sockMessage; };
- void setHwnd(HWND h) { hwnd = (HWND) h; };
- void setMessage(int m) { sockMessage = m; };
- void setAsyncSelectMode(bool asyncSelect);
-#endif
-};
-
-////////////////////////////// MprSelectHandler ////////////////////////////////
-//
-// Flags
-//
-#define MPR_SELECT_DISPOSED 0x1
-#define MPR_SELECT_RUNNING 0x2
-#define MPR_SELECT_CLOSEFD 0x4
-#define MPR_SELECT_CLIENT_CLOSED 0x8 // Client disconnection received
-
-class MprSelectHandler : public MprLink {
- private:
- int desiredMask; // Mask of desired events
- int disableMask; // Mask of disabled events
- int fd; // O/S File descriptor (sp->sock)
- int flags; // Control flags
- void *handlerData; // Argument to pass to proc.
- int inUse; // Used by dispose()
- MprLogModule *log;
- int presentMask; // Mask of events that have been seen
- int priority; // Priority if events handled by threads
-
-#if BLD_FEATURE_MULTITHREAD
- MprCond *stoppingCond; // Synchronization when stopping
-#endif
-
- public:
- MprSelectService *selectService; // Select service pointer
- MprSelectProc proc; // Select handler procedure
-
- public:
- MprSelectHandler(int fd, int mask, MprSelectProc proc,
- void *data, int priority);
- bool dispose();
- void disableEvents(bool wakeUp);
- void enableEvents(bool wakeUp);
- int getFd() { return fd; };
- int getFlags() { return flags; };
- void runHandler();
- void selectProc(MprTask *tp);
- void setInterest(int mask);
- void setWinInterest();
- void setProc(MprSelectProc newProc, int mask);
- void setCloseOnDispose();
- int stop(int timeout);
-
- private:
- ~MprSelectHandler();
-
- friend class MprSelectService;
-};
-
-//////////////////////////////// MprInterface //////////////////////////////////
-
-class MprInterface : public MprLink {
- public:
- MprStr name; // Interface name
- MprStr ipAddr;
- MprStr broadcast;
- MprStr mask;
- public:
- MprInterface(char *name, char *ipAddr, char *bcast,
- char *mask);
- ~MprInterface();
-};
-
-////////////////////////////// MprSocketService ////////////////////////////////
-
-typedef void (*MprSocketIoProc)(void *data, MprSocket *sp, int mask,
- int isMprPoolThread);
-typedef void (*MprSocketAcceptProc)(void *data, MprSocket *sp, char *ip,
- int port, MprSocket *lp, int isMprPoolThread);
-//
-// Mpr socket service class
-//
-class MprSocketService {
- private:
- MprList socketList; // List of all sockets
- MprList ipList; // List of ip addresses
- MprLogModule *log;
-
-#if BLD_FEATURE_MULTITHREAD
- MprMutex *mutex;
-#endif
-
- public:
- MprSocketService();
- ~MprSocketService();
-#if BLD_FEATURE_LOG
- MprLogModule *getLogModule() { return log; };
-#endif
- MprList *getInterfaceList();
- void insertMprSocket(MprSocket *sp);
- void removeMprSocket(MprSocket *sp);
- int start();
- int stop();
-
-#if BLD_FEATURE_MULTITHREAD
- void lock() { mutex->lock(); };
- void unlock() { mutex->unlock(); };
-#else
- inline void lock() {};
- inline void unlock() {};
-#endif
-
- private:
- int getInterfaces();
-};
-
-////////////////////////////////// MprSocket ///////////////////////////////////
-//
-// close flags
-//
-#define MPR_SHUTDOWN_READ 0
-#define MPR_SHUTDOWN_WRITE 1
-#define MPR_SHUTDOWN_BOTH 2
-
-//
-// Flags
-//
-#define MPR_SOCKET_BLOCK 0x1 // Use blocking I/O
-#define MPR_SOCKET_BROADCAST 0x2 // Broadcast mode
-#define MPR_SOCKET_CLOSED 0x4 // MprSocket has been closed
-#define MPR_SOCKET_CONNECTING 0x8 // MprSocket has been closed
-#define MPR_SOCKET_DATAGRAM 0x10 // Use datagrams
-#define MPR_SOCKET_EOF 0x20 // Seen end of file
-#define MPR_SOCKET_LISTENER 0x40 // MprSocket is server listener
-#define MPR_SOCKET_NOREUSE 0x80 // Dont set SO_REUSEADDR option
-#define MPR_SOCKET_NODELAY 0x100 // Disable Nagle algorithm
-#define MPR_SOCKET_DISPOSED 0x200 // Delete requested
-
-#define MPR_SOCKET_READABLE 0x2
-#define MPR_SOCKET_WRITABLE 0x4
-#define MPR_SOCKET_EXCEPTION 0x8
-
-class MprSocket : public MprLink
-{
- private:
- MprSocketAcceptProc
- acceptCallback; // Accept callback
- void *acceptData; // User accept callback data
- int currentEvents; // Mask of ready events (FD_x)
- int error; // Last error
- MprSelectHandler *handler; // Select handler
- int handlerMask; // Handler events of interest
- int handlerPriority; // Handler priority
- int interestEvents; // Mask of events to watch for
- MprSocketIoProc ioCallback; // User I/O callback
- void *ioData; // User io callback data
- void *ioData2; // Secondary user io callback data
- int inUse; // In use counter. Used by dispose()
- MprStr ipAddr; // Host IP address
- MprLogModule *log; // Pointer to MprSocketService module
- int port; // Port to listen on
- int selectEvents; // Events being selected
-
-#if BLD_FEATURE_MULTITHREAD
- MprMutex *mutex; // Multi-thread sync
-#endif
-
- protected:
- int sock; // Actual socket handle
- int flags; // Current state flags
- bool secure; // MprSocket is using SSL
-
- public:
- MprSocket();
- void forcedClose();
- void acceptProc(int isMprPoolThread);
- bool getEof();
- int getError();
- int getFlags();
- char *getIpAddr() { return ipAddr; };
- int getPort();
- int getFd();
- bool getBlockingMode();
- void getAcceptCallback(MprSocketAcceptProc *fn, void **data);
- void getCallback(MprSocketIoProc *fn, void **data,
- void **data2, int *mask);
- bool isSecure() { return secure; };
- int openServer(char *ipAddr, int portNum,
- MprSocketAcceptProc acceptFn, void *data, int flags);
- int openClient(char *hostName, int portNum, int flags);
- void setBlockingMode(bool on);
- int setBufSize(int sendSize, int recvSize);
- // FUTURE -- rename: handler vs callback
- void setCallback(MprSocketIoProc fn, void *data,
- void *data2, int mask, int pri = MPR_NORMAL_PRIORITY);
- int write(char *s);
-
- virtual ~MprSocket();
- virtual void close(int how);
- virtual bool dispose();
- virtual void ioProc(int mask, int isMprPoolThread);
- virtual MprSocket
- *newSocket();
- virtual int read(char *buf, int len);
- virtual int write(char *buf, int len);
-
-#if BLD_FEATURE_MULTITHREAD
- void lock() { mutex->lock(); };
- void unlock() { mutex->unlock(); };
-#else
- inline void lock() {};
- inline void unlock() {};
-#endif
-
- private:
- void setMask(int handlerMask);
- void setNoDelay(bool on);
-
- friend class MprSocketService;
-};
-
-//////////////////////////////// MprPoolService ////////////////////////////////
-
-#if BLD_DEBUG
-class MprPoolStats {
- public:
- int maxThreads; // Configured max number of threads
- int minThreads; // Configured minimum
- int numThreads; // Configured minimum
- int maxUse; // Max used
- int pruneHighWater; // Peak thread use in last minute
- int idleThreads; // Current idle
- int busyThreads; // Current busy
-};
-#endif
-
-//
-// A task queue consists of a list of tasks and optional list of threads
-//
-typedef void (*MprTaskProc)(void *data, MprTask *tp);
-
-//
-// Class for the overall thread pool service
-//
-class MprPoolService {
- protected: // Allow MprPoolThreads to access
- MprStr name; // Name of pool
- int nextTaskNum; // Unique next task number
- MprList runningTasks; // List of executing tasks
- int stackSize; // Stack size for worker threads
- MprList tasks; // Prioritized list of pending tasks
-
-#if BLD_FEATURE_MULTITHREAD
- MprList busyThreads; // List of threads to service tasks
- MprList idleThreads; // List of threads to service tasks
- int maxThreads; // Max # threads in pool
- int maxUseThreads; // Max threads ever used
- int minThreads; // Max # threads in pool
- MprMutex *mutex; // Per task synchronization
- int nextThreadNum; // Unique next thread number
- int numThreads; // Current number of threads in pool
- int pruneHighWater; // Peak thread use in last minute
- MprTimer *pruneTimer; // Timer for excess threads pruner
- MprMutex *incMutex; // Per task synchronization
-#endif
-
- public:
- MprLogModule *log;
-
- public:
- MprPoolService(char *name);
- ~MprPoolService();
- int assignNextTask(MprPoolThread *pt);
- void dequeueTask(MprTask *tp);
-#if BLD_DEBUG
- void getStats(MprPoolStats *ps);
-#endif
- void insertTask(MprTask *np, MprTask *tp);
- void prune();
- void queueTask(MprTask *tp);
- void queueRunningTask(MprTask *tp);
- void removeTask(MprTask *tp);
- int runTasks();
- void setStackSize(int n);
- int start();
- int stop(int timeout);
-
-#if BLD_FEATURE_MULTITHREAD
- void dispatchTasks();
- int getMinPoolThreads() { return minThreads; };
- int getNumPoolThreads() {
- return idleThreads.getNumItems() +
- busyThreads.getNumItems();
- };
- int getMaxPoolThreads() { return maxThreads; };
- int getNumIdleThreads() { return idleThreads.getNumItems(); };
- void lock();
- int getNextThreadNum();
- void removeThread(MprPoolThread *pt);
- void setMinPoolThreads(int n);
- void setMaxPoolThreads(int n);
- void unlock();
-#else
- inline void lock() {};
- inline void unlock() {};
- int getMaxPoolThreads() { return 0; };
-#endif
-
- friend class MprPoolThread;
- friend class MprTask;
-};
-
-///////////////////////////////// MprPoolThread ////////////////////////////////
-#if BLD_FEATURE_MULTITHREAD
-//
-// Flags
-//
-#define MPR_POOL_THREAD_SLEEPING 0x1
-
-//
-// Class for each thread in the thread pool
-//
-class MprPoolThread : public MprLink {
- private:
- MprPoolService *pool; // Which thread pool do we swim in
- MprTask *currentTask; // Current task being run
- int flags;
-
-#if BLD_FEATURE_MULTITHREAD
- MprThread *thread; // Associated thread
- MprCond *idleCond; // Used to wait for work
-#endif
-
- public:
- MprPoolThread(MprPoolService *pool, int stackSize);
- ~MprPoolThread();
- MprPoolService *getMprPoolService() { return pool; };
- MprThread *getThread() { return thread; };
- MprTask *getCurrentTask() { return currentTask; };
- void makeIdle();
- void start();
- void setTask(MprTask *tp);
- void threadMain();
- void wakeup();
-};
-
-#endif
-/////////////////////////////////// MprTask ////////////////////////////////////
-//
-// Flags
-//
-#define MPR_TASK_DISPOSED 0x1
-#define MPR_TASK_RUNNING 0x2
-
-//
-// Class for each task (unit of work)
-//
-class MprTask : public MprLink {
- public:
- void *data; // Task data
- int flags; // Control flags
- int inUse; // In use counter. Used by dispose()
- MprPoolService *pool; // Managing pool
- int priority; // Priority of event
- MprTaskProc proc; // Procedure to service this event.
-
-#if BLD_FEATURE_MULTITHREAD
- MprPoolThread *pt; // Pool thread servicing this task
- MprCond *stoppingCond; // Synchronization for timer->dispose()
-#endif
-
- public:
- MprTask(MprTaskProc proc, void *data,
- int priority = MPR_NORMAL_PRIORITY);
- MprTask(MprPoolService *pool, MprTaskProc proc,
- void *data, int priority = MPR_NORMAL_PRIORITY);
- bool dispose();
- void start();
- int stop(int timeout);
-
-#if BLD_FEATURE_MULTITHREAD
- MprPoolThread *getThread() { return pt; };
-#endif
-
- private:
- ~MprTask();
- friend class MprPoolThread;
- friend class MprPoolService;
-};
-
-/////////////////////////////// MprThreadService ///////////////////////////////
-#if BLD_FEATURE_MULTITHREAD
-//
-// Threading primitives
-//
-typedef void (*MprThreadProc)(void *arg, MprThread *tp);
-
-class MprThreadService {
- private:
- MprList threads; // List of all threads
- MprThread *mainThread; // Main application Mpr thread id
- MprMutex *mutex; // Multi-thread sync
-
- public:
- MprThreadService();
- ~MprThreadService();
- MprThread *getCurrentThread();
- void insertThread(MprThread *tp);
- void removeThread(MprThread *tp);
- int start();
- int stop(int timeout);
-
- inline void lock() {
- if (mutex) {
- mutex->lock();
- }
- };
- inline void unlock() {
- if (mutex) {
- mutex->unlock();
- }
- };
-};
-
-/////////////////////////////////// MprThread //////////////////////////////////
-
-class MprThread : public MprLink {
- private:
- #if WIN
- int osThreadId; // O/S thread id
- handle threadHandle; // Threads OS handle
- #endif
- #if LINUX || MACOSX || SOLARIS
- pthread_t osThreadId; // O/S thread id
- #endif
- #if VXWORKS
- int osThreadId; // O/S thread id (same as pid)
- #endif
- void *data; // Data argument
- MprThreadProc entry; // Users thread entry point
- MprStr name; // Name of thead for trace
- MprMutex *mutex; // Multi-thread synchronization
- int pid; // Owning process id
- int priority; // Current priority
- int stackSize; // Only VxWorks implements
-
- public:
- MprThread(int pri, char *name);
- // FUTURE -- move pri to last and default it.
- MprThread(MprThreadProc proc, int pri, void *data,
- char *name, int stackSize = 0);
- ~MprThread();
- int getId() { return (int) osThreadId; };
- char *getName() { return name; };
- int getPriority() { return priority; };
- void lock() { mutex->lock(); };
- void setId(int id);
- void setPriority(int priority);
- void setStackSize(int size);
- int start();
- void threadProc();
- void unlock() { mutex->unlock(); };
-
- private:
- int mapMprPriorityToOs(int mprPriority);
- int mapOsPriorityToMpr(int nativePriority);
-};
-
-extern MprThread *mprGetCurrentThread();
-extern int mprGetMaxPoolThreads();
-
-#endif // BLD_FEATURE_MULTITHREAD
-/////////////////////////////// MprTimerService ////////////////////////////////
-
-#define MPR_TIMER_TOLERANCE 2 // Used in timer calculations
-
-//
-// Timer service. One per MPR
-//
-class MprTimerService {
- private:
- int lastIdleTime; // Last return value from getIdleTime()
- int lastRanTimers; // Last call to runTimers()
- MprLogModule *log; // Log module to identify trace
- MprList timerList; // List of all timers
-
-#if BLD_FEATURE_MULTITHREAD
- MprMutex *mutex; // Multi-thread sync
-#endif
-
- public:
- MprTimerService();
- ~MprTimerService();
- void callTimer(MprTimer *tp);
- int getIdleTime();
- int runTimers();
- int stop();
- int start();
-
-#if BLD_FEATURE_MULTITHREAD
- MprMutex *getMutex() { return mutex; };
- inline void lock() { mutex->lock(); };
- inline void unlock() { mutex->unlock(); };
-#else
- inline void lock() {};
- inline void unlock() {};
-#endif
-
- protected:
- void updateSelect(MprTimer *tp);
-
- friend class MprTimer;
-};
-
-//////////////////////////////////// MprTimer //////////////////////////////////
-//
-// MprTimer callback function prototype
-//
-typedef void (*MprTimerProc)(void *data, MprTimer *tp);
-
-//
-// MprTimer flags
-//
-#define MPR_TIMER_DISPOSED 0x1
-#define MPR_TIMER_RUNNING 0x2
-#define MPR_TIMER_TASK 0x4
-#define MPR_TIMER_AUTO_RESCHED 0x8
-
-class MprTimer : public MprLink {
- private:
- void *data; // Argument to pass to callback
- int flags;
- int inUse; // In use counter. Used by dispose()
- int period; // Reschedule period
- MprTimerProc proc; // Callback procedure
- MprTime time; // When timer is due to next run
- MprTimerService *timerService;
-
-#if BLD_FEATURE_MULTITHREAD
- MprCond *stoppingCond; // Synchronization when stopping
-#endif
-
- public:
- MprTimer(int msec, MprTimerProc routine, void *arg,
- int userFlags = 0);
- bool dispose();
- int getPeriod() { return period; };
- MprTimerService *getMprTimerService() { return timerService; };
- void reschedule();
- void reschedule(int msec);
- int stop(int timeout);
-
-private:
- ~MprTimer();
- friend class MprTimerService;
-};
-
-//////////////////////////////// MprWinService /////////////////////////////////
-#if BLD_FEATURE_RUN_AS_SERVICE && WIN
-
-class MprWinService {
- private:
- MprStr svcName;
- public:
- MprWinService(char *name);
- ~MprWinService();
- int install(char *displayName, char *cmd);
- int registerService(HANDLE threadHandle, HANDLE waitEvent);
- int remove(int code);
- int startDispatcher(LPSERVICE_MAIN_FUNCTION svcMain);
- int start();
- int stop(int code);
- void updateStatus(int status, int exitCode);
-};
-
-#endif
-////////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////// Other C++ Stuff ////////////////////////////
-////////////////////////////////////////////////////////////////////////////////
-#if BLD_DEBUG && UNUSED
-#if LINUX || MACOSX
-#if MPR_CPU_IX86
- inline int64 mprGetHiResTime() {
- int64 now;
- __asm__ __volatile__ ("rdtsc" : "=A" (now));
- return now;
- }
-#endif
-#endif
-#if WIN
- inline int64 mprGetHiResTime() {
- int64 now;
- QueryPerformanceCounter((LARGE_INTEGER*) &now);
- return now;
- }
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-
-inline int64 mprGetElapsedTime()
-{
- static int64 lastMark = 0;
- int64 now, elapsed;
-
- now = mprGetHiResTime();
- if (now > lastMark) {
- elapsed = now - lastMark;
- lastMark = now;
- } else {
- elapsed = lastMark - now + 1;
- lastMark = now;
- }
- return elapsed;
-};
-
-#endif // BLD_DEBUG && UNUSED
-#endif // __cplusplus
-
-////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////// C Prototypes //////////////////////////////
-////////////////////////////////////////////////////////////////////////////////
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Generic array type
- */
-typedef struct MprArray {
- int max; /**< Size of the handles array. */
- int used; /**< Count of used entries in handles. */
- void **handles;
-} MprArray;
-
-#if BLD_FEATURE_SQUEEZE
-#define MPR_ARRAY_INCR 8
-#else
-#define MPR_ARRAY_INCR 16
-#endif
-
-//
-// Array
-//
-extern MprArray *mprCreateArray();
-extern void mprDestroyArray(MprArray *array);
-extern int mprAddToArray(MprArray *array, void *item);
-extern int mprRemoveFromArray(MprArray *array, int index);
-
-//
-// Printf replacements
-//
-#define MPR_STDOUT 1
-#define MPR_STDERR 2
-
-extern int mprPrintf(char *fmt, ...);
-extern int mprStaticPrintf(char *fmt, ...);
-extern int mprFprintf(int fd, char *fmt, ...);
-extern int mprAllocSprintf(char **s, int n, char *fmt, ...);
-extern int mprAllocVsprintf(char **s, int n, char *fmt, va_list arg);
-extern int mprSprintf(char *s, int n, char *fmt, ...);
-extern int mprVsprintf(char *s, int n, char *fmt, va_list arg);
-extern char *mprItoa(int value, char *userBuf, int width);
-extern int mprAtoi(char *str, int radix);
-
-//
-// Safe string routines
-//
-extern int mprStrcpy(char *dest, int destMax, const char *src);
-extern int mprMemcpy(char *dest, int destMax, const char *src,
- int nbytes);
-extern int mprAllocStrcpy(char **dest, int max, const char *src);
-extern int mprReallocStrcpy(char **dest, int max, const char *src);
-extern int mprAllocMemcpy(char **dest, int destMax, const char *src,
- int nbytes);
-extern int mprStrcat(char *dest, int max, const char *delim,
- const char *src, ...);
-extern int mprAllocStrcat(char **dest, int max, const char *delim,
- const char *src, ...);
-extern int mprReallocStrcat(char **dest, int max, int existingLen,
- const char *delim, const char *src, ...);
-extern int mprStrlen(char *src, int max);
-
-// FUTURE (rename to Strcmpi, Strncmpi)
-extern int mprStrCmpAnyCase(char *s1, char *s2);
-extern int mprStrCmpAnyCaseCount(char *s1, char *s2, int len);
-extern char *mprStrLower(char *string);
-extern char *mprStrUpper(char *string);
-extern char *mprStrTrim(char *string, char c);
-
-//
-// Reentrant string and time routines
-//
-extern char *mprStrTok(char *str, const char *sep, char **last);
-extern char *mprGetWordTok(char *word, int wordLen, char *str,
- const char *delim, char **tok);
-extern int mprCtime(const time_t* timer, char *buf, int bufsize);
-extern int mprGetTime(MprTime *tp);
-extern int mprAsctime(const struct tm *timeptr, char *buf, int bufsiz);
-extern struct tm *mprGmtime(time_t* now, struct tm *tmp);
-extern struct tm *mprLocaltime(time_t* now, struct tm *tmp);
-extern int mprRfcTime(char *buf, int size, const struct tm *timeptr);
-
-//
-// General other xPlatform routines
-//
-extern char *mprGetBaseName(char *name);
-extern int mprGetDirName(char *buf, int bufsize, char *path);
-extern void mprMakeArgv(char *prog, char *cmd, char ***argv, int *argc);
-extern int mprMakeDir(char *path);
-extern char *mprInetNtoa(char *buf, int size, const struct in_addr in);
-extern void mprSleep(int msec);
-extern struct hostent* mprGetHostByName(char *name);
-extern void mprFreeGetHostByName(struct hostent* hostp);
-extern int mprGetRandomBytes(uchar *buf, int size, int block);
-
-#if BLD_FEATURE_MULTITHREAD
-extern char *mprGetCurrentThreadName();
-extern void mprLock();
-extern void mprUnlock();
-#else
-#if __cplusplus
-inline void mprLock() {};
-inline void mprUnlock() {};
-#else
-#define mprLock()
-#define mprUnlock()
-#endif
-#endif
-
-extern bool mprGetDebugMode();
-extern void mprSetDebugMode(bool on);
-
-extern int mprGetOsError();
-extern char *mprGetErrorMsg(int errCode);
-extern char *mprMakeTempFileName(char *buf, int bufsize, char *tempDir);
-extern void mprNextFds(char *msg);
-extern char *mprGetFullPathName(char *buf, int buflen, char *path);
-
-extern void mprError(char *file, int line, int flags, char *fmt, ...);
-
-
-#if BLD_FEATURE_LOG || !__cplusplus
-extern void mprLog(int level, char *fmt, ...);
-#endif
-
-typedef void (*MprMemProc)(int askSize, int totalPoolMem, int limit);
-
-extern void *mprCalloc(uint numElem, uint size);
-extern int mprCreateMemHeap(char *userBuf, int initialSize, int limit);
-extern void mprFree(void *ptr);
-extern void *mprMalloc(uint size);
-extern void mprMemClose();
-#if BLD_FEATURE_MALLOC_HOOK
-extern void mprHookMalloc();
-#endif
-extern void mprMemStop();
-extern void mprPrintMemStats();
-extern void *mprRealloc(void *ptr, uint size);
-extern void mprRequestMemStats(bool on);
-extern void mprSetMemHandler(MprMemProc cback);
-extern char *mprStrdup(const char *str);
-
-#if WIN
-extern int mprReadRegistry(char *key, char *val, char **buf, int max);
-#endif
-
-
-#if __cplusplus
-} // extern "C"
-#endif
-
-#endif // _h_MPR
-
-//
-// Local variables:
-// tab-width: 4
-// c-basic-offset: 4
-// End:
-// vim:tw=78
-// vim600: sw=4 ts=4 fdm=marker
-// vim<600: sw=4 ts=4
-//