From ff9603ad98ab7a5a6a01fa4e97f6451e022eb5e1 Mon Sep 17 00:00:00 2001 From: Jesse Bickel Date: Mon, 18 Apr 2016 20:21:55 -0500 Subject: [PATCH] Less locking but also less unnecessary new objects. --- .../translator/RTCPFeedbackMessageSender.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/org/jitsi/impl/neomedia/rtp/translator/RTCPFeedbackMessageSender.java b/src/org/jitsi/impl/neomedia/rtp/translator/RTCPFeedbackMessageSender.java index 84811103b..5410decb5 100644 --- a/src/org/jitsi/impl/neomedia/rtp/translator/RTCPFeedbackMessageSender.java +++ b/src/org/jitsi/impl/neomedia/rtp/translator/RTCPFeedbackMessageSender.java @@ -123,25 +123,28 @@ private long getSenderSSRC() public boolean sendFIR(int mediaSenderSSRC) { boolean registerRecurringProcessible = false; - synchronized (kfRequesters) + KeyframeRequester keyframeRequester = kfRequesters.get(mediaSenderSSRC); + if (keyframeRequester == null ) { - if (!kfRequesters.containsKey(mediaSenderSSRC)) + // Avoided repeated creation of unneeded objects until get fails. + keyframeRequester = new KeyframeRequester(mediaSenderSSRC); + KeyframeRequester existingKfRequester = kfRequesters.putIfAbsent( + mediaSenderSSRC, keyframeRequester); + if (existingKfRequester != null) { - kfRequesters.put( - mediaSenderSSRC, new KeyframeRequester(mediaSenderSSRC)); + // Another thread beat this one to putting a keyframe requester. + keyframeRequester = existingKfRequester; registerRecurringProcessible = true; } } - KeyframeRequester kfRequester = kfRequesters.get(mediaSenderSSRC); - if (registerRecurringProcessible) { recurringProcessibleExecutor - .registerRecurringProcessible(kfRequester); + .registerRecurringProcessible(keyframeRequester); } - return kfRequester.maybeRequest(true); + return keyframeRequester.maybeRequest(true); } /**