< Previous by Date Date Index Next by Date >
  Thread Index Next in Thread >

[reSIProcate] dum shutdown issues (IMPORTANT)


Hi all,

After fighting with shutdown for an entire day, I'd like to propose some changes. Here are the current issues:
Shutting down a useragent requires us to:
- async end all active usages
- async shutdown call to DialogUsageManager
- async shutdown call to SipStack
- async end the StackThread (if we are using one)

The application is required to somehow coordinate all of these requests to shutdown and wait for appropriate callbacks before moving on to the next one.
There is no way to request dum to shutdown all usages. The order of 
usage termination may be important for some applications. For instance, 
some applications may require the registrations to be ended last since 
they may have GRUUs bound to them. In other cases, the order of 
unPUBLISH vs unSUBSCRIBE may also be important.
In the current implementation, if the application calls shutdown and 
there are active usages, dum will wait for those usages to all end and 
will then call the handler onDumCanBeDeleted. However, if there are 
active ClientSubscriptions and dum never receives  NOTIFY messages with 
SubscriptionState == Terminated, dum will never exit. This can happen if 
the presence server crashes.
Proposed changes:
- SipStack should be owned by DialogUsageManager. Is there really any case where the application would want to reuse a SipStack object after shutting down the dum? - Application should be able to shutdown without having to explicitly end all active Usages. Either dum should end the usages or it should be able to shutdown without ending them. Either way, it should not leak memory.
Current Interface:

void
DialogUsageManager::shutdown(DumShutdownHandler* handler);

virtual void
DumShutdownHandler::onDumCanBeDeleted()=0;


Proposed Interface:

// In all cases, no leaks (obviously :)

// End usages in the following order: ServerInviteSession, ServerSubscription, ClientInviteSession, ClientSubscription,
// ClientPagerMessage, ClientPublication, ClientRegistration
// call DumShutdownHandler::onDumCanBeDeleted when all usages are ended, SipStack is ended and StackThread is shutdown // After giveUpSeconds, exit regardless. If giveUpSeconds == 0, wait indefinitely void DialogUsageManager::shutdown(DumShutdownHandler* handler, unsigned long giveUpSeconds=0);
// call DumShutdownHandler::onDumCanBeDeleted when all usages are ended, 
SipStack is ended and StackThread is shutdown
// After giveUpSeconds, exit regardless. If giveUpSeconds == 0,  wait 
indefinitely
void DialogUsageManager::shutdownIfNoUsages(DumShutdownHandler* handler, 
unsigned long giveUpSeconds=0);
// Shutdown immediately - ignore existing usages.
// call DumShutdownHandler::onDumCanBeDeleted when all usages are ended, SipStack is ended and StackThread is shutdown
void DialogUsageManager::forceShutdown(DumShutdownHandler* handler);