@@ -540,22 +540,21 @@ private void internalDestroy() {
540540
541541 }
542542
543- /**
544- * Destroy all channels.
545- */
546- private void destroyAllChannels () {
547-
548- for (Channel channel : channelsByCID .values ()) {
549- try {
550- channel .destroy ();
551- } catch (Exception e ) {
552- e .printStackTrace ();
553- }
554- }
555-
556- channelsByCID .clear ();
557-
558- }
543+ /**
544+ * Destroy all channels.
545+ */
546+ private void destroyAllChannels () {
547+ synchronized (channelsByCID ) {
548+ for (Channel channel : channelsByCID .values ()) {
549+ try {
550+ channel .destroy ();
551+ } catch (Exception e ) {
552+ e .printStackTrace ();
553+ }
554+ }
555+ channelsByCID .clear ();
556+ }
557+ }
559558
560559 /**
561560 * Check channel name.
@@ -587,7 +586,6 @@ public Channel createChannelInternal(String name, ChannelRequester requester, sh
587586 boolean lockAcquired = namedLocker .acquireSynchronizationObject (name , LOCK_TIMEOUT );
588587 if (lockAcquired ) {
589588 try {
590-
591589 int cid = generateCID ();
592590 return new ChannelImpl (this , cid , name , requester , priority , addresses );
593591 } finally {
@@ -933,18 +931,23 @@ Transport getTransport(TransportClient client, InetSocketAddress serverAddress,
933931 *
934932 * @return Client channel ID (CID).
935933 */
936- private int generateCID () {
937- // reserve CID
938- channelsByCID .put (lastCID , null );
939- return lastCID ;
940- }
934+ private int generateCID () {
935+ synchronized (channelsByCID ) {
936+ // reserve CID
937+ // search first free (theoretically possible loop of death)
938+ while (getChannel (++lastCID ) != null )
939+ ;
940+ // reserve CID
941+ channelsByCID .put (lastCID , null );
942+ return lastCID ;
943+ }
944+ }
941945
942946 /**
943947 * Free generated channel ID (CID).
944948 */
945949 private void freeCID (int cid ) {
946950 channelsByCID .remove (cid );
947-
948951 }
949952
950953 /**
@@ -954,10 +957,9 @@ private void freeCID(int cid) {
954957 * I/O ID.
955958 * @return request response with given I/O ID.
956959 */
957- public ResponseRequest getResponseRequest (int ioid ) {
958-
959- return (ResponseRequest ) pendingResponseRequests .get (ioid );
960- }
960+ public ResponseRequest getResponseRequest (int ioid ) {
961+ return (ResponseRequest ) pendingResponseRequests .get (ioid );
962+ }
961963
962964 /**
963965 * Register response request.
@@ -967,10 +969,11 @@ public ResponseRequest getResponseRequest(int ioid) {
967969 * @return request ID (IOID).
968970 */
969971 public int registerResponseRequest (ResponseRequest request ) {
970-
971- int ioid = generateIOID ();
972- pendingResponseRequests .put (ioid , request );
973- return ioid ;
972+ synchronized (pendingResponseRequests ) {
973+ int ioid = generateIOID ();
974+ pendingResponseRequests .put (ioid , request );
975+ return ioid ;
976+ }
974977
975978 }
976979
@@ -990,15 +993,16 @@ public ResponseRequest unregisterResponseRequest(ResponseRequest request) {
990993 *
991994 * @return IOID.
992995 */
993- private int generateIOID () {
994-
995- // search first free (theoretically possible loop of death)
996- while (pendingResponseRequests .get (++lastIOID ) != null || lastIOID == PVAConstants .PVA_INVALID_IOID )
997- ;
998- // reserve IOID
999- pendingResponseRequests .put (lastIOID , null );
1000- return lastIOID ;
1001- }
996+ private int generateIOID () {
997+ synchronized (pendingResponseRequests ) {
998+ // search first free (theoretically possible loop of death)
999+ while (pendingResponseRequests .get (++lastIOID ) != null || lastIOID == PVAConstants .PVA_INVALID_IOID )
1000+ ;
1001+ // reserve IOID
1002+ pendingResponseRequests .put (lastIOID , null );
1003+ return lastIOID ;
1004+ }
1005+ }
10021006
10031007 /**
10041008 * Get (and if necessary create) beacon handler.
0 commit comments