aboutsummaryrefslogtreecommitdiff
path: root/src/chain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/chain.c')
-rw-r--r--src/chain.c74
1 files changed, 60 insertions, 14 deletions
diff --git a/src/chain.c b/src/chain.c
index 32fd6950..354817ea 100644
--- a/src/chain.c
+++ b/src/chain.c
@@ -18,6 +18,21 @@
#define VERBOSE 0
/*
+ * Show debugging info
+ */
+static void Chain_debug_msg(char *FuncStr, int Op, int Branch, int Dir,
+ ChainLink *Info)
+{
+#if VERBOSE
+ const char *StrOps[] = {"", "OpStart", "OpSend",
+ "OpStop", "OpEnd", "OpAbort"};
+ MSG("%-*s: %-*s [%d%s] Info=%p Flags=%d\n",
+ 12, FuncStr, 7, StrOps[Op], Branch, (Dir == 1) ? "F" : "B",
+ Info, Info ? Info->Flags : -1);
+#endif
+}
+
+/*
* Create and initialize a new chain-link
*/
ChainLink *a_Chain_new(void)
@@ -79,26 +94,46 @@ void a_Chain_unlink(ChainLink *Info, int Direction)
/*
* Issue the forward callback of the 'Info' link
+ * Return value: 1 if OK, 0 if not operative.
*/
int a_Chain_fcb(int Op, ChainLink *Info, void *Data1, void *Data2)
{
- if (Info->Fcb) {
+ int ret = 0;
+
+ if (Info->Flags & (CCC_Ended + CCC_Aborted)) {
+ /* CCC is not operative */
+ } else if (Info->Fcb) {
+ if (Op == OpEnd)
+ Info->Flags |= CCC_Ended;
+ else if (Op == OpAbort)
+ Info->Flags |= CCC_Aborted;
+
Info->Fcb(Op, Info->FcbBranch, FWD, Info->FcbInfo, Data1, Data2);
- return 1;
+ ret = 1;
}
- return 0;
+ return ret;
}
/*
* Issue the backward callback of the 'Info' link
+ * Return value: 1 if OK, 0 if not operative.
*/
int a_Chain_bcb(int Op, ChainLink *Info, void *Data1, void *Data2)
{
- if (Info->Bcb) {
+ int ret = 0;
+
+ if (Info->Flags & (CCC_Ended + CCC_Aborted)) {
+ /* CCC is not operative */
+ } else if (Info->Bcb) {
+ if (Op == OpEnd)
+ Info->Flags |= CCC_Ended;
+ else if (Op == OpAbort)
+ Info->Flags |= CCC_Aborted;
+
Info->Bcb(Op, Info->BcbBranch, BCK, Info->BcbInfo, Data1, Data2);
- return 1;
+ ret = 1;
}
- return 0;
+ return ret;
}
@@ -115,14 +150,25 @@ DataBuf *a_Chain_dbuf_new(void *buf, int size, int code)
}
/*
- * Show some debugging info
+ * Check whether the CCC is operative.
+ * Also used to hook debug information.
+ *
+ * Return value: 1 if ready to use, 0 if not operative.
*/
-void a_Chain_debug_msg(char *FuncStr, int Op, int Branch, int Dir)
+int a_Chain_check(char *FuncStr, int Op, int Branch, int Dir,
+ ChainLink *Info)
{
-#if VERBOSE
- const char *StrOps[] = {"", "OpStart", "OpSend",
- "OpStop", "OpEnd", "OpAbort"};
- MSG("%-*s: %-*s [%d%s]\n",
- 12, FuncStr, 7, StrOps[Op], Branch, (Dir == 1) ? "F" : "B");
-#endif
+ int ret = 0;
+
+ /* Show status information */
+ Chain_debug_msg(FuncStr, Op, Branch, Dir, Info);
+
+ if (Info->Flags & (CCC_Ended + CCC_Aborted)) {
+ /* CCC is not operative */
+ MSG_WARN("CCC: call on already finished chain.\n");
+ } else {
+ ret = 1;
+ }
+ return ret;
}
+