1- #include < memory>
1+ #include < memory>
22#include < crtdbg.h>
33#include < unordered_map>
44#include " ../PresentMonMiddleware/ConcreteMiddleware.h"
@@ -32,6 +32,16 @@ Middleware& LookupMiddleware_(const void* handle)
3232 throw util::Except<ipc::PmStatusError>(PM_STATUS_SESSION_NOT_OPEN);
3333 }
3434}
35+ Middleware& LookupMiddlewareCheckDropped_ (const void * handle)
36+ {
37+ auto & mid = LookupMiddleware_ (handle);
38+ if (!mid.ServiceConnected ()) {
39+ pmlog_error (" Service dropped; proactive abort" )
40+ .code (PM_STATUS_SESSION_NOT_OPEN)
41+ .raise <ipc::PmStatusError>();
42+ }
43+ return mid;
44+ }
3545
3646void DestroyMiddleware_ (PM_SESSION_HANDLE handle)
3747{
@@ -193,7 +203,7 @@ PRESENTMON_API2_EXPORT PM_STATUS pmGetIntrospectionRoot(PM_SESSION_HANDLE handle
193203 pmlog_error (" null outptr for introspection interface" ).diag ();
194204 return PM_STATUS_BAD_ARGUMENT;
195205 }
196- const auto pIntro = LookupMiddleware_ (handle).GetIntrospectionData ();
206+ const auto pIntro = LookupMiddlewareCheckDropped_ (handle).GetIntrospectionData ();
197207 // we don't need the middleware to free introspection data
198208 // detaching like this (eliding handle mapping) will allow introspection data
199209 // to not obstruct cleanup of middleware
@@ -267,7 +277,7 @@ PRESENTMON_API2_EXPORT PM_STATUS pmRegisterDynamicQuery(PM_SESSION_HANDLE sessio
267277 pmlog_error (" zero length query element array" ).diag ();
268278 return PM_STATUS_BAD_ARGUMENT;
269279 }
270- const auto queryHandle = LookupMiddleware_ (sessionHandle).RegisterDynamicQuery (
280+ const auto queryHandle = LookupMiddlewareCheckDropped_ (sessionHandle).RegisterDynamicQuery (
271281 {pElements, numElements}, windowSizeMs, metricOffsetMs);
272282 AddHandleMapping_ (sessionHandle, queryHandle);
273283 *pQueryHandle = queryHandle;
@@ -314,7 +324,7 @@ PRESENTMON_API2_EXPORT PM_STATUS pmPollDynamicQuery(PM_DYNAMIC_QUERY_HANDLE hand
314324 pmlog_error (" swap chain in count is zero" ).diag ();
315325 return PM_STATUS_BAD_ARGUMENT;
316326 }
317- LookupMiddleware_ (handle).PollDynamicQuery (handle, processId, pBlob, numSwapChains);
327+ LookupMiddlewareCheckDropped_ (handle).PollDynamicQuery (handle, processId, pBlob, numSwapChains);
318328 return PM_STATUS_SUCCESS;
319329 }
320330 catch (...) {
@@ -335,7 +345,7 @@ PRESENTMON_API2_EXPORT PM_STATUS pmPollStaticQuery(PM_SESSION_HANDLE sessionHand
335345 pmlog_error (" null ptr to blob" ).diag ();
336346 return PM_STATUS_BAD_ARGUMENT;
337347 }
338- LookupMiddleware_ (sessionHandle).PollStaticQuery (*pElement, processId, pBlob);
348+ LookupMiddlewareCheckDropped_ (sessionHandle).PollStaticQuery (*pElement, processId, pBlob);
339349 return PM_STATUS_SUCCESS;
340350 }
341351 catch (...) {
@@ -364,7 +374,7 @@ PRESENTMON_API2_EXPORT PM_STATUS pmRegisterFrameQuery(PM_SESSION_HANDLE sessionH
364374 pmlog_error (" zero blob size" ).diag ();
365375 return PM_STATUS_BAD_ARGUMENT;
366376 }
367- const auto queryHandle = LookupMiddleware_ (sessionHandle).RegisterFrameEventQuery ({ pElements, numElements }, *pBlobSize);
377+ const auto queryHandle = LookupMiddlewareCheckDropped_ (sessionHandle).RegisterFrameEventQuery ({ pElements, numElements }, *pBlobSize);
368378 AddHandleMapping_ (sessionHandle, queryHandle);
369379 *pQueryHandle = queryHandle;
370380 return PM_STATUS_SUCCESS;
@@ -387,7 +397,7 @@ PRESENTMON_API2_EXPORT PM_STATUS pmConsumeFrames(PM_FRAME_QUERY_HANDLE handle, u
387397 pmlog_error (" null frame count in-out ptr" ).diag ();
388398 return PM_STATUS_BAD_ARGUMENT;
389399 }
390- LookupMiddleware_ (handle).ConsumeFrameEvents (handle, processId, pBlob, *pNumFramesToRead);
400+ LookupMiddlewareCheckDropped_ (handle).ConsumeFrameEvents (handle, processId, pBlob, *pNumFramesToRead);
391401 return PM_STATUS_SUCCESS;
392402 }
393403 catch (...) {
@@ -431,7 +441,7 @@ PRESENTMON_API2_EXPORT PM_STATUS pmGetApiVersion(PM_VERSION* pVersion)
431441PRESENTMON_API2_EXPORT PM_STATUS pmStopPlayback_ (PM_SESSION_HANDLE handle)
432442{
433443 try {
434- auto & mid = LookupMiddleware_ (handle);
444+ auto & mid = LookupMiddlewareCheckDropped_ (handle);
435445 mid.StopPlayback ();
436446 return PM_STATUS_SUCCESS;
437447 }
@@ -446,7 +456,7 @@ PRESENTMON_API2_EXPORT PM_STATUS pmStartEtlLogging(PM_SESSION_HANDLE session, PM
446456 uint64_t reserved1, uint64_t reserved2)
447457{
448458 try {
449- auto & mid = LookupMiddleware_ (session);
459+ auto & mid = LookupMiddlewareCheckDropped_ (session);
450460 *pEtlHandle = mid.StartEtlLogging ();
451461 return PM_STATUS_SUCCESS;
452462 }
@@ -461,7 +471,7 @@ PRESENTMON_API2_EXPORT PM_STATUS pmFinishEtlLogging(PM_SESSION_HANDLE session, P
461471 char * pOutputFilePathBuffer, uint32_t bufferSize)
462472{
463473 try {
464- auto & mid = LookupMiddleware_ (session);
474+ auto & mid = LookupMiddlewareCheckDropped_ (session);
465475 const auto path = mid.FinishEtlLogging (etlHandle);
466476 if (path.size () + 1 > bufferSize) {
467477 const auto code = PM_STATUS_INSUFFICIENT_BUFFER;
0 commit comments