[commit] r9797 - in freeswitch/trunk/src/mod/languages/mod_managed: . managed
Author: michaelgg Date: Thu Oct 2 14:59:09 2008 New Revision: 9797 Modified: freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.cpp freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.h freeswitch/trunk/src/mod/languages/mod_managed/managed/ManagedSession.cs freeswitch/trunk/src/mod/languages/mod_managed/mod_managed.cpp Log: P/Invoke should do all the work for us Modified: freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.cpp ============================================================================== --- freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.cpp (original) +++ freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.cpp Thu Oct 2 14:59:09 2008 @@ -74,9 +74,6 @@ // Don't let any callbacks use this CoreSession anymore switch_channel_set_private(channel, "CoreSession", NULL); } - // Free delegates - hangupDelegateHandle.Free(); - dtmfDelegateHandle.Free(); } bool ManagedSession::begin_allow_threads() @@ -91,22 +88,23 @@ void ManagedSession::check_hangup_hook() { - if (!hangupDelegateHandle.IsAllocated) { + if (!hangupDelegate) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "hangupDelegateHandle didn't get an object."); return; } - ((HangupDelegate^)hangupDelegateHandle.Target)(); + hangupDelegate(); } switch_status_t ManagedSession::run_dtmf_callback(void *input, switch_input_type_t itype) { - if (!dtmfDelegateHandle.IsAllocated) { + if (!dtmfDelegate) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "dtmfDelegateHandle didn't get an object."); return SWITCH_STATUS_FALSE;; } - char *result = ((InputDelegate^)dtmfDelegateHandle.Target)(input, itype); + char *result = dtmfDelegate(input, itype); switch_status_t status = process_callback_result(result); + Marshal::FreeHGlobal(IntPtr(result)); // I think this is right return status; } Modified: freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.h ============================================================================== --- freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.h (original) +++ freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_managed.h Thu Oct 2 14:59:09 2008 @@ -99,8 +99,8 @@ using namespace System::Reflection; using namespace System::Runtime::InteropServices; -delegate void HangupDelegate(void); -delegate char* InputDelegate(void* input, switch_input_type_t type); +typedef void (*hangupFunction)(void); +typedef char* (*inputFunction)(void*, switch_input_type_t); public ref class FreeSwitchManaged { @@ -130,8 +130,9 @@ virtual switch_status_t run_dtmf_callback(void *input, switch_input_type_t itype); #ifdef _MANAGED - GCHandle dtmfDelegateHandle; // GCHandle to the input delegate - GCHandle hangupDelegateHandle; // GCHandle to the hangup delegate + // P/Invoke function pointer to delegates + inputFunction dtmfDelegate; + hangupFunction hangupDelegate; #else guint32 dtmfDelegateHandle; // GCHandle to the input delegate guint32 hangupDelegateHandle; // GCHandle to the hangup delegate Modified: freeswitch/trunk/src/mod/languages/mod_managed/managed/ManagedSession.cs ============================================================================== --- freeswitch/trunk/src/mod/languages/mod_managed/managed/ManagedSession.cs (original) +++ freeswitch/trunk/src/mod/languages/mod_managed/managed/ManagedSession.cs Thu Oct 2 14:59:09 2008 @@ -47,8 +47,16 @@ /// <summary>Initializes the native ManagedSession. Must be called after Originate.</summary> public void Initialize() { + // P/Invoke generated function pointers stick around until the delegate is collected + // By sticking the delegates in fields, their lifetime won't be less than the session + // So we don't need to worry about GCHandles and all that.... + // Info here: http://blogs.msdn.com/cbrumme/archive/2003/05/06/51385.aspx + this._inputCallbackRef = inputCallback; + this._hangupCallback = hangupCallback; InitManagedSession(ManagedSession.getCPtr(this).Handle, inputCallback, hangupCallback); } + DtmfCallback _inputCallbackRef; + Action _hangupCallback; /// <summary>Function to execute when this session hangs up.</summary> public Action HangupFunction { get; set; } Modified: freeswitch/trunk/src/mod/languages/mod_managed/mod_managed.cpp ============================================================================== --- freeswitch/trunk/src/mod/languages/mod_managed/mod_managed.cpp (original) +++ freeswitch/trunk/src/mod/languages/mod_managed/mod_managed.cpp Thu Oct 2 14:59:09 2008 @@ -452,8 +452,7 @@ // Sets up delegates (and anything else needed) on the ManagedSession object // Called from ManagedSession.Initialize Managed -> this is Unmanaged code so all pointers are marshalled and prevented from GC // Exported method. - -SWITCH_MOD_DECLARE(void) InitManagedSession(ManagedSession *session, void *dtmfDelegate, void *hangupDelegate) +SWITCH_MOD_DECLARE(void) InitManagedSession(ManagedSession *session, inputFunction dtmfDelegate, hangupFunction hangupDelegate) { switch_assert(session); if (!session) { @@ -461,8 +460,8 @@ } session->setDTMFCallback(NULL, ""); session->setHangupHook(NULL); - session->dtmfDelegateHandle = GCHandle::Alloc(Marshal::GetDelegateForFunctionPointer(IntPtr(dtmfDelegate), InputDelegate::typeid)); - session->hangupDelegateHandle = GCHandle::Alloc(Marshal::GetDelegateForFunctionPointer(IntPtr(hangupDelegate), HangupDelegate::typeid)); + session->dtmfDelegate = dtmfDelegate; + session->hangupDelegate = hangupDelegate; } switch_status_t loadModDotnetManaged()
participants (1)
-
Freeswitch SVN