summaryrefslogtreecommitdiffstats
path: root/servercomm/callbackmgr.hh
diff options
context:
space:
mode:
Diffstat (limited to 'servercomm/callbackmgr.hh')
-rw-r--r--servercomm/callbackmgr.hh136
1 files changed, 136 insertions, 0 deletions
diff --git a/servercomm/callbackmgr.hh b/servercomm/callbackmgr.hh
new file mode 100644
index 0000000..81effcb
--- /dev/null
+++ b/servercomm/callbackmgr.hh
@@ -0,0 +1,136 @@
+/*
+* This file is part of rasdaman community.
+*
+* Rasdaman community is free software: 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 3 of the License, or
+* (at your option) any later version.
+*
+* Rasdaman community 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 rasdaman community. If not, see <http://www.gnu.org/licenses/>.
+*
+* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
+rasdaman GmbH.
+*
+* For more information please see <http://www.rasdaman.org>
+* or contact Peter Baumann via <baumann@rasdaman.com>.
+/
+/**
+ * SOURCE: callbackmgr.hh
+ *
+ * MODULE: servercomm
+ * CLASS: CallBackManager
+ *
+ * COMMENTS:
+ * No Comments
+*/
+
+
+#ifndef _CALLBACK_MANAGER_
+#define _CALLBACK_MANAGER_
+
+
+//@ManMemo: Module: {\bf servercomm}
+
+/*@Doc:
+ The class CallBackManager stores function- and context pointers
+ that are executed in the order they were registered in when
+ calling executePending(). This system replaces the alarm handler
+ approach formerly used which suffered from a restrictive
+ environment where mallocs and printfs were not legal. Since
+ neither call must happen when a callback function is registered
+ the maximum number of callbacks must be fixed in the constructor.
+*/
+
+class CallBackManager
+{
+ public:
+ /// constructor
+ CallBackManager(unsigned int size=1024);
+ /**
+ Constructor; size is the maximum number of callback slots to
+ reserve.
+ */
+
+ /// destructor
+ ~CallBackManager(void);
+
+ /// Resizes the number of callback slots at run-time
+ void setMaximumSize(unsigned int size);
+
+ /// callback function type
+ typedef void (*callback_f)(void*);
+ /**
+ The type of a callback function is void f(void *context). The
+ value of context is the one specified when registering. It's
+ up to the function to cast the value.
+ */
+
+ /// register new callback
+ int registerCallback(callback_f function, void *context);
+ /**
+ Register a new callback function. Returns 0 for OK, -1 if
+ the callback table had an overflow. Since it must be possible
+ to call this function from an alarm handler there may not be
+ any mallocs or prints here.
+ */
+
+ /// register new callback, ensuring uniqueness
+ int registerUniqueCallback(callback_f function, void *context);
+ /**
+ Same as registerCallback, but makes sure this callback isn't
+ pending already in which case it does nothing.
+ */
+
+ /// remove callback
+ int removeCallback(callback_f function, void *context);
+ /**
+ Deregister a callback function. Returns 0 for OK, -1 for
+ not found.
+ */
+
+ /// Get the number of callback functions registered.
+ unsigned int getNumCallbacks(void) const;
+
+ /// execute pending callbacks
+ int executePending(void);
+ /**
+ Execute all pending callback functions and clear the list
+ afterwards. Returns the number of callback functions executed.
+ */
+
+
+ private:
+
+ /// find a matching function/context pair
+ int findCallback(callback_f function, void *context) const;
+ /**
+ Searches the pending callbacks for the one specified by the
+ function parameters and returns its index if found, -1 otherwise.
+ */
+
+ //@{ Internal storage structure for callbacks.
+ typedef struct callback_desc_s {
+ callback_f function;
+ void *context;
+ } callback_desc_t;
+ //@}
+
+ callback_desc_t *callbacks;
+
+ /// Maximum size of callback list
+ unsigned int maxCallbacks;
+
+ /// Currently occupied callback slots
+ unsigned int numPending;
+
+ /// Flag that's set to 1 if the callback table overflowed.
+ int overflowDetected;
+};
+
+#endif