]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/threads.h
Sorter debugging tools can be compiled again
[libucw.git] / ucw / threads.h
index ef00dea1af953837793e49149379ab385e8ae262..3c1f29b799ccf292e44ae38df900d23e5fe67326 100644 (file)
@@ -1,35 +1,62 @@
 /*
  *     The UCW Library -- Threading Helpers
  *
- *     (c) 2006 Martin Mares <mj@ucw.cz>
+ *     (c) 2006--2012 Martin Mares <mj@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
  */
 
-#ifndef _UCW_THREAD_H
-#define _UCW_THREAD_H
+#ifndef _UCW_THREADS_H
+#define _UCW_THREADS_H
+
+#include <ucw/sighandler.h>
 
 /* This structure holds per-thread data */
 
 struct ucwlib_context {
-  int thread_id;                       // Thread ID (either kernel tid or a counter)
+  int _thread_id;                      // Thread ID (either kernel tid or a counter, use ucwlib_thread_id())
   int temp_counter;                    // Counter for fb-temp.c
   struct asio_queue *io_queue;         // Async I/O queue for fb-direct.c
   ucw_sighandler_t *signal_handlers;   // Signal handlers for sighandler.c
+  struct main_context *main_context;   // Current context for mainloop.c
+  struct cf_context *cf_context;       // Current context for configuration parser
+  // Resources and transactions:
+  struct respool *current_respool;     // Current resource pool
+  struct mempool *trans_pool;          // Transaction mempool
+  struct trans *current_trans;         // Currently open transaction
 };
 
+#ifdef CONFIG_UCW_THREADS
+
+#ifdef CONFIG_UCW_TLS
+extern __thread struct ucwlib_context ucwlib_context;
+static inline struct ucwlib_context *ucwlib_thread_context(void) { return &ucwlib_context; }
+int ucwlib_thread_id(struct ucwlib_context *c);
+#else
 struct ucwlib_context *ucwlib_thread_context(void);
+static inline int ucwlib_thread_id(struct ucwlib_context *c) { return c->_thread_id; }
+#endif
 
 /* Global lock used for initialization, cleanup and other not so frequently accessed global state */
 
 void ucwlib_lock(void);
 void ucwlib_unlock(void);
 
-#ifdef CONFIG_UCW_THREADS
-
 extern uns ucwlib_thread_stack_size;
 
+#else
+
+/* We have no threads, let's simulate the context and locking */
+
+extern struct ucwlib_context default_ucwlib_context;
+static inline struct ucwlib_context *ucwlib_thread_context(void) { return &default_ucwlib_context; }
+
+static inline int ucwlib_thread_id(struct ucwlib_context *c UNUSED) { return 0; }
+
+static inline void ucwlib_lock(void) { }
+static inline void ucwlib_unlock(void) { }
+
 #endif
 
 #endif