[asterisk-commits] mmichelson: branch group/CCSS r214067 - in /team/group/CCSS: include/asterisk...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Aug 25 14:21:20 CDT 2009
Author: mmichelson
Date: Tue Aug 25 14:21:16 2009
New Revision: 214067
URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=214067
Log:
Set up ao2 container for pending cc offers.
Modified:
team/group/CCSS/include/asterisk/ccss.h
team/group/CCSS/main/asterisk.c
team/group/CCSS/main/ccss.c
Modified: team/group/CCSS/include/asterisk/ccss.h
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/CCSS/include/asterisk/ccss.h?view=diff&rev=214067&r1=214066&r2=214067
==============================================================================
--- team/group/CCSS/include/asterisk/ccss.h (original)
+++ team/group/CCSS/include/asterisk/ccss.h Tue Aug 25 14:21:16 2009
@@ -605,18 +605,17 @@
*/
int ast_cc_request_state_change(enum ast_cc_state state, const unsigned int core_id, const char *debug);
-#if 0
-Commented out for now, but will be necessary when taskprocessor is added later
/*!
* \since 1.6.4
* \brief Initialize CCSS
*
- * Registers applications, custom functions, and manager actions.
- * Creates core task processor
+ * XXX This needs to be updated as more functionality is added.
+ *
+ * Creates ao2 container for pending CC offers.
+ *
* \retval 0 Success
* \retval nonzero Failure
*/
int ast_cc_init(void);
-#endif
#endif /* _ASTERISK_CCSS_H */
Modified: team/group/CCSS/main/asterisk.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/CCSS/main/asterisk.c?view=diff&rev=214067&r1=214066&r2=214067
==============================================================================
--- team/group/CCSS/main/asterisk.c (original)
+++ team/group/CCSS/main/asterisk.c Tue Aug 25 14:21:16 2009
@@ -138,6 +138,7 @@
#include "asterisk/buildinfo.h"
#include "asterisk/xmldoc.h"
#include "asterisk/poll-compat.h"
+#include "asterisk/ccss.h"
#include "../defaults.h"
@@ -3655,6 +3656,11 @@
exit(1);
}
+ if (ast_cc_init()) {
+ printf("%s", term_quit());
+ exit(1);
+ }
+
if (load_modules(0)) {
printf("%s", term_quit());
exit(1);
Modified: team/group/CCSS/main/ccss.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/CCSS/main/ccss.c?view=diff&rev=214067&r1=214066&r2=214067
==============================================================================
--- team/group/CCSS/main/ccss.c (original)
+++ team/group/CCSS/main/ccss.c Tue Aug 25 14:21:16 2009
@@ -363,6 +363,12 @@
}
}
+static int core_id_counter;
+
+struct ao2_container *pending_cc_offers;
+
+static const int CC_PENDING_OFFER_BUCKETS = 37;
+
/*!
* \brief Struct for CC offers, before a monitor is created
*
@@ -373,6 +379,9 @@
*
* These structs are stored in an ao2_container which is hashed
* based on the core_id of each element for easy lookup.
+ *
+ * Since an ao2_container is being used, core_pending_cc_offers
+ * are ao2 objects themselves.
*/
struct core_pending_cc_offer {
/*!
@@ -382,14 +391,14 @@
* an official request for CC, the same core_id will be used
* when making state machine transactions and the like.
*/
- unsigned int core_id;
+ int core_id;
/*!
* Text identifying the caller. Tentatively, this is just the
* device name of the calling channel. However, this may need
* to be modified to include CID information or something to
- * more uniquely identify the caller. For instance, if an
+ * more uniquely identify the caller. For instance, an
* inbound call over a trunk may be from one of several users,
- * so using just the device name as an identifier is not good
+ * so using just the device name as an identifier is not specific
* enough.
*/
const char *caller;
@@ -406,13 +415,55 @@
struct ast_cc_agent *agent;
};
-int ast_cc_core_init_instance(struct ast_channel *caller, struct ast_cc_interface_tree *called_tree)
-{
-
+static int pending_offer_hash_fn(const void *obj, const int flags)
+{
+ const struct core_pending_cc_offer *pending_offer = obj;
+ return (pending_offer->core_id % CC_PENDING_OFFER_BUCKETS);
+}
+
+static int pending_offer_cmp_fn(void *obj, void *arg, int flags)
+{
+ struct core_pending_cc_offer *pending_offer1 = obj;
+ struct core_pending_cc_offer *pending_offer2 = arg;
+ if (pending_offer1->core_id == pending_offer2->core_id) {
+ return CMP_MATCH | CMP_STOP;
+ }
+ return 0;
+}
+
+static int match_caller(void *obj, void *arg, int flags)
+{
+ struct core_pending_cc_offer *pending_offer = obj;
+ const char *caller = arg;
+ /* Because we always remove duplicate entries, there
+ * should only ever be one entry for a given caller.
+ * This is why we pass CMP_STOP in addition to CMP_MATCH.
+ */
+ if (!strcmp(pending_offer->caller, caller)) {
+ ast_log(LOG_NOTICE, "Killing duplicate pending offer for caller '%s'\n", caller);
+ return CMP_MATCH | CMP_STOP;
+ }
+ return 0;
+}
+
+static void kill_duplicate_offers(char *caller) {
+ ao2_callback(pending_cc_offers, OBJ_UNLINK | OBJ_NODATA, match_caller, caller);
+}
+
+int ast_cc_core_init_instance(struct ast_channel *caller_chan, struct ast_cc_interface_tree *called_tree)
+{
+ char *caller = ast_strdupa(caller_chan->name);
+ char *dash = strrchr(caller, '-');
+
+ if (dash) {
+ *dash = '\0';
+ }
/* First, we need to kill off other pending CC offers to caller. If the caller is going
* to request a CC service, it may only be for the latest call he made.
*/
+ kill_duplicate_offers(caller);
+
/* Next, we need to allocate the structure we will use to store the tree. */
/* Next, we need to store this new tree in a container */
@@ -424,3 +475,12 @@
/*ao2_ref(called_tree, +1);*/
return 0;
}
+
+int ast_cc_init(void)
+{
+ if (!(pending_cc_offers = ao2_container_alloc(CC_PENDING_OFFER_BUCKETS,
+ pending_offer_hash_fn, pending_offer_cmp_fn))) {
+ return -1;
+ }
+ return 0;
+}
More information about the asterisk-commits
mailing list