X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Fthreads.h;h=9334e29e317434a2cde4f1d3e2b3c5f77ddb2383;hb=e6688eeb82d349a202a30a243a59079bdc4c212d;hp=ef00dea1af953837793e49149379ab385e8ae262;hpb=ad920945145a18895ef391511c92ef42e0e4c3d7;p=libucw.git diff --git a/ucw/threads.h b/ucw/threads.h index ef00dea1..9334e29e 100644 --- a/ucw/threads.h +++ b/ucw/threads.h @@ -1,35 +1,55 @@ /* * The UCW Library -- Threading Helpers * - * (c) 2006 Martin Mares + * (c) 2006--2010 Martin Mares * * 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 /* 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 }; +#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