summaryrefslogtreecommitdiff
path: root/libguile/null-threads.h
diff options
context:
space:
mode:
authorMarius Vollmer <mvo@zagadka.de>2002-12-02 00:59:27 +0000
committerMarius Vollmer <mvo@zagadka.de>2002-12-02 00:59:27 +0000
commitd03502938270a216a1f6d3ceacfcb6a93d921ea2 (patch)
treed0cc08fcae10add2e3fe4f03d1c74aa00f6081af /libguile/null-threads.h
parent340c49bf2ce1714f20f40da304ce7628870bae4d (diff)
downloadguile-d03502938270a216a1f6d3ceacfcb6a93d921ea2.tar.gz
* null-threads.h: Implement pthread-like API as a set of macros.
Diffstat (limited to 'libguile/null-threads.h')
-rw-r--r--libguile/null-threads.h97
1 files changed, 89 insertions, 8 deletions
diff --git a/libguile/null-threads.h b/libguile/null-threads.h
index a34fafbdf..40eaa4292 100644
--- a/libguile/null-threads.h
+++ b/libguile/null-threads.h
@@ -1,7 +1,7 @@
/* classes: h_files */
-#ifndef SCM_NULL_DEFS_H
-#define SCM_NULL_DEFS_H
+#ifndef SCM_NULL_THREADS_H
+#define SCM_NULL_THREADS_H
/* Copyright (C) 2002 Free Software Foundation, Inc.
*
@@ -50,16 +50,97 @@
no new threads can be created.
*/
-#define SCM_CRITICAL_SECTION_START
-#define SCM_CRITICAL_SECTION_END
+/* We can't switch so don't bother trying.
+*/
+#undef SCM_THREAD_SWITCHING_CODE
#define SCM_THREAD_SWITCHING_CODE
-SCM_API void *scm_null_threads_data;
+#define scm_t_thread int
+
+/* The "(void)(...)" constructs in the expansions are there to ensure
+ that the side effects of the argument expressions take place.
+*/
+
+#define scm_thread_create(th,proc,data) ((void)(proc), (void)(data), ENOTSUP)
+#define scm_thread_join(th) do { (void)(th); abort(); } while(0)
+#define scm_thread_detach(th) do { (void)(th); abort(); } while(0)
+#define scm_thread_self() 0
+
+#define scm_t_mutex int
+
+#define scm_mutex_init(mx) do { (void)(mx); } while(0)
+#define scm_mutex_destroy(mx) do { (void)(mx); } while(0)
+#define scm_mutex_lock(mx) do { (void)(mx); } while(0)
+#define scm_mutex_trylock(mx) ((void)(mx), 1)
+#define scm_mutex_unlock(mx) do { (void)(mx); } while(0)
+
+#define scm_t_cond int
+
+#define scm_cond_init(cv) do { (void)(cv); } while(0)
+#define scm_cond_destroy(cv) do { (void)(cv); } while(0)
+#define scm_cond_wait(cv,mx) ((void)(cv), (void)(mx), ENOTSUP)
+#define scm_cond_timedwait(cv,mx,at) ((void)(cv), (void)(mx), (void)(at), \
+ ENOTSUP)
+#define scm_cond_signal(cv) do { (void)(cv); } while(0)
+#define scm_cond_broadcast(cv) do { (void)(cv); } while(0)
+
+#define scm_thread_select select
+
+typedef void **scm_t_key;
+
+#define scm_key_create(keyp) do { *(keyp) = malloc(sizeof(void*)); \
+ } while(0)
+#define scm_key_delete(key) do { free(key); } while(0)
+#define scm_key_setspecific(key, value) do { *(key) = (value); } while(0)
+#define scm_key_getspecific(key) *(key)
+
+#if 0
+
+/* These are the actual prototypes of the functions/macros defined
+ above. We list them here for reference. */
+
+typedef int scm_t_thread;
+
+SCM_API int scm_thread_create (scm_t_thread *th,
+ void (*proc) (void *), void *data);
+SCM_API void scm_thread_join (scm_t_thread th);
+SCM_API void scm_thread_detach (scm_t_thread th);
+SCM_API scm_t_thread scm_thread_self (void);
+
+typedef int scm_t_mutex;
+
+SCM_API void scm_mutex_init (scm_t_mutex *mx);
+SCM_API void scm_mutex_destroy (scm_t_mutex *mx);
+SCM_API void scm_mutex_lock (scm_t_mutex *mx);
+SCM_API int scm_mutex_trylock (scm_t_mutex *mx);
+SCM_API void scm_mutex_unlock (scm_t_mutex *mx);
+
+typedef int scm_t_cond;
+
+SCM_API void scm_cond_init (scm_t_cond *cv);
+SCM_API void scm_cond_destroy (scm_t_cond *cv);
+SCM_API void scm_cond_wait (scm_t_cond *cv, scm_t_mutex *mx);
+SCM_API int scm_cond_timedwait (scm_t_cond *cv, scm_t_mutex *mx,
+ struct timespec *abstime);
+SCM_API void scm_cond_signal (scm_t_cond *cv);
+SCM_API void scm_cond_broadcast (scm_t_cond *cv);
+
+typedef int scm_t_key;
+
+SCM_API void scm_key_create (scm_t_key *keyp);
+SCM_API void scm_key_delete (scm_t_key key);
+SCM_API void scm_key_setspecific (scm_t_key key, const void *value);
+SCM_API void *scm_key_getspecific (scm_t_key key);
+
+SCM_API int scm_thread_select (int nfds,
+ SELECT_TYPE *readfds,
+ SELECT_TYPE *writefds,
+ SELECT_TYPE *exceptfds,
+ struct timeval *timeout);
-#define SCM_THREAD_LOCAL_DATA (scm_null_threads_data)
-#define SCM_SET_THREAD_LOCAL_DATA(ptr) (scm_null_threads_data = (ptr))
+#endif
-#endif /* SCM_NULL_DEFS_H */
+#endif /* SCM_NULL_THREADS_H */
/*
Local Variables: