1
1

Removed the global poll ctx in fav. of /session ctx

Этот коммит содержится в:
Aris Adamantiadis 2010-10-12 17:57:15 +02:00
родитель 7b1359042c
Коммит 4f8907a524
5 изменённых файлов: 21 добавлений и 35 удалений

Просмотреть файл

@ -153,8 +153,6 @@ int ssh_poll_ctx_add(ssh_poll_ctx ctx, ssh_poll_handle p);
int ssh_poll_ctx_add_socket (ssh_poll_ctx ctx, struct ssh_socket_struct *s); int ssh_poll_ctx_add_socket (ssh_poll_ctx ctx, struct ssh_socket_struct *s);
void ssh_poll_ctx_remove(ssh_poll_ctx ctx, ssh_poll_handle p); void ssh_poll_ctx_remove(ssh_poll_ctx ctx, ssh_poll_handle p);
int ssh_poll_ctx_dopoll(ssh_poll_ctx ctx, int timeout); int ssh_poll_ctx_dopoll(ssh_poll_ctx ctx, int timeout);
ssh_poll_ctx ssh_get_global_poll_ctx(ssh_session session); ssh_poll_ctx ssh_poll_get_default_ctx(ssh_session session);
void ssh_free_global_poll_ctx(void);
#endif /* POLL_H_ */ #endif /* POLL_H_ */

Просмотреть файл

@ -26,7 +26,7 @@
#include "libssh/pcap.h" #include "libssh/pcap.h"
#include "libssh/auth.h" #include "libssh/auth.h"
#include "libssh/channels.h" #include "libssh/channels.h"
#include "libssh/poll.h"
typedef struct ssh_kbdint_struct* ssh_kbdint; typedef struct ssh_kbdint_struct* ssh_kbdint;
/* These are the different states a SSH session can be into its life */ /* These are the different states a SSH session can be into its life */
@ -125,6 +125,7 @@ struct ssh_session_struct {
struct ssh_packet_callbacks_struct default_packet_callbacks; struct ssh_packet_callbacks_struct default_packet_callbacks;
struct ssh_list *packet_callbacks; struct ssh_list *packet_callbacks;
struct ssh_socket_callbacks_struct socket_callbacks; struct ssh_socket_callbacks_struct socket_callbacks;
ssh_poll_ctx default_poll_ctx;
/* options */ /* options */
#ifdef WITH_PCAP #ifdef WITH_PCAP
ssh_pcap_context pcap_ctx; /* pcap debugging context */ ssh_pcap_context pcap_ctx; /* pcap debugging context */

Просмотреть файл

@ -74,7 +74,6 @@ int ssh_init(void) {
*/ */
int ssh_finalize(void) { int ssh_finalize(void) {
ssh_threads_finalize(); ssh_threads_finalize();
ssh_free_global_poll_ctx();
ssh_regex_finalize(); ssh_regex_finalize();
ssh_crypto_finalize(); ssh_crypto_finalize();
ssh_socket_cleanup(); ssh_socket_cleanup();

Просмотреть файл

@ -33,6 +33,7 @@
#include "libssh/libssh.h" #include "libssh/libssh.h"
#include "libssh/poll.h" #include "libssh/poll.h"
#include "libssh/socket.h" #include "libssh/socket.h"
#include "libssh/session.h"
#ifndef SSH_POLL_CTX_CHUNK #ifndef SSH_POLL_CTX_CHUNK
#define SSH_POLL_CTX_CHUNK 5 #define SSH_POLL_CTX_CHUNK 5
@ -44,7 +45,7 @@
* *
* Add a generic way to handle sockets asynchronously. * Add a generic way to handle sockets asynchronously.
* *
* It's based on poll objects, each of which store a socket, it's events and a * It's based on poll objects, each of which store a socket, its events and a
* callback, which gets called whenever an event is set. The poll objects are * callback, which gets called whenever an event is set. The poll objects are
* attached to a poll context, which should be allocated on per thread basis. * attached to a poll context, which should be allocated on per thread basis.
* *
@ -55,9 +56,6 @@
* @{ * @{
*/ */
/** global poll context used for blocking operations */
static ssh_poll_ctx global_poll_ctx;
struct ssh_poll_handle_struct { struct ssh_poll_handle_struct {
ssh_poll_ctx ctx; ssh_poll_ctx ctx;
union { union {
@ -659,32 +657,19 @@ int ssh_poll_ctx_dopoll(ssh_poll_ctx ctx, int timeout) {
return rc; return rc;
} }
/** @internal /**
* @brief returns a pointer to the global poll context. * @internal
* Allocates it if it does not exist. * @brief gets the default poll structure for the current session,
* @param session an optional session handler, used to store the error * when used in blocking mode.
* message if needed. * @param session SSH session
* @returns pointer to the global poll context. * @returns the default ssh_poll_ctx
*/ */
ssh_poll_ctx ssh_get_global_poll_ctx(ssh_session session){ ssh_poll_ctx ssh_poll_get_default_ctx(ssh_session session){
if(global_poll_ctx != NULL) if(session->default_poll_ctx != NULL)
return global_poll_ctx; return session->default_poll_ctx;
global_poll_ctx=ssh_poll_ctx_new(5); /* 2 is enough for the default one */
if(global_poll_ctx == NULL && session != NULL){ session->default_poll_ctx = ssh_poll_ctx_new(2);
ssh_set_error_oom(session); return session->default_poll_ctx;
return NULL;
}
return global_poll_ctx;
}
/** @internal
* @brief Deallocate the global poll context
*/
void ssh_free_global_poll_ctx(){
if(global_poll_ctx != NULL){
ssh_poll_ctx_free(global_poll_ctx);
global_poll_ctx=NULL;
}
} }
/** @} */ /** @} */

Просмотреть файл

@ -178,6 +178,9 @@ void ssh_free(ssh_session session) {
crypto_free(session->current_crypto); crypto_free(session->current_crypto);
crypto_free(session->next_crypto); crypto_free(session->next_crypto);
ssh_socket_free(session->socket); ssh_socket_free(session->socket);
if(session->default_poll_ctx){
ssh_poll_ctx_free(session->default_poll_ctx);
}
/* delete all channels */ /* delete all channels */
while (session->channels) { while (session->channels) {
ssh_channel_free(session->channels); ssh_channel_free(session->channels);
@ -365,7 +368,7 @@ int ssh_handle_packets(ssh_session session, int timeout) {
ssh_poll_add_events(spoll_in, POLLIN | POLLERR); ssh_poll_add_events(spoll_in, POLLIN | POLLERR);
ctx=ssh_poll_get_ctx(spoll_in); ctx=ssh_poll_get_ctx(spoll_in);
if(ctx==NULL){ if(ctx==NULL){
ctx=ssh_get_global_poll_ctx(session); ctx=ssh_poll_get_default_ctx(session);
ssh_poll_ctx_add(ctx,spoll_in); ssh_poll_ctx_add(ctx,spoll_in);
if(spoll_in != spoll_out) if(spoll_in != spoll_out)
ssh_poll_ctx_add(ctx,spoll_out); ssh_poll_ctx_add(ctx,spoll_out);