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 | #include <assert.h> | 43 | #include <assert.h> |
| 44 | #if !defined(_WIN32) | 44 | #if !defined(_WIN32) |
| 45 | #include <semaphore.h> | 45 | #include <semaphore.h> |
| 46 | #include <unistd.h> | ||
| 46 | #endif//!_WIN32 | 47 | #endif//!_WIN32 |
| 47 | #ifndef SEM_NAME_MAX | 48 | #ifndef SEM_NAME_MAX |
| 48 | // length of semaphore name should be system constrained at least on mac 10.7 | 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 | "pThreadPEncCtx"); | 318 | "pThreadPEncCtx"); |
| 318 | WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pSmt->pThreadPEncCtx), FreeMemorySvc (ppCtx)) | 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 | iIdx = 0; | 328 | iIdx = 0; |
| 321 | while (iIdx < iNumSpatialLayers) { | 329 | while (iIdx < iNumSpatialLayers) { |
| 322 | SSliceConfig* pMso = &pPara->sDependencyLayers[iIdx].sSliceCfg; | 330 | SSliceConfig* pMso = &pPara->sDependencyLayers[iIdx].sSliceCfg; |
| @@ -360,34 +368,34 @@ int32_t RequestMtResource (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pCodingPara · 37 unmodified lines | |||
| 360 | pSmt->pThreadHandles[iIdx] = 0; | 368 | pSmt->pThreadHandles[iIdx] = 0; |
| 361 | 369 | ||
| 362 | #ifdef _WIN32 | 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 | err = WelsEventOpen (&pSmt->pFinSliceCodingEvent[iIdx], name); | 372 | err = WelsEventOpen (&pSmt->pFinSliceCodingEvent[iIdx], name); |
| 365 | #if defined(ENABLE_TRACE_MT) | 373 | #if defined(ENABLE_TRACE_MT) |
| 366 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pFinSliceCodingEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); | 374 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pFinSliceCodingEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); |
| 367 | #endif | 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 | err = WelsEventOpen (&pSmt->pExitEncodeEvent[iIdx], name); | 377 | err = WelsEventOpen (&pSmt->pExitEncodeEvent[iIdx], name); |
| 370 | #if defined(ENABLE_TRACE_MT) | 378 | #if defined(ENABLE_TRACE_MT) |
| 371 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pExitEncodeEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); | 379 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pExitEncodeEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); |
| 372 | #endif | 380 | #endif |
| 373 | #endif//_WIN32 | 381 | #endif//_WIN32 |
| 374 | // length of semaphore name should be system constrained at least on mac 10.7 | 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 | err = WelsEventOpen (&pSmt->pUpdateMbListEvent[iIdx], name); | 384 | err = WelsEventOpen (&pSmt->pUpdateMbListEvent[iIdx], name); |
| 377 | #if defined(ENABLE_TRACE_MT) | 385 | #if defined(ENABLE_TRACE_MT) |
| 378 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pUpdateMbListEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); | 386 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pUpdateMbListEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); |
| 379 | #endif | 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 | err = WelsEventOpen (&pSmt->pFinUpdateMbListEvent[iIdx], name); | 389 | err = WelsEventOpen (&pSmt->pFinUpdateMbListEvent[iIdx], name); |
| 382 | #if defined(ENABLE_TRACE_MT) | 390 | #if defined(ENABLE_TRACE_MT) |
| 383 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pFinUpdateMbListEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); | 391 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pFinUpdateMbListEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); |
| 384 | #endif | 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 | err = WelsEventOpen (&pSmt->pSliceCodedEvent[iIdx], name); | 394 | err = WelsEventOpen (&pSmt->pSliceCodedEvent[iIdx], name); |
| 387 | #if defined(ENABLE_TRACE_MT) | 395 | #if defined(ENABLE_TRACE_MT) |
| 388 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pSliceCodedEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); | 396 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pSliceCodedEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno); |
| 389 | #endif | 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 | err = WelsEventOpen (&pSmt->pReadySliceCodingEvent[iIdx], name); | 399 | err = WelsEventOpen (&pSmt->pReadySliceCodingEvent[iIdx], name); |
| 392 | #if defined(ENABLE_TRACE_MT) | 400 | #if defined(ENABLE_TRACE_MT) |
| 393 | WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pReadySliceCodingEvent%d = 0x%p named(%s) ret%d err%d\n", iIdx, | 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 | if (pSmt->pThreadHandles != NULL && pSmt->pThreadHandles[iIdx] != NULL) | 472 | if (pSmt->pThreadHandles != NULL && pSmt->pThreadHandles[iIdx] != NULL) |
| 465 | WelsThreadDestroy (&pSmt->pThreadHandles[iIdx]); | 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 | WelsEventClose (&pSmt->pFinSliceCodingEvent[iIdx], ename); | 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 | WelsEventClose (&pSmt->pExitEncodeEvent[iIdx], ename); | 478 | WelsEventClose (&pSmt->pExitEncodeEvent[iIdx], ename); |
| 471 | #endif//_WIN32 | 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 | WelsEventClose (&pSmt->pSliceCodedEvent[iIdx], ename); | 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 | WelsEventClose (&pSmt->pReadySliceCodingEvent[iIdx], ename); | 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 | WelsEventClose (&pSmt->pUpdateMbListEvent[iIdx], ename); | 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 | WelsEventClose (&pSmt->pFinUpdateMbListEvent[iIdx], ename); | 487 | WelsEventClose (&pSmt->pFinUpdateMbListEvent[iIdx], ename); |
| 480 | 488 | ||
| 481 | ++ iIdx; | 489 | ++ iIdx; |