File:  [NeXTSTEP 3.3 examples] / Examples / EnterpriseObjects / DistributedEO / DEOClient.subproj / DEOServerMonitor.m
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:48:44 2018 UTC (8 years, 1 month ago) by root
Branches: NeXT, MAIN
CVS tags: NeXTSTEP33, HEAD
Sample Programs from NeXSTEP 3.3

/*
   DEOServerMonitor.m created by enoyau on Fri 13-Jan-1995

   You may freely copy, distribute, and reuse the code in this example.
   NeXT disclaims any warranty of any kind, expressed or implied, as to its
   fitness for any particular use.
*/

#import "DEOServerMonitor.h"
#import <foundation/NSNotification.h>
#import <foundation/NSAutoreleasePool.h>
#import <foundation/NSUtilities.h>
#import <foundation/NSBundle.h>
#import <foundation/NSException.h>
#import <remote/NXConnection.h>
#import <remote/NXProxy.h>

#import <libc.h>

static id instance = nil;
NSString *DEOServerReinitialize = @"DEOServerReinitialize";

@implementation DEOServerMonitor

- (id <DEOServer>)server
{
    if(server) return server;

    if(wantLog) NSLog(@"DEOClient: try to connect to the server...\n");
    // Work around for bug (release note reference 51800):
    // This object is coming back retained instead of autoreleased,
    // so we don't send it retain here.
    server = (id <DEOServer>)[NXConnection connectToName:DEOServerName
                                                  onHost:"*"];

    if(!server) {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"DEOServer"
                                                          ofType:nil];
        int pid;

        if(wantLog) NSLog(@"DEOClient: fork a new server\n");

        if((pid = fork()) == 0  ) { // fork the server
            (void)execlp([path cString], [path cString], (char *)0);
            exit(0); // if exec fail...

        } else if(pid != -1) { // try to reconnect
            char here[1024];
            int retry = 20;

            gethostname(here, 1024);

            while((retry--) && (!server)) {
                sleep(1);
                if(wantLog) NSLog(@"DEOClient: try to connect to the new server...\n");
                // Work around for bug (release note reference 51800):
                // see above.
                server = (id <DEOServer>)[NXConnection connectToName:DEOServerName onHost:here];
            }
        }
    }

    if(server) {
        NXConnection *myConnection;

        if(wantLog) NSLog(@"DEOClient: run the connection");
        [(NXProxy *)server setProtocolForProxy:@protocol(DEOServer)];

        myConnection = [(NXProxy*)server connectionForProxy];
        [myConnection registerForInvalidationNotification:self];
        [myConnection runFromAppKit];
    } else {
        if(wantLog) NSLog(@"DEOClient: connection failed\n");
    }

    return server;
}

+ serverMonitor
{
    return [(instance ? [instance retain] : (instance = [self new])) autorelease];
}

- (void)dealloc
{
    NXConnection *myConnection = [(NXProxy*)server connectionForProxy];

    [myConnection unregisterForInvalidationNotification:self];
    NS_DURING
        [(NSObject *)server release];
    NS_HANDLER
        NSLog(@"Failed to send release to server.\n");
    NS_ENDHANDLER
    server = nil;
    instance = nil;
    [super dealloc];
}

- senderIsInvalid:sender
{
    if(wantLog) NSLog(@"DEOClient: Server dead !\n");
    server = nil;
    [[NSNotificationCenter defaultCenter] postNotificationName:DEOServerReinitialize object:self];
    return self;
}

@end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.