DSM: functions for tracking/garbage collecting avar objects

sayer/1.4-spce2.6
Stefan Sayer 14 years ago
parent e9873524a7
commit ec95bd97ae

@ -123,6 +123,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;
}
@ -1333,3 +1337,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;

@ -113,6 +113,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;

@ -267,6 +267,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
==========

Loading…
Cancel
Save