diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-09-03 12:03:04 +0200 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-09-03 12:03:04 +0200 |
commit | 285388409f1e1220514cb161a2c17018c3d3de51 (patch) | |
tree | 927d12610b94314857b5f2326fb40e415e79f7ad /include/libssh | |
parent | aff5786ed30966dc0a00ffee3c56a9d1b5a08a7d (diff) | |
download | libssh-285388409f1e1220514cb161a2c17018c3d3de51.tar.gz libssh-285388409f1e1220514cb161a2c17018c3d3de51.tar.xz libssh-285388409f1e1220514cb161a2c17018c3d3de51.zip |
Made pthread threading a user macro
Diffstat (limited to 'include/libssh')
-rw-r--r-- | include/libssh/callbacks.h | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/include/libssh/callbacks.h b/include/libssh/callbacks.h index e66fb64e..f3e8f006 100644 --- a/include/libssh/callbacks.h +++ b/include/libssh/callbacks.h @@ -250,6 +250,10 @@ LIBSSH_API int ssh_set_callbacks(ssh_session session, ssh_callbacks cb); /** @} */ +/** @group libssh_threads + * @{ + */ + typedef int (*ssh_thread_callback) (void **lock); typedef unsigned long (*ssh_thread_id_callback) (void); struct ssh_threads_callbacks_struct { @@ -260,9 +264,74 @@ struct ssh_threads_callbacks_struct { ssh_thread_id_callback thread_id; }; -LIBSSH_API int ssh_init_set_threads_callbacks(struct ssh_threads_callbacks_struct +/** + * @brief sets the thread callbacks necessary if your program is using + * libssh in a multithreaded fashion. This function must be called first, + * outside of any threading context (in your main() for instance), before + * ssh_init(). + * @param cb pointer to a ssh_threads_callbacks_struct structure, which contains + * the different callbacks to be set. + * @see ssh_threads_callbacks_struct + * @see SSH_THREADS_PTHREAD + */ +LIBSSH_API int ssh_threads_set_callbacks(struct ssh_threads_callbacks_struct *cb); +/** @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 \ +} + +/** @} */ #ifdef __cplusplus } #endif |