mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-08-05 20:55:46 +03:00
Implemented the noop and native pointers
This commit is contained in:
@@ -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
|
||||
|
@@ -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 */
|
||||
|
@@ -33,7 +33,6 @@ set(LIBSSH_THREADS_LINK_LIBRARIES
|
||||
)
|
||||
|
||||
set(libssh_threads_SRCS
|
||||
native.c
|
||||
)
|
||||
|
||||
# build and link pthread
|
||||
|
@@ -1,4 +0,0 @@
|
||||
#include "config.h"
|
||||
#include <libssh/callbacks.h>
|
||||
|
||||
struct ssh_threads_callbacks_struct ssh_pthread_callbacks;
|
@@ -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;
|
||||
}
|
||||
|
||||
SSH_THREADS_PTHREAD(ssh_pthread_user_callbacks);
|
||||
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();
|
||||
}
|
||||
|
||||
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 */
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user