Dear all,

I am implementing a TCP client to send messages with BSD sockets. A BOOL
variable, isConnected, is used to detect if the TCP connection is built.
Since the client must be accessed by multiple threads, a NSLock,
isConnectedLock is used.

When testing, after invoking the methods, Connect and SendMessage, I release
the client. However, I got an exception as follows.

**** -[NSLock dealloc]: lock (<NSLock: 0x100614cc0> '(null)') deallocated
while still in use*

**** Break on _NSLockError() to debug.*

What is the potential problem?

Thanks so much!
Bing

- (BOOL) Connect
{
        [isConnectedLock lock];
        if (!isConnected)
        {
                destinationSocket = socket(AF_INET, SOCK_STREAM,
IPPROTO_TCP);
                if (destinationSocket < 0)
                {
                        return NO;
                }

                memset(&destinationAddress, 0, sizeof(destinationAddress));
                destinationAddress.sin_family = AF_INET;
                const char *ip = [DestinationIP UTF8String];
                int isAddressValidate = inet_pton(AF_INET, ip,
&destinationAddress.sin_addr.s_addr);
                if (isAddressValidate == 0)
                {
                        return NO;
                }
                else if (isAddressValidate < 0)
                {
                        return NO;
                }
                destinationAddress.sin_port = htons(PortNumber);
                if (connect(destinationSocket, (struct sockaddr
*)&destinationAddress, sizeof(destinationAddress)) < 0)
                {
                        return NO;
                }
                isConnected = YES;
        }
        [isConnectedLock unlock];
        return YES;
}

- (BOOL) SendMessage:(char *)message
{
        [isConnectedLock lock];
        if (isConnected)
        {
                size_t messageLength = strlen(message);
                ssize_t bytesCount = send(destinationSocket, message,
messageLength, 0);
                if (bytesCount < 0)
                {
                        return NO;
                }
                else if (bytesCount != messageLength)
                {
                        return NO;
                }
                return YES;
        }
        else
        {
                return NO;
        }
        [isConnectedLock unlock];
}

- (BOOL) Disconnect
{
        [isConnectedLock lock];
        if (isConnected)
        {
                close(destinationSocket);
                isConnected = NO;
        }
        [isConnectedLock unlock];
        return YES;
}

- (void) dealloc
{
        [CommKey release];
        [DestinationIP release];
        [isConnectedLock release];
        [super dealloc];
}

@end
_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to