mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-31 00:30:53 +00:00
(in_port_2_ancestor): New static variable.
([Connection +initialize]): Initialize it. ([Connection +newForInPort:outPort:ancestorConnection:]): Use new static variable to handle ancestor; (ignore ancestor argument; the method name will be changed later). Set the in-port's packet invocation to the Connection class. Don't call -addToRunLoop.. here, the mechanics of it were already done above. ([Connection -addToRunLoop:forMode:]): Mark it as not implemented, for now. ([Connection -runConnectionUntilDate:]): Don't add to run loop here. ([Connection +invokeWithObject:]): Make it a class method instead of an instance method; alter contents appropriately for this. ([Connection -portIsInvalid:]): Look at in_port_2_ancestor and remove ourselves if necessary. ([Connection -invalidate]): Don't remove ourselves from the run loop here, because we may not be the only one listening. This still needs fixing. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@1131 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
775eb86a05
commit
a4b77d360c
1 changed files with 63 additions and 9 deletions
|
@ -124,6 +124,8 @@ static Lock *connection_array_gate;
|
||||||
static Dictionary *root_object_dictionary;
|
static Dictionary *root_object_dictionary;
|
||||||
static Lock *root_object_dictionary_gate;
|
static Lock *root_object_dictionary_gate;
|
||||||
|
|
||||||
|
static NSMapTable *in_port_2_ancestor;
|
||||||
|
|
||||||
static NSMapTable *all_connections_local_targets = NULL;
|
static NSMapTable *all_connections_local_targets = NULL;
|
||||||
|
|
||||||
/* rmc handling */
|
/* rmc handling */
|
||||||
|
@ -150,6 +152,9 @@ static int messages_received_count;
|
||||||
received_reply_rmc_queue_gate = [Lock new];
|
received_reply_rmc_queue_gate = [Lock new];
|
||||||
root_object_dictionary = [[Dictionary alloc] init];
|
root_object_dictionary = [[Dictionary alloc] init];
|
||||||
root_object_dictionary_gate = [Lock new];
|
root_object_dictionary_gate = [Lock new];
|
||||||
|
in_port_2_ancestor =
|
||||||
|
NSCreateMapTable (NSNonOwnedPointerMapKeyCallBacks,
|
||||||
|
NSNonOwnedPointerMapValueCallBacks, 0);
|
||||||
messages_received_count = 0;
|
messages_received_count = 0;
|
||||||
default_in_port_class = [TcpInPort class];
|
default_in_port_class = [TcpInPort class];
|
||||||
default_out_port_class = [TcpOutPort class];
|
default_out_port_class = [TcpOutPort class];
|
||||||
|
@ -340,7 +345,7 @@ static int messages_received_count;
|
||||||
/* This is the designated initializer for Connection */
|
/* This is the designated initializer for Connection */
|
||||||
|
|
||||||
+ (Connection*) newForInPort: (InPort*)ip outPort: (OutPort*)op
|
+ (Connection*) newForInPort: (InPort*)ip outPort: (OutPort*)op
|
||||||
ancestorConnection: (Connection*)ancestor;
|
ancestorConnection: ancestor
|
||||||
{
|
{
|
||||||
Connection *newConn;
|
Connection *newConn;
|
||||||
int i, count;
|
int i, count;
|
||||||
|
@ -367,12 +372,12 @@ static int messages_received_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
newConn = [[Connection alloc] _superInit];
|
newConn = [[Connection alloc] _superInit];
|
||||||
newConn->is_valid = 1;
|
|
||||||
if (debug_connection)
|
if (debug_connection)
|
||||||
fprintf(stderr, "Created new connection 0x%x\n\t%s\n\t%s\n",
|
fprintf(stderr, "Created new connection 0x%x\n\t%s\n\t%s\n",
|
||||||
(unsigned)newConn,
|
(unsigned)newConn,
|
||||||
[[ip description] cStringNoCopy],
|
[[ip description] cStringNoCopy],
|
||||||
[[op description] cStringNoCopy]);
|
[[op description] cStringNoCopy]);
|
||||||
|
newConn->is_valid = 1;
|
||||||
newConn->in_port = ip;
|
newConn->in_port = ip;
|
||||||
[ip retain];
|
[ip retain];
|
||||||
newConn->out_port = op;
|
newConn->out_port = op;
|
||||||
|
@ -401,6 +406,24 @@ static int messages_received_count;
|
||||||
newConn->in_timeout = [self defaultInTimeout];
|
newConn->in_timeout = [self defaultInTimeout];
|
||||||
newConn->out_timeout = [self defaultOutTimeout];
|
newConn->out_timeout = [self defaultOutTimeout];
|
||||||
newConn->encoding_class = default_encoding_class;
|
newConn->encoding_class = default_encoding_class;
|
||||||
|
|
||||||
|
/* xxx ANCESTOR argument is currently ignored; in the future it
|
||||||
|
will be removed. */
|
||||||
|
/* xxx It this the correct behavior? */
|
||||||
|
if (!(ancestor = NSMapGet (in_port_2_ancestor, ip)))
|
||||||
|
{
|
||||||
|
NSMapInsert (in_port_2_ancestor, ip, newConn);
|
||||||
|
[ip addToRunLoop: [RunLoop currentInstance] forMode: nil];
|
||||||
|
/* This will cause the connection with the registered name
|
||||||
|
to receive the -invokeWithObject: from the IN_PORT.
|
||||||
|
This ends up being the ancestor of future new Connections
|
||||||
|
on this in port. */
|
||||||
|
/* xxx Could it happen that this connection was invalidated, but
|
||||||
|
the others would still be OK? That would cause problems.
|
||||||
|
No. I don't think that can happen. */
|
||||||
|
[ip setReceivedPacketInvocation: (id)[self class]];
|
||||||
|
}
|
||||||
|
|
||||||
if (ancestor)
|
if (ancestor)
|
||||||
{
|
{
|
||||||
newConn->in_port_class = [ancestor inPortClass];
|
newConn->in_port_class = [ancestor inPortClass];
|
||||||
|
@ -446,6 +469,9 @@ static int messages_received_count;
|
||||||
|
|
||||||
[connection_array_gate unlock];
|
[connection_array_gate unlock];
|
||||||
|
|
||||||
|
/* [newConn addToRunLoop: [RunLoop currentInstance] forMode: nil];
|
||||||
|
This already done above. */
|
||||||
|
|
||||||
[NotificationDispatcher
|
[NotificationDispatcher
|
||||||
postNotificationName: ConnectionWasCreatedNotification
|
postNotificationName: ConnectionWasCreatedNotification
|
||||||
object: newConn];
|
object: newConn];
|
||||||
|
@ -766,8 +792,17 @@ static int messages_received_count;
|
||||||
|
|
||||||
- (void) addToRunLoop: run_loop forMode: (id <String>)mode
|
- (void) addToRunLoop: run_loop forMode: (id <String>)mode
|
||||||
{
|
{
|
||||||
|
[self notImplemented: _cmd];
|
||||||
[in_port addToRunLoop: run_loop forMode: mode];
|
[in_port addToRunLoop: run_loop forMode: mode];
|
||||||
[in_port setReceivedPacketInvocation: (id)self];
|
if (out_port == nil)
|
||||||
|
/* This will cause the connection with the registered name
|
||||||
|
to receive the -invokeWithObject: from the IN_PORT.
|
||||||
|
This ends up being the `ancestorConnection:' argument in
|
||||||
|
[ConnectedDecoder newDecodingWithPacket:connection:]. */
|
||||||
|
/* xxx Could it happen that this connection was invalidated, but
|
||||||
|
the others would still be OK? That would cause problems.
|
||||||
|
No. I don't think that can happen. */
|
||||||
|
[in_port setReceivedPacketInvocation: (id)[self class]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) removeFromRunLoop: run_loop forMode: (id <String>)mode
|
- (void) removeFromRunLoop: run_loop forMode: (id <String>)mode
|
||||||
|
@ -777,7 +812,6 @@ static int messages_received_count;
|
||||||
|
|
||||||
- (void) runConnectionUntilDate: date
|
- (void) runConnectionUntilDate: date
|
||||||
{
|
{
|
||||||
[self addToRunLoop: [RunLoop currentInstance] forMode: nil];
|
|
||||||
[RunLoop runUntilDate: date];
|
[RunLoop runUntilDate: date];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -909,12 +943,14 @@ static int messages_received_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sneaky, sneaky. See "sneaky" comment in TcpPort.m.
|
/* Sneaky, sneaky. See "sneaky" comment in TcpPort.m.
|
||||||
This method will be called by InPort when I receives a new packet. */
|
This method is called by InPort when it receives a new packet. */
|
||||||
- (void) invokeWithObject: packet
|
+ (void) invokeWithObject: packet
|
||||||
{
|
{
|
||||||
[self _handleRmc:
|
id rmc = [ConnectedDecoder
|
||||||
[ConnectedDecoder newDecodingWithPacket: packet
|
newDecodingWithPacket: packet
|
||||||
connection: self]];
|
connection: NSMapGet (in_port_2_ancestor,
|
||||||
|
[packet receivingInPort])];
|
||||||
|
[[rmc connection] _handleRmc: rmc];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (int) _newMsgNumber
|
- (int) _newMsgNumber
|
||||||
|
@ -1265,6 +1301,16 @@ static int messages_received_count;
|
||||||
with the NotificationDispatcher in
|
with the NotificationDispatcher in
|
||||||
+newForInPort:outPort:ancestorConnection. */
|
+newForInPort:outPort:ancestorConnection. */
|
||||||
assert (port == in_port || port == out_port);
|
assert (port == in_port || port == out_port);
|
||||||
|
|
||||||
|
/* xxx This also needs to be done properly in cases where the
|
||||||
|
Connection invalidates itself. */
|
||||||
|
/* Remove ourselves from the in_port_2_ancestor, if necessary. */
|
||||||
|
{
|
||||||
|
id ancestor;
|
||||||
|
if ([port isKindOfClass: [InPort class]]
|
||||||
|
&& (self == (ancestor = NSMapGet (in_port_2_ancestor, port))))
|
||||||
|
NSMapRemove (in_port_2_ancestor, port);
|
||||||
|
}
|
||||||
[self invalidate];
|
[self invalidate];
|
||||||
/* xxx Anything else? */
|
/* xxx Anything else? */
|
||||||
}
|
}
|
||||||
|
@ -1289,6 +1335,14 @@ static int messages_received_count;
|
||||||
(unsigned)self,
|
(unsigned)self,
|
||||||
[[in_port description] cStringNoCopy],
|
[[in_port description] cStringNoCopy],
|
||||||
[[out_port description] cStringNoCopy]);
|
[[out_port description] cStringNoCopy]);
|
||||||
|
|
||||||
|
/* We actually need to know *which* RunLoops to remove
|
||||||
|
outselves from. */
|
||||||
|
/* xxx No. We aren't the only Connection listening to this in
|
||||||
|
port. This would be correct if we properly counted that adds
|
||||||
|
and removes.
|
||||||
|
[self removeFromRunLoop: [RunLoop currentInstance]
|
||||||
|
forMode: nil]; */
|
||||||
|
|
||||||
[NotificationDispatcher
|
[NotificationDispatcher
|
||||||
postNotificationName: ConnectionBecameInvalidNotification
|
postNotificationName: ConnectionBecameInvalidNotification
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue