Skip to content

Commit 44b89a9

Browse files
committed
#53 fix the generation of CID's and add sync blocks
1 parent 8ce5bad commit 44b89a9

File tree

1 file changed

+44
-40
lines changed

1 file changed

+44
-40
lines changed

pvAccessJava/src/org/epics/pvaccess/client/impl/remote/ClientContextImpl.java

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)