Ross,
We are wanting to know when a session is cleaned up. I found the livenessTimoutTask is called when the reclaim timer expires, but I can not get to it from a sub-class. I also see the new noteLiveness() override in the ServerMediaSession. Instead of me tracking my own liveness, I added an livenessTimeouTask() to the ServerMediaSession (just like the noteLiveness) so I can be informed of the session that was cleaned up. So in the GenericMediaServer I added a call to the livenesstimeoutTask() in the ServerMediaSession (just like you did for noteLiveness). I pass the session id and streamname. Is there a different way to do this? If not would it be possible to get this in to future source? Here is my patch: diff -r 9e993be31201 liveMedia/GenericMediaServer.cpp --- a/liveMedia/GenericMediaServer.cpp Wed Aug 17 13:52:57 2016 -0600 +++ b/liveMedia/GenericMediaServer.cpp Fri Aug 19 11:26:39 2016 -0600 @@ -302,12 +302,17 @@ void GenericMediaServer::ClientSession::livenessTimeoutTask(ClientSession* clientSession) { // If this gets called, the client session is assumed to have timed out, so delete it: -#ifdef DEBUG char const* streamName = (clientSession->fOurServerMediaSession == NULL) ? "???" : clientSession->fOurServerMediaSession->streamName(); +#ifdef DEBUG fprintf(stderr, "Client session (id \"%08X\", stream name \"%s\") has timed out (due to inactivity)\n", clientSession->fOurSessionId, streamName); #endif + // If we have a media session we can call the livenessTimeoutTask for that media session + // This is similar to the noteLiveness() + if (clientSession->fOurServerMediaSession != NULL) { + clientSession->fOurServerMediaSession->livenessTimeoutTask(clientSession->fOurSessionId, streamName); + } delete clientSession; } diff -r 9e993be31201 liveMedia/ServerMediaSession.cpp --- a/liveMedia/ServerMediaSession.cpp Wed Aug 17 13:52:57 2016 -0600 +++ b/liveMedia/ServerMediaSession.cpp Fri Aug 19 11:26:39 2016 -0600 @@ -198,6 +198,11 @@ // default implementation: do nothing } +void ServerMediaSession::livenessTimeoutTask(u_int32_t sessionId, char const *streamName) { + // default implementation: do nothing +} + + void ServerMediaSession::deleteAllSubsessions() { Medium::close(fSubsessionsHead); fSubsessionsHead = fSubsessionsTail = NULL; diff -r 9e993be31201 liveMedia/include/ServerMediaSession.hh --- a/liveMedia/include/ServerMediaSession.hh Wed Aug 17 13:52:57 2016 -0600 +++ b/liveMedia/include/ServerMediaSession.hh Fri Aug 19 11:26:39 2016 -0600 @@ -62,6 +62,11 @@ // The default implementation does nothing, but subclasses can redefine this - e.g., if you // want to remove long-unused "ServerMediaSession"s from the server. + virtual void livenessTimeoutTask(u_int32_t sessionId, char const *streamName); + // called when a client is cleaned up due to the timeout expiring + // The default implementation does nothing, but subclasses can redefine this - e.g., if you + // want to know if long-unused "ServerMediaSession"s is removed sub-class this method. + unsigned referenceCount() const { return fReferenceCount; } void incrementReferenceCount() { ++fReferenceCount; } void decrementReferenceCount() { if (fReferenceCount > 0) --fReferenceCount; } Thanks, Craig
_______________________________________________ live-devel mailing list live-devel@lists.live555.com http://lists.live555.com/mailman/listinfo/live-devel