]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/jcr.c
Add missing files for xattr and eliminate a few compiler complaints
[bacula/bacula] / bacula / src / lib / jcr.c
index 48d366ed490c6eb1df2b8d60bd07e253e5f0a94e..05a94d21284fe261854c64caf3488395caac5405 100644 (file)
@@ -56,7 +56,6 @@
 const int dbglvl = 3400;
 
 /* External variables we reference */
-extern time_t watchdog_time;
 
 /* External referenced functions */
 void free_bregexps(alist *bregexps);
@@ -475,8 +474,7 @@ static void free_common_jcr(JCR *jcr)
       free_guid_list(jcr->id_list);
       jcr->id_list = NULL;
    }
-   /* Invalidate the tsd jcr data */
-   set_jcr_in_tsd(INVALID_JCR);
+   remove_jcr_from_tsd(jcr);
    free(jcr);
 }
 
@@ -580,6 +578,21 @@ void free_jcr(JCR *jcr)
    Dmsg0(dbglvl, "Exit free_jcr\n");
 }
 
+/*
+ * Remove jcr from thread specific data, but
+ *   but make sure it is us who are attached.
+ */
+void remove_jcr_from_tsd(JCR *jcr)
+{
+   JCR *tjcr = get_jcr_from_tsd();
+   if (tjcr == jcr) { 
+      set_jcr_in_tsd(INVALID_JCR);
+   }
+}
+
+/*
+ * Put this jcr in the thread specifc data 
+ */
 void set_jcr_in_tsd(JCR *jcr)
 {
    int status = pthread_setspecific(jcr_key, (void *)jcr);
@@ -589,6 +602,9 @@ void set_jcr_in_tsd(JCR *jcr)
    }
 }
 
+/*
+ * Give me the jcr that is attached to this thread
+ */
 JCR *get_jcr_from_tsd()
 {
    JCR *jcr = (JCR *)pthread_getspecific(jcr_key);
@@ -1008,13 +1024,26 @@ extern "C" void timeout_handler(int sig)
    return;                            /* thus interrupting the function */
 }
 
+/* Used to display specific daemon information after a fatal signal 
+ * (like B_DB in the director)
+ */
+#define MAX_DBG_HOOK 10
+static dbg_jcr_hook_t *dbg_jcr_hooks[MAX_DBG_HOOK];
+static int dbg_jcr_handler_count;
+
+void dbg_jcr_add_hook(dbg_jcr_hook_t *fct)
+{
+   ASSERT(dbg_jcr_handler_count < MAX_DBG_HOOK);
+   dbg_jcr_hooks[dbg_jcr_handler_count++] = fct;
+}
+
 /*
  * !!! WARNING !!! 
  *
- * This function should be used ONLY after a violent signal. We walk through the
+ * This function should be used ONLY after a fatal signal. We walk through the
  * JCR chain without doing any lock, bacula should not be running.
  */
-void _print_jcr_dbg(FILE *fp)
+void _dbg_print_jcr(FILE *fp)
 {
    char buf1[128], buf2[128], buf3[128], buf4[128];
    if (!jcrs) {
@@ -1048,6 +1077,10 @@ void _print_jcr_dbg(FILE *fp)
       fprintf(fp, "\tdequeing=%i\n", jcr->dequeuing);
       fprintf(fp, "\tdb=%p db_batch=%p batch_started=%i\n", 
               jcr->db, jcr->db_batch, jcr->batch_started);
+      
+      for(int i=0; i < dbg_jcr_handler_count; i++) {
+         dbg_jcr_hook_t *fct = dbg_jcr_hooks[i];
+         fct(jcr, fp);
+      }
    }
 }
-