This reduces the risk for namespace collisions if two processes run the encoder simultaneously without address space layout randomization.
Showing the changes to codec/encoder/core/src/slice_multi_threading.cpp (1 of 2 files). Show all
Unified · Split
| @@ -43,6 +43,7 @@ · 42 unmodified lines | ||
| 43 | 43 | #include <assert.h> |
| 44 | 44 | #if !defined(_WIN32) |
| 45 | 45 | #include <semaphore.h> |
| 46 | +#include <unistd.h> | |
| 46 | 47 | #endif//!_WIN32 |
| 47 | 48 | #ifndef SEM_NAME_MAX |
| 48 | 49 | // length of semaphore name should be system constrained at least on mac 10.7 |
| @@ -317,6 +318,13 @@ int32_t RequestMtResource (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pCodingPara · 268 unmodified lines | ||
| 317 | 318 | "pThreadPEncCtx"); |
| 318 | 319 | WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pSmt->pThreadPEncCtx), FreeMemorySvc (ppCtx)) |
| 319 | 320 | |
| 321 | +#ifdef _WIN32 | |
| 322 | + // Dummy event namespace, the windows events don't actually use this | |
| 323 | + WelsSnprintf (pSmt->eventNamespace, sizeof(pSmt->eventNamespace), "%p", (void*) (*ppCtx)); | |
| 324 | +#else | |
| 325 | + WelsSnprintf (pSmt->eventNamespace, sizeof(pSmt->eventNamespace), "%p%x", (void*) (*ppCtx), getpid()); | |
| 326 | +#endif//!_WIN32 | |
| 327 | + | |
| 320 | 328 | iIdx = 0; |
| 321 | 329 | while (iIdx < iNumSpatialLayers) { |
| 322 | 330 | SSliceConfig* pMso = &pPara->sDependencyLayers[iIdx].sSliceCfg; |
| @@ -360,34 +368,34 @@ int32_t RequestMtResource (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pCodingPara · 37 unmodified lines | ||
| 360 | 368 | pSmt->pThreadHandles[iIdx] = 0; |
| 361 | 369 | |
| 362 | 370 | #ifdef _WIN32 |
| 363 | − WelsSnprintf (name, SEM_NAME_MAX, "fs%d%p", iIdx, (void*) (*ppCtx)); | |
| 371 | + WelsSnprintf (name, SEM_NAME_MAX, "fs%d%s", iIdx, pSmt->eventNamespace); | |
| 364 | 372 | err = WelsEventOpen (&pSmt->pFinSliceCodingEvent[iIdx], name); |
| 365 | 373 | #if defined(ENABLE_TRACE_MT) |
| 366 | 374 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pFinSliceCodingEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); |
| 367 | 375 | #endif |
| 368 | − WelsSnprintf (name, SEM_NAME_MAX, "ee%d%p", iIdx, (void*) (*ppCtx)); | |
| 376 | + WelsSnprintf (name, SEM_NAME_MAX, "ee%d%s", iIdx, pSmt->eventNamespace); | |
| 369 | 377 | err = WelsEventOpen (&pSmt->pExitEncodeEvent[iIdx], name); |
| 370 | 378 | #if defined(ENABLE_TRACE_MT) |
| 371 | 379 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pExitEncodeEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); |
| 372 | 380 | #endif |
| 373 | 381 | #endif//_WIN32 |
| 374 | 382 | // length of semaphore name should be system constrained at least on mac 10.7 |
| 375 | − WelsSnprintf (name, SEM_NAME_MAX, "ud%d%p", iIdx, (void*) (*ppCtx)); | |
| 383 | + WelsSnprintf (name, SEM_NAME_MAX, "ud%d%s", iIdx, pSmt->eventNamespace); | |
| 376 | 384 | err = WelsEventOpen (&pSmt->pUpdateMbListEvent[iIdx], name); |
| 377 | 385 | #if defined(ENABLE_TRACE_MT) |
| 378 | 386 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pUpdateMbListEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); |
| 379 | 387 | #endif |
| 380 | − WelsSnprintf (name, SEM_NAME_MAX, "fu%d%p", iIdx, (void*) (*ppCtx)); | |
| 388 | + WelsSnprintf (name, SEM_NAME_MAX, "fu%d%s", iIdx, pSmt->eventNamespace); | |
| 381 | 389 | err = WelsEventOpen (&pSmt->pFinUpdateMbListEvent[iIdx], name); |
| 382 | 390 | #if defined(ENABLE_TRACE_MT) |
| 383 | 391 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pFinUpdateMbListEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); |
| 384 | 392 | #endif |
| 385 | − WelsSnprintf (name, SEM_NAME_MAX, "sc%d%p", iIdx, (void*) (*ppCtx)); | |
| 393 | + WelsSnprintf (name, SEM_NAME_MAX, "sc%d%s", iIdx, pSmt->eventNamespace); | |
| 386 | 394 | err = WelsEventOpen (&pSmt->pSliceCodedEvent[iIdx], name); |
| 387 | 395 | #if defined(ENABLE_TRACE_MT) |
| 388 | 396 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pSliceCodedEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); |
| 389 | 397 | #endif |
| 390 | − WelsSnprintf (name, SEM_NAME_MAX, "rc%d%p", iIdx, (void*) (*ppCtx)); | |
| 398 | + WelsSnprintf (name, SEM_NAME_MAX, "rc%d%s", iIdx, pSmt->eventNamespace); | |
| 391 | 399 | err = WelsEventOpen (&pSmt->pReadySliceCodingEvent[iIdx], name); |
| 392 | 400 | #if defined(ENABLE_TRACE_MT) |
| 393 | 401 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pReadySliceCodingEvent%d = 0x%p named(%s) ret%d err%d\n", iIdx, |
| @@ -464,18 +472,18 @@ void ReleaseMtResource (sWelsEncCtx** ppCtx) { · 70 unmodified lines | ||
| 464 | 472 | if (pSmt->pThreadHandles != NULL && pSmt->pThreadHandles[iIdx] != NULL) |
| 465 | 473 | WelsThreadDestroy (&pSmt->pThreadHandles[iIdx]); |
| 466 | 474 | |
| 467 | − WelsSnprintf (ename, SEM_NAME_MAX, "fs%d%p", iIdx, (void*) (*ppCtx)); | |
| 475 | + WelsSnprintf (ename, SEM_NAME_MAX, "fs%d%s", iIdx, pSmt->eventNamespace); | |
| 468 | 476 | WelsEventClose (&pSmt->pFinSliceCodingEvent[iIdx], ename); |
| 469 | − WelsSnprintf (ename, SEM_NAME_MAX, "ee%d%p", iIdx, (void*) (*ppCtx)); | |
| 477 | + WelsSnprintf (ename, SEM_NAME_MAX, "ee%d%s", iIdx, pSmt->eventNamespace); | |
| 470 | 478 | WelsEventClose (&pSmt->pExitEncodeEvent[iIdx], ename); |
| 471 | 479 | #endif//_WIN32 |
| 472 | − WelsSnprintf (ename, SEM_NAME_MAX, "sc%d%p", iIdx, (void*) (*ppCtx)); | |
| 480 | + WelsSnprintf (ename, SEM_NAME_MAX, "sc%d%s", iIdx, pSmt->eventNamespace); | |
| 473 | 481 | WelsEventClose (&pSmt->pSliceCodedEvent[iIdx], ename); |
| 474 | − WelsSnprintf (ename, SEM_NAME_MAX, "rc%d%p", iIdx, (void*) (*ppCtx)); | |
| 482 | + WelsSnprintf (ename, SEM_NAME_MAX, "rc%d%s", iIdx, pSmt->eventNamespace); | |
| 475 | 483 | WelsEventClose (&pSmt->pReadySliceCodingEvent[iIdx], ename); |
| 476 | − WelsSnprintf (ename, SEM_NAME_MAX, "ud%d%p", iIdx, (void*) (*ppCtx)); | |
| 484 | + WelsSnprintf (ename, SEM_NAME_MAX, "ud%d%s", iIdx, pSmt->eventNamespace); | |
| 477 | 485 | WelsEventClose (&pSmt->pUpdateMbListEvent[iIdx], ename); |
| 478 | − WelsSnprintf (ename, SEM_NAME_MAX, "fu%d%p", iIdx, (void*) (*ppCtx)); | |
| 486 | + WelsSnprintf (ename, SEM_NAME_MAX, "fu%d%s", iIdx, pSmt->eventNamespace); | |
| 479 | 487 | WelsEventClose (&pSmt->pFinUpdateMbListEvent[iIdx], ename); |
| 480 | 488 | |
| 481 | 489 | ++ iIdx; |