ソースを参照

Added a check to try and detect the case where a server and
a client are running on the same instance. This should cover
99% of the cases where this would come up... and the others
can't really use this service anyway and so must disable it.

Paul Speed 9 年 前
コミット
dfe4b083f0

+ 20 - 2
jme3-networking/src/main/java/com/jme3/network/message/SerializerRegistrationsMessage.java

@@ -94,7 +94,7 @@ public class SerializerRegistrationsMessage extends AbstractMessage {
     public static Registration[] compiled;
     private static final Serializer fieldSerializer = new FieldSerializer();
     
-    private Registration[] registrations;
+    private Registration[] registrations;    
 
     public SerializerRegistrationsMessage() {
         setReliable(true);
@@ -132,7 +132,25 @@ public class SerializerRegistrationsMessage extends AbstractMessage {
         Serializer.setReadOnly(true);                              
     }
  
-    public void registerAll() {    
+    public void registerAll() {
+
+        // See if we will have problems because our registry is locked        
+        if( Serializer.isReadOnly() ) {
+            // Check to see if maybe we are executing this from the
+            // same JVM that sent the message, ie: client and server are running on
+            // the same JVM
+            // There could be more advanced checks than this but for now we'll
+            // assume that if the registry was compiled here then it means
+            // we are also the server process.  Note that this wouldn't hold true
+            // under complicated examples where there are clients of one server
+            // that also run their own servers but realistically they would have
+            // to disable the ServerSerializerRegistrationsServer anyway.
+            if( compiled != null ) {
+                log.log( Level.INFO, "Skipping registration as registry is locked, presumably by a local server process.");
+                return;
+            }
+        }
+        
         for( Registration reg : registrations ) {
             log.log( Level.INFO, "Registering:{0}", reg);
             reg.register();