#include "config.h"
#include "libssh/threads.h"
#include <libssh/callbacks.h>
#include <errno.h>
#include <stdlib.h>
#include <pthread.h>
static int ssh_pthread_mutex_init (void **mutex)
{
int rc = 0;
if (mutex == NULL) {
return EINVAL;
}
*mutex = malloc(sizeof(pthread_mutex_t));
if (*mutex == NULL) {
return ENOMEM;
}
rc = pthread_mutex_init ((pthread_mutex_t *)*mutex, NULL);
if (rc){
free (*mutex);
*mutex = NULL;
}
return rc;
}
static int ssh_pthread_mutex_destroy (void **mutex)
{
int rc = 0;
if (mutex == NULL) {
return EINVAL;
}
rc = pthread_mutex_destroy ((pthread_mutex_t *)*mutex);
free (*mutex);
*mutex = NULL;
return rc;
}
static int ssh_pthread_mutex_lock (void **mutex)
{
return pthread_mutex_lock((pthread_mutex_t *)*mutex);
}
static int ssh_pthread_mutex_unlock (void **mutex)
{
return pthread_mutex_unlock((pthread_mutex_t *)*mutex);
}
static unsigned long ssh_pthread_thread_id (void)
{
#if defined(_WIN32) && !defined(__WINPTHREADS_VERSION)
return (unsigned long) pthread_self().p;
#else
return (unsigned long) pthread_self();
#endif
}
static struct ssh_threads_callbacks_struct ssh_threads_pthread =
{
.type = "threads_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
};
#if (HAVE_PTHREAD)
void ssh_mutex_lock(SSH_MUTEX *mutex)
{
int rc;
if (mutex == NULL) {
exit(EINVAL);
}
rc = pthread_mutex_lock(mutex);
if (rc) {
exit(rc);
}
}
void ssh_mutex_unlock(SSH_MUTEX *mutex)
{
int rc;
if (mutex == NULL) {
exit(EINVAL);
}
rc = pthread_mutex_unlock(mutex);
if (rc) {
exit(rc);
}
}
struct ssh_threads_callbacks_struct *ssh_threads_get_default(void)
{
return &ssh_threads_pthread;
}
#endif
struct ssh_threads_callbacks_struct *ssh_threads_get_pthread(void)
{
return &ssh_threads_pthread;
}