Module: sems
Branch: master
Commit: 16856ff909de2ccebd08c6cba24643d0806e4f76
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=16856ff909de2ccebd08c6cba24643d0806e4f76

Author: Stefan Sayer <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Sun Apr 15 21:02:51 2012 +0200

DSM: functions for tracking/garbage collecting avar objects

---

 apps/dsm/DSMCoreModule.cpp |   50 ++++++++++++++++++++++++++++++++++++++++++++
 apps/dsm/DSMCoreModule.h   |    4 +++
 doc/dsm/dsm_syntax.txt     |    5 ++++
 3 files changed, 59 insertions(+), 0 deletions(-)

diff --git a/apps/dsm/DSMCoreModule.cpp b/apps/dsm/DSMCoreModule.cpp
index c252086..77ac574 100644
--- a/apps/dsm/DSMCoreModule.cpp
+++ b/apps/dsm/DSMCoreModule.cpp
@@ -130,6 +130,10 @@ DSMAction* DSMCoreModule::getAction(const string& 
from_str) {
   DEF_CMD("B2B.clearHeaders", SCB2BClearHeadersAction);
   DEF_CMD("B2B.setHeaders", SCB2BSetHeadersAction);
 
+  DEF_CMD("trackObject", SCTrackObjectAction);
+  DEF_CMD("releaseObject", SCReleaseObjectAction);
+  DEF_CMD("freeObject", SCFreeObjectAction);
+
   return NULL;
 }
 
@@ -1395,3 +1399,49 @@ EXEC_ACTION_START(SCCreateSystemDSMAction) {
   
 } EXEC_ACTION_END;
 
+DSMDisposable* getObjectFromVariable(DSMSession* sc_sess, const string& 
var_name) {
+  AVarMapT::iterator it = sc_sess->avar.find(var_name);
+  if (it == sc_sess->avar.end()) {
+    DBG("object '%s' not found\n", var_name.c_str());
+    sc_sess->SET_ERRNO(DSM_ERRNO_UNKNOWN_ARG);
+    sc_sess->SET_STRERROR("object '"+var_name+"' not found\n");
+    return NULL;
+  }
+
+  DSMDisposable* disp = dynamic_cast<DSMDisposable*>(it->second.asObject());
+  if (NULL == disp) {
+    DBG("object '%s' is not a DSMDisposable\n", var_name.c_str());
+    sc_sess->SET_ERRNO(DSM_ERRNO_UNKNOWN_ARG);
+    sc_sess->SET_STRERROR("object '"+var_name+"' is not a DSMDisposable\n");
+    return NULL;
+  }
+  return disp;
+}
+
+EXEC_ACTION_START(SCTrackObjectAction) {
+  string var_name = resolveVars(arg, sess, sc_sess, event_params);
+  DSMDisposable* disp = getObjectFromVariable(sc_sess, var_name);
+  if (NULL == disp) {
+    EXEC_ACTION_STOP;
+  }
+  sc_sess->transferOwnership(disp);
+} EXEC_ACTION_END;
+
+EXEC_ACTION_START(SCReleaseObjectAction) {
+  string var_name = resolveVars(arg, sess, sc_sess, event_params);
+  DSMDisposable* disp = getObjectFromVariable(sc_sess, var_name);
+  if (NULL == disp) {
+    EXEC_ACTION_STOP;
+  }
+  sc_sess->releaseOwnership(disp);
+} EXEC_ACTION_END;
+
+EXEC_ACTION_START(SCFreeObjectAction) {
+  string var_name = resolveVars(arg, sess, sc_sess, event_params);
+  DSMDisposable* disp = getObjectFromVariable(sc_sess, var_name);
+  if (NULL == disp) {
+    EXEC_ACTION_STOP;
+  }
+  delete disp;
+  sc_sess->avar.erase(var_name);
+} EXEC_ACTION_END;
diff --git a/apps/dsm/DSMCoreModule.h b/apps/dsm/DSMCoreModule.h
index 9c1b242..d81d413 100644
--- a/apps/dsm/DSMCoreModule.h
+++ b/apps/dsm/DSMCoreModule.h
@@ -121,6 +121,10 @@ DEF_ACTION_1P(SCUnregisterEventQueueAction);
 
 DEF_ACTION_2P(SCCreateSystemDSMAction);
 
+DEF_ACTION_1P(SCTrackObjectAction);
+DEF_ACTION_1P(SCReleaseObjectAction);
+DEF_ACTION_1P(SCFreeObjectAction);
+
 class SCDIAction                                       
 : public DSMAction {
   vector<string> params;
diff --git a/doc/dsm/dsm_syntax.txt b/doc/dsm/dsm_syntax.txt
index f56707f..c3ae798 100644
--- a/doc/dsm/dsm_syntax.txt
+++ b/doc/dsm/dsm_syntax.txt
@@ -283,6 +283,11 @@ B2B call control
   unregisterEventQueue(queue_name)
     unregister events queue queue_name
 
+ Garbage collector:
+  trackObject(varname)    - track object referenced with varname, i.e. enable 
garbage
+                            collection with the current call/systemDSM
+  releaseObject(varname)  - release object referenced with varname from 
garbage collector
+
 Conditions
 ==========
  

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to