aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2010-09-06 16:52:14 +0200
committerAris Adamantiadis <aris@0xbadc0de.be>2010-09-06 16:52:14 +0200
commit49f57a8d0dcf990169e2f591a937672f74ffa4a9 (patch)
treee8f872af3dd4f0c7d02ef47e214f016747396c23
parentfbe102bada583f308450c27e256053b51643a532 (diff)
downloadlibssh-49f57a8d0dcf990169e2f591a937672f74ffa4a9.tar.gz
libssh-49f57a8d0dcf990169e2f591a937672f74ffa4a9.tar.xz
libssh-49f57a8d0dcf990169e2f591a937672f74ffa4a9.zip
Implemented the noop and native pointers
-rw-r--r--include/libssh/callbacks.h23
-rw-r--r--src/threads.c21
-rw-r--r--src/threads/CMakeLists.txt1
-rw-r--r--src/threads/native.c4
-rw-r--r--src/threads/pthread.c88
-rw-r--r--tests/unittests/torture_rand.c2
6 files changed, 95 insertions, 44 deletions
diff --git a/include/libssh/callbacks.h b/include/libssh/callbacks.h
index b7047d65..10ee6508 100644
--- a/include/libssh/callbacks.h
+++ b/include/libssh/callbacks.h
@@ -255,8 +255,27 @@ LIBSSH_API int ssh_set_callbacks(ssh_session session, ssh_callbacks cb);
*/
typedef int (*ssh_thread_callback) (void **lock);
+
+/**
+ * @brief Type of the threading solution implemented behind
+ * these callbacks
+ */
+enum ssh_threads_type_e {
+ /** The thread callbacks do nothing */
+ ssh_threads_type_noop,
+ /** The thread callbacks use pthread */
+ ssh_threads_type_pthread,
+ /** The thread callbacks use win32 threads */
+ ssh_threads_type_win32,
+ /** The thread callbacks use pth */
+ ssh_threads_type_pth,
+ /** The thread callbacks are unknown or different */
+ ssh_threads_type_other
+};
+
typedef unsigned long (*ssh_thread_id_callback) (void);
struct ssh_threads_callbacks_struct {
+ enum ssh_threads_type_e type;
ssh_thread_callback mutex_init;
ssh_thread_callback mutex_destroy;
ssh_thread_callback mutex_lock;
@@ -277,7 +296,9 @@ struct ssh_threads_callbacks_struct {
LIBSSH_API int ssh_threads_set_callbacks(struct ssh_threads_callbacks_struct
*cb);
-extern struct ssh_threads_callbacks_struct ssh_pthread_callbacks;
+extern struct ssh_threads_callbacks_struct ssh_threads_pthread;
+extern struct ssh_threads_callbacks_struct ssh_threads_noop;
+extern struct ssh_threads_callbacks_struct ssh_threads_native;
/** @} */
#ifdef __cplusplus
diff --git a/src/threads.c b/src/threads.c
index 51a4ccfb..022ca2ce 100644
--- a/src/threads.c
+++ b/src/threads.c
@@ -30,6 +30,25 @@
#include "libssh/priv.h"
#include "libssh/threads.h"
+static int threads_noop (void **lock){
+ (void)lock;
+ return 0;
+}
+
+static unsigned long threads_id_noop (void){
+ return 1;
+}
+
+struct ssh_threads_callbacks_struct ssh_threads_noop =
+{
+ .type=ssh_threads_type_noop,
+ .mutex_init=threads_noop,
+ .mutex_destroy=threads_noop,
+ .mutex_lock=threads_noop,
+ .mutex_unlock=threads_noop,
+ .thread_id=threads_id_noop
+};
+
static struct ssh_threads_callbacks_struct *user_callbacks;
#ifdef HAVE_LIBGCRYPT
@@ -107,7 +126,7 @@ int ssh_threads_init(void){
* already the case
*/
if(user_callbacks == NULL){
- return SSH_ERROR; // Can't do anything to initialize threading
+ user_callbacks=&ssh_threads_noop;
}
/* Then initialize the crypto libraries threading callbacks */
diff --git a/src/threads/CMakeLists.txt b/src/threads/CMakeLists.txt
index 1cf3d7b1..2cebb416 100644
--- a/src/threads/CMakeLists.txt
+++ b/src/threads/CMakeLists.txt
@@ -33,7 +33,6 @@ set(LIBSSH_THREADS_LINK_LIBRARIES
)
set(libssh_threads_SRCS
- native.c
)
# build and link pthread
diff --git a/src/threads/native.c b/src/threads/native.c
deleted file mode 100644
index c65c18e4..00000000
--- a/src/threads/native.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "config.h"
-#include <libssh/callbacks.h>
-
-struct ssh_threads_callbacks_struct ssh_pthread_callbacks;
diff --git a/src/threads/pthread.c b/src/threads/pthread.c
index 35589cc7..0fc0b110 100644
--- a/src/threads/pthread.c
+++ b/src/threads/pthread.c
@@ -45,43 +45,59 @@
* callbacks for threading
*
*/
-#define SSH_THREADS_PTHREAD(name) \
-static int ssh_pthread_mutex_init (void **priv){ \
- int err = 0; \
- *priv = malloc (sizeof (pthread_mutex_t)); \
- if (*priv==NULL) \
- return ENOMEM; \
- err = pthread_mutex_init (*priv, NULL); \
- if (err != 0){ \
- free (*priv); \
- *priv=NULL; \
- } \
- return err; \
-} \
-static int ssh_pthread_mutex_destroy (void **lock) { \
- int err = pthread_mutex_destroy (*lock); \
- free (*lock); \
- *lock=NULL; \
- return err; \
-} \
-static int ssh_pthread_mutex_lock (void **lock) { \
- return pthread_mutex_lock (*lock); \
-} \
-static int ssh_pthread_mutex_unlock (void **lock){ \
- return pthread_mutex_unlock (*lock); \
-} \
-static unsigned long ssh_pthread_thread_id (void){ \
- return (unsigned long) pthread_self(); \
-} \
-static struct ssh_threads_callbacks_struct name= \
-{ \
- .mutex_init=ssh_pthread_mutex_init, \
- .mutex_destroy=ssh_pthread_mutex_destroy, \
- .mutex_lock=ssh_pthread_mutex_lock, \
- .mutex_unlock=ssh_pthread_mutex_unlock, \
- .thread_id=ssh_pthread_thread_id \
+
+static int ssh_pthread_mutex_init (void **priv){
+ int err = 0;
+ *priv = malloc (sizeof (pthread_mutex_t));
+ if (*priv==NULL)
+ return ENOMEM;
+ err = pthread_mutex_init (*priv, NULL);
+ if (err != 0){
+ free (*priv);
+ *priv=NULL;
+ }
+ return err;
+}
+
+static int ssh_pthread_mutex_destroy (void **lock) {
+ int err = pthread_mutex_destroy (*lock);
+ free (*lock);
+ *lock=NULL;
+ return err;
+}
+
+static int ssh_pthread_mutex_lock (void **lock) {
+ return pthread_mutex_lock (*lock);
}
-SSH_THREADS_PTHREAD(ssh_pthread_user_callbacks);
+static int ssh_pthread_mutex_unlock (void **lock){
+ return pthread_mutex_unlock (*lock);
+}
+
+static unsigned long ssh_pthread_thread_id (void){
+ return (unsigned long) pthread_self();
+}
+
+struct ssh_threads_callbacks_struct ssh_threads_pthread =
+{
+ .type=ssh_threads_type_pthread,
+ .mutex_init=ssh_pthread_mutex_init,
+ .mutex_destroy=ssh_pthread_mutex_destroy,
+ .mutex_lock=ssh_pthread_mutex_lock,
+ .mutex_unlock=ssh_pthread_mutex_unlock,
+ .thread_id=ssh_pthread_thread_id
+};
+
+#ifdef THREAD_NATIVE_PTHREAD
+struct ssh_threads_callbacks_struct ssh_threads_native =
+{
+ .type=ssh_threads_type_pthread,
+ .mutex_init=ssh_pthread_mutex_init,
+ .mutex_destroy=ssh_pthread_mutex_destroy,
+ .mutex_lock=ssh_pthread_mutex_lock,
+ .mutex_unlock=ssh_pthread_mutex_unlock,
+ .thread_id=ssh_pthread_thread_id
+};
+#endif
#endif /* HAVE_PTHREAD */
diff --git a/tests/unittests/torture_rand.c b/tests/unittests/torture_rand.c
index be4390e1..74193977 100644
--- a/tests/unittests/torture_rand.c
+++ b/tests/unittests/torture_rand.c
@@ -15,7 +15,7 @@
static void setup(){
printf("setup\n");
- ssh_threads_set_callbacks(&ssh_pthread_callbacks);
+ ssh_threads_set_callbacks(&ssh_threads_pthread);
ssh_init();
}