History

Use a macro for conditionally logging based on ENABLE_TRACE_MT

This avoids having an extra ifdef around every single WelsLog call.

Martin Storsjö committed 12 years ago

Commit fd6f8a81 parent 54c63e21 file · +44 −75Browse files

Showing the changes to codec/encoder/core/src/slice_multi_threading.cpp (1 of 1 file). Show all

Unified · Split

codec/encoder/core/src/slice_multi_threading.cpp+44−75
@@ -63,6 +63,13 @@ · 62 unmodified lines
63#include "cpu.h"63#include "cpu.h"
64 64
65#include "measure_time.h"65#include "measure_time.h"
66
67#if defined(ENABLE_TRACE_MT)
68#define MT_TRACE_LOG(x, ...) WelsLog(x, __VA_ARGS__)
69#else
70#define MT_TRACE_LOG(x, ...)
71#endif
72
66namespace WelsSVCEnc {73namespace WelsSVCEnc {
67void UpdateMbListNeighborParallel (SSliceCtx* pSliceCtx,74void UpdateMbListNeighborParallel (SSliceCtx* pSliceCtx,
68 SMB* pMbList,75 SMB* pMbList,
@@ -126,10 +133,8 @@ void CalcSliceComplexRatio (void* pRatio, SSliceCtx* pSliceCtx, uint32_t* pSlice · 57 unmodified lines
126 133
127 while (iSliceIdx < kiSliceCount) {134 while (iSliceIdx < kiSliceCount) {
128 fAvI[iSliceIdx] = 1.0f * pCountMbInSlice[iSliceIdx] / pSliceTime[iSliceIdx];135 fAvI[iSliceIdx] = 1.0f * pCountMbInSlice[iSliceIdx] / pSliceTime[iSliceIdx];
129#if defined(ENABLE_TRACE_MT)136 MT_TRACE_LOG (NULL, WELS_LOG_DEBUG, "[MT] CalcSliceComplexRatio(), pSliceConsumeTime[%d]= %d us, slice_run= %d\n", iSliceIdx,
130 WelsLog (NULL, WELS_LOG_DEBUG, "[MT] CalcSliceComplexRatio(), pSliceConsumeTime[%d]= %d us, slice_run= %d\n", iSliceIdx,137 pSliceTime[iSliceIdx], pCountMbInSlice[iSliceIdx]);
131 pSliceTime[iSliceIdx], pCountMbInSlice[iSliceIdx]);
132#endif//ENABLE_TRACE_MT
133 fSumAv += fAvI[iSliceIdx];138 fSumAv += fAvI[iSliceIdx];
134 139
135 ++ iSliceIdx;140 ++ iSliceIdx;
@@ -153,10 +158,8 @@ int32_t NeedDynamicAdjust (void* pConsumeTime, const int32_t iSliceNum) { · 17 unmodified lines
153 iSliceIdx += 2;158 iSliceIdx += 2;
154 }159 }
155 if (uiTotalConsume == 0) {160 if (uiTotalConsume == 0) {
156#if defined(ENABLE_TRACE_MT)161 MT_TRACE_LOG (NULL, WELS_LOG_DEBUG, "[MT] NeedDynamicAdjust(), herein do no adjust due first picture, iCountSliceNum= %d\n",
157 WelsLog (NULL, WELS_LOG_DEBUG, "[MT] NeedDynamicAdjust(), herein do no adjust due first picture, iCountSliceNum= %d\n",162 iSliceNum);
158 iSliceNum);
159#endif//ENABLE_TRACE_MT
160 return false;163 return false;
161 }164 }
162 165
@@ -181,11 +184,9 @@ int32_t NeedDynamicAdjust (void* pConsumeTime, const int32_t iSliceNum) { · 18 unmodified lines
181 fThr = 1.0f;184 fThr = 1.0f;
182 if (fRmse > fThr)185 if (fRmse > fThr)
183 iNeedAdj = true;186 iNeedAdj = true;
184#if defined(ENABLE_TRACE_MT)187 MT_TRACE_LOG (NULL, WELS_LOG_DEBUG,
185 WelsLog (NULL, WELS_LOG_DEBUG,188 "[MT] NeedDynamicAdjust(), herein adjustment decision is made (iNeedAdj= %d) by: fRmse of pSlice complexity ratios %.6f, the corresponding threshold %.6f, iCountSliceNum %d\n",
186 "[MT] NeedDynamicAdjust(), herein adjustment decision is made (iNeedAdj= %d) by: fRmse of pSlice complexity ratios %.6f, the corresponding threshold %.6f, iCountSliceNum %d\n",189 iNeedAdj, fRmse, fThr, iSliceNum);
187 iNeedAdj, fRmse, fThr, iSliceNum);
188#endif//ENABLE_TRACE_MT
189 190
190 return iNeedAdj;191 return iNeedAdj;
191}192}
@@ -232,9 +233,7 @@ void DynamicAdjustSlicing (sWelsEncCtx* pCtx, · 40 unmodified lines
232 233
233 WelsEmms();234 WelsEmms();
234 235
235#if defined(ENABLE_TRACE_MT)236 MT_TRACE_LOG (pCtx, WELS_LOG_DEBUG, "[MT] DynamicAdjustSlicing(), iDid= %d, iCountNumMb= %d\n", iCurDid, kiCountNumMb);
236 WelsLog (pCtx, WELS_LOG_DEBUG, "[MT] DynamicAdjustSlicing(), iDid= %d, iCountNumMb= %d\n", iCurDid, kiCountNumMb);
237#endif//ENABLE_TRACE_MT
238 237
239 iSliceIdx = 0;238 iSliceIdx = 0;
240 while (iSliceIdx + 1 < kiCountSliceNum) {239 while (iSliceIdx + 1 < kiCountSliceNum) {
@@ -259,20 +258,16 @@ void DynamicAdjustSlicing (sWelsEncCtx* pCtx, · 18 unmodified lines
259 return;258 return;
260 }259 }
261 iRunLen[iSliceIdx] = iNumMbAssigning;260 iRunLen[iSliceIdx] = iNumMbAssigning;
262#if defined(ENABLE_TRACE_MT)261 MT_TRACE_LOG (pCtx, WELS_LOG_DEBUG,
263 WelsLog (pCtx, WELS_LOG_DEBUG,
264 "[MT] DynamicAdjustSlicing(), uiSliceIdx= %d, pSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d\n",262 "[MT] DynamicAdjustSlicing(), uiSliceIdx= %d, pSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d\n",
265 iSliceIdx, pSliceComplexRatio[iSliceIdx], pSliceCtx->pCountMbNumInSlice[iSliceIdx], iNumMbAssigning);263 iSliceIdx, pSliceComplexRatio[iSliceIdx], pSliceCtx->pCountMbNumInSlice[iSliceIdx], iNumMbAssigning);
266#endif//ENABLE_TRACE_MT
267 ++ iSliceIdx;264 ++ iSliceIdx;
268 iMaximalMbNum = iMbNumLeft - (kiCountSliceNum - iSliceIdx - 1) * iMinimalMbNum; // get maximal num_mb in left parts265 iMaximalMbNum = iMbNumLeft - (kiCountSliceNum - iSliceIdx - 1) * iMinimalMbNum; // get maximal num_mb in left parts
269 }266 }
270 iRunLen[iSliceIdx] = iMbNumLeft;267 iRunLen[iSliceIdx] = iMbNumLeft;
271#if defined(ENABLE_TRACE_MT)268 MT_TRACE_LOG (pCtx, WELS_LOG_DEBUG,
272 WelsLog (pCtx, WELS_LOG_DEBUG,269 "[MT] DynamicAdjustSlicing(), iSliceIdx= %d, pSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d\n",
273 "[MT] DynamicAdjustSlicing(), iSliceIdx= %d, pSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d\n",270 iSliceIdx, pSliceComplexRatio[iSliceIdx], pSliceCtx->pCountMbNumInSlice[iSliceIdx], iMbNumLeft);
274 iSliceIdx, pSliceComplexRatio[iSliceIdx], pSliceCtx->pCountMbNumInSlice[iSliceIdx], iMbNumLeft);
275#endif//ENABLE_TRACE_MT
276 271
277 272
278 if (DynamicAdjustSlicePEncCtxAll (pSliceCtx, iRunLen) == 0) {273 if (DynamicAdjustSlicePEncCtxAll (pSliceCtx, iRunLen) == 0) {
@@ -354,9 +349,7 @@ int32_t RequestMtResource (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pCodingPara · 75 unmodified lines
354 pSmt->pFSliceDiff = fopen ("slice_time.txt", "wt+");349 pSmt->pFSliceDiff = fopen ("slice_time.txt", "wt+");
355#endif//MT_DEBUG350#endif//MT_DEBUG
356 351
357#if defined(ENABLE_TRACE_MT)352 MT_TRACE_LOG ((*ppCtx), WELS_LOG_INFO, "encpEncCtx= 0x%p\n", (void*) (*ppCtx));
358 WelsLog ((*ppCtx), WELS_LOG_INFO, "encpEncCtx= 0x%p\n", (void*) (*ppCtx));
359#endif//ENABLE_TRACE_MT
360 353
361 iIdx = 0;354 iIdx = 0;
362 while (iIdx < iThreadNum) {355 while (iIdx < iThreadNum) {
@@ -370,37 +363,25 @@ int32_t RequestMtResource (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pCodingPara · 7 unmodified lines
370#ifdef _WIN32363#ifdef _WIN32
371 WelsSnprintf (name, SEM_NAME_MAX, "fs%d%s", iIdx, pSmt->eventNamespace);364 WelsSnprintf (name, SEM_NAME_MAX, "fs%d%s", iIdx, pSmt->eventNamespace);
372 err = WelsEventOpen (&pSmt->pFinSliceCodingEvent[iIdx], name);365 err = WelsEventOpen (&pSmt->pFinSliceCodingEvent[iIdx], name);
373#if defined(ENABLE_TRACE_MT)366 MT_TRACE_LOG ((*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);
375#endif
376 WelsSnprintf (name, SEM_NAME_MAX, "ee%d%s", iIdx, pSmt->eventNamespace);367 WelsSnprintf (name, SEM_NAME_MAX, "ee%d%s", iIdx, pSmt->eventNamespace);
377 err = WelsEventOpen (&pSmt->pExitEncodeEvent[iIdx], name);368 err = WelsEventOpen (&pSmt->pExitEncodeEvent[iIdx], name);
378#if defined(ENABLE_TRACE_MT)369 MT_TRACE_LOG ((*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);
380#endif
381#endif//_WIN32370#endif//_WIN32
382 // length of semaphore name should be system constrained at least on mac 10.7371 // length of semaphore name should be system constrained at least on mac 10.7
383 WelsSnprintf (name, SEM_NAME_MAX, "ud%d%s", iIdx, pSmt->eventNamespace);372 WelsSnprintf (name, SEM_NAME_MAX, "ud%d%s", iIdx, pSmt->eventNamespace);
384 err = WelsEventOpen (&pSmt->pUpdateMbListEvent[iIdx], name);373 err = WelsEventOpen (&pSmt->pUpdateMbListEvent[iIdx], name);
385#if defined(ENABLE_TRACE_MT)374 MT_TRACE_LOG ((*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);
387#endif
388 WelsSnprintf (name, SEM_NAME_MAX, "fu%d%s", iIdx, pSmt->eventNamespace);375 WelsSnprintf (name, SEM_NAME_MAX, "fu%d%s", iIdx, pSmt->eventNamespace);
389 err = WelsEventOpen (&pSmt->pFinUpdateMbListEvent[iIdx], name);376 err = WelsEventOpen (&pSmt->pFinUpdateMbListEvent[iIdx], name);
390#if defined(ENABLE_TRACE_MT)377 MT_TRACE_LOG ((*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);
392#endif
393 WelsSnprintf (name, SEM_NAME_MAX, "sc%d%s", iIdx, pSmt->eventNamespace);378 WelsSnprintf (name, SEM_NAME_MAX, "sc%d%s", iIdx, pSmt->eventNamespace);
394 err = WelsEventOpen (&pSmt->pSliceCodedEvent[iIdx], name);379 err = WelsEventOpen (&pSmt->pSliceCodedEvent[iIdx], name);
395#if defined(ENABLE_TRACE_MT)380 MT_TRACE_LOG ((*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);
397#endif
398 WelsSnprintf (name, SEM_NAME_MAX, "rc%d%s", iIdx, pSmt->eventNamespace);381 WelsSnprintf (name, SEM_NAME_MAX, "rc%d%s", iIdx, pSmt->eventNamespace);
399 err = WelsEventOpen (&pSmt->pReadySliceCodingEvent[iIdx], name);382 err = WelsEventOpen (&pSmt->pReadySliceCodingEvent[iIdx], name);
400#if defined(ENABLE_TRACE_MT)383 MT_TRACE_LOG ((*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,384 (void*)pSmt->pReadySliceCodingEvent[iIdx], name, err, errno);
402 (void*)pSmt->pReadySliceCodingEvent[iIdx], name, err, errno);
403#endif
404 385
405 ++ iIdx;386 ++ iIdx;
406 }387 }
@@ -436,10 +417,8 @@ int32_t RequestMtResource (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pCodingPara · 29 unmodified lines
436 iReturn = WelsMutexInit (&(*ppCtx)->mutexEncoderError);417 iReturn = WelsMutexInit (&(*ppCtx)->mutexEncoderError);
437 WELS_VERIFY_RETURN_PROC_IF (1, (WELS_THREAD_ERROR_OK != iReturn), FreeMemorySvc (ppCtx))418 WELS_VERIFY_RETURN_PROC_IF (1, (WELS_THREAD_ERROR_OK != iReturn), FreeMemorySvc (ppCtx))
438 419
439#if defined(ENABLE_TRACE_MT)420 MT_TRACE_LOG ((*ppCtx), WELS_LOG_INFO, "RequestMtResource(), iThreadNum=%d, iCountSliceNum= %d\n", pPara->iCountThreadsNum,
440 WelsLog ((*ppCtx), WELS_LOG_INFO, "RequestMtResource(), iThreadNum=%d, iCountSliceNum= %d\n", pPara->iCountThreadsNum,421 iMaxSliceNum);
441 iMaxSliceNum);
442#endif
443 422
444 return 0;423 return 0;
445}424}
@@ -708,10 +687,8 @@ WELS_THREAD_ROUTINE_TYPE UpdateMbListThreadProc (void* arg) { · 262 unmodified lines
708 iEventIdx = pPrivateData->iThreadIndex;687 iEventIdx = pPrivateData->iThreadIndex;
709 688
710 do {689 do {
711#if defined(ENABLE_TRACE_MT)690 MT_TRACE_LOG (pEncPEncCtx, WELS_LOG_INFO, "[MT] UpdateMbListThreadProc(), try to wait (pUpdateMbListEvent[%d])!\n",
712 WelsLog (pEncPEncCtx, WELS_LOG_INFO, "[MT] UpdateMbListThreadProc(), try to wait (pUpdateMbListEvent[%d])!\n",691 iEventIdx);
713 iEventIdx);
714#endif
715 iWaitRet = WelsEventWait (&pEncPEncCtx->pSliceThreading->pUpdateMbListEvent[iEventIdx]);692 iWaitRet = WelsEventWait (&pEncPEncCtx->pSliceThreading->pUpdateMbListEvent[iEventIdx]);
716 if (WELS_THREAD_ERROR_WAIT_OBJECT_0 == iWaitRet) {693 if (WELS_THREAD_ERROR_WAIT_OBJECT_0 == iWaitRet) {
717 pCurDq = pEncPEncCtx->pCurDqLayer;694 pCurDq = pEncPEncCtx->pCurDqLayer;
@@ -775,11 +752,9 @@ WELS_THREAD_ROUTINE_TYPE CodingSliceThreadProc (void* arg) { · 57 unmodified lines
775 &pEventsList[0],752 &pEventsList[0],
776 (uint32_t) - 1); // blocking until at least one event is753 (uint32_t) - 1); // blocking until at least one event is
777#else754#else
778#if defined(ENABLE_TRACE_MT)755 MT_TRACE_LOG (pEncPEncCtx, WELS_LOG_INFO,
779 WelsLog (pEncPEncCtx, WELS_LOG_INFO,756 "[MT] CodingSliceThreadProc(), try to call WelsEventWait(pReadySliceCodingEvent[%d]= 0x%p), pEncPEncCtx= 0x%p!\n",
780 "[MT] CodingSliceThreadProc(), try to call WelsEventWait(pReadySliceCodingEvent[%d]= 0x%p), pEncPEncCtx= 0x%p!\n",757 iEventIdx, (void*) (pEncPEncCtx->pSliceThreading->pReadySliceCodingEvent[iEventIdx]), (void*)pEncPEncCtx);
781 iEventIdx, (void*) (pEncPEncCtx->pSliceThreading->pReadySliceCodingEvent[iEventIdx]), (void*)pEncPEncCtx);
782#endif
783 iWaitRet = WelsEventWait (&pEncPEncCtx->pSliceThreading->pReadySliceCodingEvent[iEventIdx]);758 iWaitRet = WelsEventWait (&pEncPEncCtx->pSliceThreading->pReadySliceCodingEvent[iEventIdx]);
784#endif//WIN32759#endif//WIN32
785 if (WELS_THREAD_ERROR_WAIT_OBJECT_0 == iWaitRet) { // start pSlice coding signal waited760 if (WELS_THREAD_ERROR_WAIT_OBJECT_0 == iWaitRet) { // start pSlice coding signal waited
@@ -867,13 +842,11 @@ WELS_THREAD_ROUTINE_TYPE CodingSliceThreadProc (void* arg) { · 81 unmodified lines
867 if (bDsaFlag) {842 if (bDsaFlag) {
868 pEncPEncCtx->pSliceThreading->pSliceConsumeTime[pEncPEncCtx->uiDependencyId][iSliceIdx] = (uint32_t) (843 pEncPEncCtx->pSliceThreading->pSliceConsumeTime[pEncPEncCtx->uiDependencyId][iSliceIdx] = (uint32_t) (
869 WelsTime() - iSliceStart);844 WelsTime() - iSliceStart);
870#if defined(ENABLE_TRACE_MT)845 MT_TRACE_LOG (pEncPEncCtx, WELS_LOG_INFO,
871 WelsLog (pEncPEncCtx, WELS_LOG_INFO,846 "[MT] CodingSliceThreadProc(), coding_idx %d, uiSliceIdx %d, pSliceConsumeTime %d, iSliceSize %d, pFirstMbInSlice %d, count_num_mb_in_slice %d\n",
872 "[MT] CodingSliceThreadProc(), coding_idx %d, uiSliceIdx %d, pSliceConsumeTime %d, iSliceSize %d, pFirstMbInSlice %d, count_num_mb_in_slice %d\n",847 pEncPEncCtx->iCodingIndex, iSliceIdx,
873 pEncPEncCtx->iCodingIndex, iSliceIdx,848 pEncPEncCtx->pSliceThreading->pSliceConsumeTime[pEncPEncCtx->uiDependencyId][iSliceIdx], iSliceSize,
874 pEncPEncCtx->pSliceThreading->pSliceConsumeTime[pEncPEncCtx->uiDependencyId][iSliceIdx], iSliceSize,849 pCurDq->pSliceEncCtx->pFirstMbInSlice[iSliceIdx], pCurDq->pSliceEncCtx->pCountMbNumInSlice[iSliceIdx]);
875 pCurDq->pSliceEncCtx->pFirstMbInSlice[iSliceIdx], pCurDq->pSliceEncCtx->pCountMbNumInSlice[iSliceIdx]);
876#endif//ENABLE_TRACE_MT
877 }850 }
878 851
879#if defined(SLICE_INFO_OUTPUT)852#if defined(SLICE_INFO_OUTPUT)
@@ -982,12 +955,10 @@ WELS_THREAD_ROUTINE_TYPE CodingSliceThreadProc (void* arg) { · 102 unmodified lines
982 );955 );
983#endif//SLICE_INFO_OUTPUT956#endif//SLICE_INFO_OUTPUT
984 957
985#if defined(ENABLE_TRACE_MT)958 MT_TRACE_LOG (pEncPEncCtx, WELS_LOG_INFO,
986 WelsLog (pEncPEncCtx, WELS_LOG_INFO,959 "[MT] CodingSliceThreadProc(), coding_idx %d, iPartitionId %d, uiSliceIdx %d, iSliceSize %d, count_mb_slice %d, iEndMbInPartition %d, pCurDq->pLastCodedMbIdxOfPartition[%d] %d\n",
987 "[MT] CodingSliceThreadProc(), coding_idx %d, iPartitionId %d, uiSliceIdx %d, iSliceSize %d, count_mb_slice %d, iEndMbInPartition %d, pCurDq->pLastCodedMbIdxOfPartition[%d] %d\n",960 pEncPEncCtx->iCodingIndex, kiPartitionId, iSliceIdx, iSliceSize, pCurDq->pSliceEncCtx->pCountMbNumInSlice[iSliceIdx],
988 pEncPEncCtx->iCodingIndex, kiPartitionId, iSliceIdx, iSliceSize, pCurDq->pSliceEncCtx->pCountMbNumInSlice[iSliceIdx],961 kiEndMbInPartition, kiPartitionId, pCurDq->pLastCodedMbIdxOfPartition[kiPartitionId]);
989 kiEndMbInPartition, kiPartitionId, pCurDq->pLastCodedMbIdxOfPartition[kiPartitionId]);
990#endif//ENABLE_TRACE_MT
991 962
992 iAnyMbLeftInPartition = kiEndMbInPartition - (1 + pCurDq->pLastCodedMbIdxOfPartition[kiPartitionId]);963 iAnyMbLeftInPartition = kiEndMbInPartition - (1 + pCurDq->pLastCodedMbIdxOfPartition[kiPartitionId]);
993 iSliceIdx += kiSliceIdxStep;964 iSliceIdx += kiSliceIdxStep;
@@ -1070,9 +1041,7 @@ int32_t CreateSliceThreads (sWelsEncCtx* pCtx) { · 76 unmodified lines
1070 1041
1071 ++ iIdx;1042 ++ iIdx;
1072 }1043 }
1073#if defined(ENABLE_TRACE_MT)1044 MT_TRACE_LOG (pCtx, WELS_LOG_INFO, "CreateSliceThreads() exit..\n");
1074 WelsLog (pCtx, WELS_LOG_INFO, "CreateSliceThreads() exit..\n");
1075#endif
1076 return 0;1045 return 0;
1077}1046}
1078 1047

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t