[reSIProcate] dum shutdown issues (IMPORTANT)
Jason Fischl
jason at purplecomm.com
Mon Nov 1 16:18:21 CST 2004
An additional change to the DialogUsageManager interface:
If you are not running a separate StackThread inside of dum the
interface is unchanged. If you want a separate StackThread, call
DialogUsageManager::run() to start the thread and then periodically call
DialogUsageManager::process() from your application's thread to handle
dum events. If process() returns true, an event was handled.
// Runs the SipStack in its own StackThread. call process() from
the application
void run();
// Call this version of process if you are running the sipstack in
its own
// thread. you must call run() before calling process()
bool process();
// Call this version of process if you want to run the stack in the
// application's thread
void process(FdSet& fdset);
Jason Fischl wrote:
> Someof the changes I've made to dum as part of my shutdown-related
> changes:
>
> added a pure virtual BaseUsage::end() so the HandleManager can end any
> usages that are still kicking around. Note that end() is now void and
> does not return the SipMessage&. This necessitated a number of changes
> to the derived Usage code. It will also require some minor changes to
> application code.
>
> Jason
>
>
>
> Jason Fischl wrote:
>
>> 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);
>
>
>
>
> _______________________________________________
> resiprocate-devel mailing list
> resiprocate-devel at list.sipfoundry.org
> https://list.sipfoundry.org/mailman/listinfo/resiprocate-devel
More information about the resiprocate-devel
mailing list