[svn-commits] russell: branch russell/smdi-1.4 r93295 - /team/russell/smdi-1.4/res/res_smdi.c
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Mon Dec 17 14:31:48 CST 2007
Author: russell
Date: Mon Dec 17 14:31:48 2007
New Revision: 93295
URL: http://svn.digium.com/view/asterisk?view=rev&rev=93295
Log:
Implement the station option for smdi_message_wait so that threads can sleep
while waiting for an smdi message of a certain type and for a certain station
Modified:
team/russell/smdi-1.4/res/res_smdi.c
Modified: team/russell/smdi-1.4/res/res_smdi.c
URL: http://svn.digium.com/view/asterisk/team/russell/smdi-1.4/res/res_smdi.c?view=diff&rev=93295&r1=93294&r2=93295
==============================================================================
--- team/russell/smdi-1.4/res/res_smdi.c (original)
+++ team/russell/smdi-1.4/res/res_smdi.c Mon Dec 17 14:31:48 2007
@@ -311,12 +311,12 @@
}
}
-static inline void *smdi_msg_pop(struct ast_smdi_interface *iface, enum smdi_message_type type)
+static void purge_old_messages(struct ast_smdi_interface *iface, enum smdi_message_type type)
{
struct timeval now;
long elapsed = 0;
void *msg;
-
+
lock_msg_q(iface, type);
msg = unlink_from_msg_q(iface, type);
unlock_msg_q(iface, type);
@@ -329,28 +329,64 @@
if (elapsed > iface->msg_expiry) {
/* found an expired message */
unref_msg(msg, type);
- ast_log(LOG_NOTICE, "Purged expired message from %s SMDI MD message queue. Message was %ld milliseconds too old.\n",
- iface->name, elapsed - iface->msg_expiry);
+ ast_log(LOG_NOTICE, "Purged expired message from %s SMDI %s message queue. "
+ "Message was %ld milliseconds too old.\n",
+ iface->name, (type == SMDI_MD) ? "MD" : "MWI",
+ elapsed - iface->msg_expiry);
lock_msg_q(iface, type);
msg = unlink_from_msg_q(iface, type);
unlock_msg_q(iface, type);
- }
- else {
- /* good message, return it */
+ } else {
+ /* good message, put it back and return */
+ switch (type) {
+ case SMDI_MD:
+ ast_smdi_md_message_push(iface, msg);
+ break;
+ case SMDI_MWI:
+ ast_smdi_mwi_message_push(iface, msg);
+ break;
+ }
+ unref_msg(msg, type);
break;
}
}
+}
+
+static void *smdi_msg_pop(struct ast_smdi_interface *iface, enum smdi_message_type type)
+{
+ void *msg;
+
+ purge_old_messages(iface, type);
+
+ lock_msg_q(iface, type);
+ msg = unlink_from_msg_q(iface, type);
+ unlock_msg_q(iface, type);
return msg;
}
-/*!
- * \todo XXX Make use of the terminal argument to allow waiting for a message
- * for a specific terminal.
- */
+static void *smdi_msg_find(struct ast_smdi_interface *iface,
+ enum smdi_message_type type, const char *station)
+{
+ void *msg = NULL;
+
+ purge_old_messages(iface, type);
+
+ switch (type) {
+ case SMDI_MD:
+ msg = ASTOBJ_CONTAINER_FIND(&iface->md_q, station);
+ break;
+ case SMDI_MWI:
+ msg = ASTOBJ_CONTAINER_FIND(&iface->mwi_q, station);
+ break;
+ }
+
+ return msg;
+}
+
static void *smdi_message_wait(struct ast_smdi_interface *iface, int timeout,
- enum smdi_message_type type, const char *terminal)
+ enum smdi_message_type type, const char *station)
{
struct timeval start;
long diff = 0;
@@ -363,7 +399,7 @@
lock_msg_q(iface, type);
- if ((msg = smdi_msg_pop(iface, type))) {
+ if ((msg = smdi_msg_find(iface, type, station))) {
unlock_msg_q(iface, type);
return msg;
}
@@ -377,7 +413,7 @@
ast_cond_wait(&iface->md_q_cond, &iface->md_q_lock);
- if ((msg = smdi_msg_pop(iface, type))) {
+ if ((msg = smdi_msg_find(iface, type, station))) {
unlock_msg_q(iface, type);
return msg;
}
@@ -538,7 +574,11 @@
/* make sure the value is null terminated, even if this truncates it */
md_msg->fwd_st[sizeof(md_msg->fwd_st) - 1] = '\0';
cp = NULL;
-
+
+ /* Put the fwd_st in the name field so that we can use ASTOBJ_FIND to look
+ * up a message on this field */
+ ast_copy_string(md_msg->name, md_msg->fwd_st, sizeof(md_msg->name));
+
/* read the calling station number (may be blank) */
cp = &md_msg->calling_st[0];
for (i = 0; i < sizeof(md_msg->calling_st) - 1; i++) {
@@ -593,6 +633,10 @@
mwi_msg->fwd_st[sizeof(mwi_msg->fwd_st) - 1] = '\0';
cp = NULL;
+ /* Put the fwd_st in the name field so that we can use ASTOBJ_FIND to look
+ * up a message on this field */
+ ast_copy_string(mwi_msg->name, mwi_msg->fwd_st, sizeof(mwi_msg->name));
+
/* read the mwi failure cause */
for (i = 0; i < sizeof(mwi_msg->cause) - 1; i++)
mwi_msg->cause[i] = fgetc(iface->file);
@@ -1043,7 +1087,7 @@
struct ast_module_user *u;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(port);
- AST_APP_ARG(terminal);
+ AST_APP_ARG(station);
AST_APP_ARG(timeout);
);
unsigned int timeout = SMDI_RETRIEVE_TIMEOUT_DEFAULT;
@@ -1071,7 +1115,7 @@
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
- if (ast_strlen_zero(args.port) || ast_strlen_zero(args.terminal)) {
+ if (ast_strlen_zero(args.port) || ast_strlen_zero(args.station)) {
ast_log(LOG_ERROR, "Invalid arguments provided to SMDI_MSG_RETRIEVE\n");
goto return_error;
}
@@ -1088,9 +1132,9 @@
}
}
- if (!(md_msg = smdi_message_wait(iface, timeout, SMDI_MD, args.terminal))) {
- ast_log(LOG_WARNING, "No SMDI message retrieved for terminal '%s' after "
- "waiting %u ms.\n", args.terminal, timeout);
+ if (!(md_msg = smdi_message_wait(iface, timeout, SMDI_MD, args.station))) {
+ ast_log(LOG_WARNING, "No SMDI message retrieved for station '%s' after "
+ "waiting %u ms.\n", args.station, timeout);
goto return_error;
}
@@ -1147,7 +1191,7 @@
static struct ast_custom_function smdi_msg_retrieve_function = {
.name = "SMDI_MSG_RETRIEVE",
.synopsis = "Retrieve an SMDI message.",
- .syntax = "SMDI_MSG_RETRIEVE(<smdi port>,<terminal>[,timeout])",
+ .syntax = "SMDI_MSG_RETRIEVE(<smdi port>,<station>[,timeout])",
.desc =
" This function is used to retrieve an incoming SMDI message. It returns\n"
"an ID which can be used with the SMDI_MSG() function to access details of\n"
More information about the svn-commits
mailing list