|
|
1.1 ! root 1: /* ! 2: DEOServerMonitor.m created by enoyau on Fri 13-Jan-1995 ! 3: ! 4: You may freely copy, distribute, and reuse the code in this example. ! 5: NeXT disclaims any warranty of any kind, expressed or implied, as to its ! 6: fitness for any particular use. ! 7: */ ! 8: ! 9: #import "DEOServerMonitor.h" ! 10: #import <foundation/NSNotification.h> ! 11: #import <foundation/NSAutoreleasePool.h> ! 12: #import <foundation/NSUtilities.h> ! 13: #import <foundation/NSBundle.h> ! 14: #import <foundation/NSException.h> ! 15: #import <remote/NXConnection.h> ! 16: #import <remote/NXProxy.h> ! 17: ! 18: #import <libc.h> ! 19: ! 20: static id instance = nil; ! 21: NSString *DEOServerReinitialize = @"DEOServerReinitialize"; ! 22: ! 23: @implementation DEOServerMonitor ! 24: ! 25: - (id <DEOServer>)server ! 26: { ! 27: if(server) return server; ! 28: ! 29: if(wantLog) NSLog(@"DEOClient: try to connect to the server...\n"); ! 30: // Work around for bug (release note reference 51800): ! 31: // This object is coming back retained instead of autoreleased, ! 32: // so we don't send it retain here. ! 33: server = (id <DEOServer>)[NXConnection connectToName:DEOServerName ! 34: onHost:"*"]; ! 35: ! 36: if(!server) { ! 37: NSString *path = [[NSBundle mainBundle] pathForResource:@"DEOServer" ! 38: ofType:nil]; ! 39: int pid; ! 40: ! 41: if(wantLog) NSLog(@"DEOClient: fork a new server\n"); ! 42: ! 43: if((pid = fork()) == 0 ) { // fork the server ! 44: (void)execlp([path cString], [path cString], (char *)0); ! 45: exit(0); // if exec fail... ! 46: ! 47: } else if(pid != -1) { // try to reconnect ! 48: char here[1024]; ! 49: int retry = 20; ! 50: ! 51: gethostname(here, 1024); ! 52: ! 53: while((retry--) && (!server)) { ! 54: sleep(1); ! 55: if(wantLog) NSLog(@"DEOClient: try to connect to the new server...\n"); ! 56: // Work around for bug (release note reference 51800): ! 57: // see above. ! 58: server = (id <DEOServer>)[NXConnection connectToName:DEOServerName onHost:here]; ! 59: } ! 60: } ! 61: } ! 62: ! 63: if(server) { ! 64: NXConnection *myConnection; ! 65: ! 66: if(wantLog) NSLog(@"DEOClient: run the connection"); ! 67: [(NXProxy *)server setProtocolForProxy:@protocol(DEOServer)]; ! 68: ! 69: myConnection = [(NXProxy*)server connectionForProxy]; ! 70: [myConnection registerForInvalidationNotification:self]; ! 71: [myConnection runFromAppKit]; ! 72: } else { ! 73: if(wantLog) NSLog(@"DEOClient: connection failed\n"); ! 74: } ! 75: ! 76: return server; ! 77: } ! 78: ! 79: + serverMonitor ! 80: { ! 81: return [(instance ? [instance retain] : (instance = [self new])) autorelease]; ! 82: } ! 83: ! 84: - (void)dealloc ! 85: { ! 86: NXConnection *myConnection = [(NXProxy*)server connectionForProxy]; ! 87: ! 88: [myConnection unregisterForInvalidationNotification:self]; ! 89: NS_DURING ! 90: [(NSObject *)server release]; ! 91: NS_HANDLER ! 92: NSLog(@"Failed to send release to server.\n"); ! 93: NS_ENDHANDLER ! 94: server = nil; ! 95: instance = nil; ! 96: [super dealloc]; ! 97: } ! 98: ! 99: - senderIsInvalid:sender ! 100: { ! 101: if(wantLog) NSLog(@"DEOClient: Server dead !\n"); ! 102: server = nil; ! 103: [[NSNotificationCenter defaultCenter] postNotificationName:DEOServerReinitialize object:self]; ! 104: return self; ! 105: } ! 106: ! 107: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.