Created a routine to get a copy of the context list so that it can be
authorDave West <davew@uncensored.citadel.org>
Tue, 18 Mar 2008 14:58:28 +0000 (14:58 +0000)
committerDave West <davew@uncensored.citadel.org>
Tue, 18 Mar 2008 14:58:28 +0000 (14:58 +0000)
read safely at leasure.

citadel/include/ctdl_module.h
citadel/sysdep.c

index e5a544b73365ad9e73cb61311c1f59a3c192ffcf..5dc418131b0aa86d392ddf61e4b2e3beda91c8cc 100644 (file)
@@ -138,5 +138,15 @@ void CtdlThreadAllocTSD(void);
 #define MYTID          (((ThreadTSD*)pthread_getspecific(ThreadKey))->tid)
 #define CT             (((ThreadTSD*)pthread_getspecific(ThreadKey))->self)
 
+/** return the current context list as an array and do it in a safe manner
+ * The returned data is a copy so only reading is useful
+ * The number of contexts is returned in count.
+ * Beware, this does not copy any of the data pointed to by the context.
+ * This means that you can not rely on things like the redirect buffer being valid.
+ * You must free the returned pointer when done.
+ */
+struct CitContext *CtdlGetContextArray (int *count);
+
+
 
 #endif /* CTDL_MODULE_H */
index 164cafd5a70e2e530d888cb2b4df3695d5fb057e..bf77408ee4e80fbe305594be210ff93bc49f03cd 100644 (file)
@@ -460,6 +460,24 @@ struct CitContext *CreateNewContext(void) {
 }
 
 
+struct CitContext *CtdlGetContextArray(int *count)
+{
+       int nContexts, i;
+       struct CitContext *nptr, *cptr;
+       
+       nContexts = num_sessions;
+       nptr = malloc(sizeof(struct CitContext) * nContexts);
+       if (!nptr)
+               return NULL;
+       begin_critical_section(S_SESSION_TABLE);
+       for (cptr = ContextList, i=0; cptr != NULL && i < nContexts; cptr = cptr->next, i++)
+               memcpy(&nptr[i], cptr, sizeof (struct CitContext));
+       end_critical_section (S_SESSION_TABLE);
+       
+       *count = i;
+       return nptr;
+}
+
 /*
  * The following functions implement output buffering. If the kernel supplies
  * native TCP buffering (Linux & *BSD), use that; otherwise, emulate it with