more ref checking

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10375 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale
2008-11-13 17:40:25 +00:00
parent f886471991
commit 1d74ab745b
11 changed files with 34 additions and 21 deletions
+20 -7
View File
@@ -172,6 +172,7 @@ struct switch_endpoint_interface {
void *private_info;
switch_thread_rwlock_t *rwlock;
int refs;
/* parent */
switch_loadable_module_interface_t *parent;
@@ -226,6 +227,7 @@ struct switch_timer_interface {
/*! function to deallocate the timer */
switch_status_t (*timer_destroy) (switch_timer_t *);
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_timer_interface *next;
};
@@ -237,6 +239,7 @@ struct switch_dialplan_interface {
/*! the function to read an extension and set a channels dialpan */
switch_dialplan_hunt_function_t hunt_function;
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_dialplan_interface *next;
};
@@ -262,6 +265,7 @@ struct switch_file_interface {
/*! list of supported file extensions */
char **extens;
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_file_interface *next;
};
@@ -269,7 +273,7 @@ struct switch_file_interface {
/*! an abstract representation of a file handle (some parameters based on compat with libsndfile) */
struct switch_file_handle {
/*! the interface of the module that implemented the current file type */
const switch_file_interface_t *file_interface;
switch_file_interface_t *file_interface;
/*! flags to control behaviour */
uint32_t flags;
/*! a file descriptor if neceessary */
@@ -340,6 +344,7 @@ struct switch_asr_interface {
/*! function to read results from the ASR */
switch_status_t (*asr_get_results) (switch_asr_handle_t *ah, char **xmlstr, switch_asr_flag_t *flags);
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_asr_interface *next;
};
@@ -347,7 +352,7 @@ struct switch_asr_interface {
/*! an abstract representation of an asr speech interface. */
struct switch_asr_handle {
/*! the interface of the module that implemented the current speech interface */
const switch_asr_interface_t *asr_interface;
switch_asr_interface_t *asr_interface;
/*! flags to control behaviour */
uint32_t flags;
/*! The Name */
@@ -382,6 +387,7 @@ struct switch_speech_interface {
void (*speech_numeric_param_tts) (switch_speech_handle_t *sh, char *param, int val);
void (*speech_float_param_tts) (switch_speech_handle_t *sh, char *param, double val);
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_speech_interface *next;
};
@@ -390,7 +396,7 @@ struct switch_speech_interface {
/*! an abstract representation of a asr/tts speech interface. */
struct switch_speech_handle {
/*! the interface of the module that implemented the current speech interface */
const switch_speech_interface_t *speech_interface;
switch_speech_interface_t *speech_interface;
/*! flags to control behaviour */
uint32_t flags;
/*! The Name */
@@ -416,6 +422,7 @@ struct switch_say_interface {
/*! function to pass down to the module */
switch_say_callback_t say_function;
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_say_interface *next;
};
@@ -427,6 +434,7 @@ struct switch_chat_interface {
/*! function to open the directory interface */
switch_status_t (*chat_send) (char *proto, char *from, char *to, char *subject, char *body, char *hint);
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_chat_interface *next;
};
@@ -438,6 +446,7 @@ struct switch_management_interface {
/*! function to open the directory interface */
switch_status_t (*management_function) (char *relative_oid, switch_management_action_t action, char *data, switch_size_t datalen);
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_management_interface *next;
};
@@ -457,6 +466,7 @@ struct switch_directory_interface {
/*! function to advance to the next name/value pair in the current record */
switch_status_t (*directory_next_pair) (switch_directory_handle_t *dh, char **var, char **val);
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_directory_interface *next;
};
@@ -464,7 +474,7 @@ struct switch_directory_interface {
/*! an abstract representation of a directory interface. */
struct switch_directory_handle {
/*! the interface of the module that implemented the current directory interface */
const switch_directory_interface_t *directory_interface;
switch_directory_interface_t *directory_interface;
/*! flags to control behaviour */
uint32_t flags;
@@ -515,7 +525,7 @@ struct switch_codec_settings {
/*! an abstract handle to a codec module */
struct switch_codec {
/*! the codec interface table this handle uses */
const switch_codec_interface_t *codec_interface;
switch_codec_interface_t *codec_interface;
/*! the specific implementation of the above codec */
const switch_codec_implementation_t *implementation;
/*! fmtp line from remote sdp */
@@ -582,6 +592,7 @@ struct switch_codec_interface {
switch_codec_implementation_t *implementations;
uint32_t codec_id;
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_codec_interface *next;
};
@@ -601,6 +612,7 @@ struct switch_application_interface {
/*! flags to control behaviour */
uint32_t flags;
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_application_interface *next;
};
@@ -616,12 +628,13 @@ struct switch_api_interface {
/*! an example of the api syntax */
const char *syntax;
switch_thread_rwlock_t *rwlock;
int refs;
switch_loadable_module_interface_t *parent;
struct switch_api_interface *next;
};
#define PROTECT_INTERFACE(_it) switch_thread_rwlock_rdlock(_it->parent->rwlock); switch_thread_rwlock_rdlock(_it->rwlock)
#define UNPROTECT_INTERFACE(_it) switch_thread_rwlock_unlock(_it->rwlock); switch_thread_rwlock_unlock(_it->parent->rwlock); _it = NULL
#define PROTECT_INTERFACE(_it) if (!_it->refs) {switch_thread_rwlock_rdlock(_it->parent->rwlock); switch_thread_rwlock_rdlock(_it->rwlock); _it->refs++; _it->parent->refs++;}
#define UNPROTECT_INTERFACE(_it) if (_it->refs) {switch_thread_rwlock_unlock(_it->rwlock); switch_thread_rwlock_unlock(_it->parent->rwlock); _it->refs--; _it->parent->refs--; _it = NULL;}
SWITCH_END_EXTERN_C
#endif