summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2010-09-06 14:51:01 +0200
committerAris Adamantiadis <aris@0xbadc0de.be>2010-09-06 14:51:01 +0200
commit2cca490076841b431d7a83d020d90e1ad00bbca5 (patch)
tree6c42026aed29faeeb4d8e28ad3f11a4288517887 /src
parentf7842e3a4b9acea2126ff725f993c299aef0e6db (diff)
downloadlibssh-2cca490076841b431d7a83d020d90e1ad00bbca5.tar.gz
libssh-2cca490076841b431d7a83d020d90e1ad00bbca5.tar.xz
libssh-2cca490076841b431d7a83d020d90e1ad00bbca5.zip
Moved pthread specific code in src/threads/pthread.c
pthread example doesn't compile du to the lack of libssh_threads_native.so library
Diffstat (limited to 'src')
-rw-r--r--src/threads.c21
-rw-r--r--src/threads/pthread.c84
2 files changed, 84 insertions, 21 deletions
diff --git a/src/threads.c b/src/threads.c
index 7cac6db..51a4ccf 100644
--- a/src/threads.c
+++ b/src/threads.c
@@ -30,22 +30,6 @@
#include "libssh/priv.h"
#include "libssh/threads.h"
-#ifndef _WIN32
-
-#ifndef HAVE_PTHREAD
-#warning "You do not have any threading library installed. If the linked"
-#warning "application doesn't provide the threading callbacks, you're screwed"
-#endif
-
-
-#ifdef HAVE_PTHREAD
-
-#include <errno.h>
-#include <pthread.h>
-SSH_THREADS_PTHREAD(ssh_pthread_user_callbacks);
-#endif /* HAVE_PTHREAD */
-#endif /* _WIN32 */
-
static struct ssh_threads_callbacks_struct *user_callbacks;
#ifdef HAVE_LIBGCRYPT
@@ -123,13 +107,8 @@ int ssh_threads_init(void){
* already the case
*/
if(user_callbacks == NULL){
-#ifdef HAVE_PTHREAD
- user_callbacks=&ssh_pthread_user_callbacks;
- }
-#else
return SSH_ERROR; // Can't do anything to initialize threading
}
-#endif
/* Then initialize the crypto libraries threading callbacks */
#ifdef HAVE_LIBGCRYPT
diff --git a/src/threads/pthread.c b/src/threads/pthread.c
new file mode 100644
index 0000000..2f62ad3
--- /dev/null
+++ b/src/threads/pthread.c
@@ -0,0 +1,84 @@
+/*
+ * This file is part of the SSH Library
+ *
+ * Copyright (c) 2010 by Aris Adamantiadis
+ *
+ * The SSH Library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ *
+ * The SSH Library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with the SSH Library; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#ifdef HAVE_PTHREAD
+
+#include <errno.h>
+#include <pthread.h>
+
+/** @brief Defines the needed callbacks for pthread. Use this if your
+ * OS supports libpthread and want to use it for threading.
+ * @code
+ * #include <libssh/callbacks.h>
+ * #include <errno.h>
+ * #include <pthread.h>
+ * SSH_THREADS_PTHREAD(ssh_pthread_callbacks);
+ * int main(){
+ * ssh_init_set_threads_callbacks(&ssh_pthread_callbacks);
+ * ssh_init();
+ * ...
+ * }
+ * @endcode
+ * @param name name of the structure to be declared, containing the
+ * 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 \
+}
+
+SSH_THREADS_PTHREAD(ssh_pthread_user_callbacks);
+#endif /* HAVE_PTHREAD */