Annotation of Examples/DistributedObjects/MultipleThreads/MultiThreadedServer.m, revision 1.1

1.1     ! root        1: #import <objc/Object.h>
        !             2: #import <remote/NXConnection.h>
        !             3: #import <remote/NXProxy.h>
        !             4: #import <mach/cthreads.h>
        !             5: #import <machkit/NXPort.h>
        !             6: #import <stdio.h>
        !             7: 
        !             8: /*
        !             9:  * A simple, multi-threaded example.
        !            10:  * Each new client gets a dedicated thread.
        !            11:  */
        !            12: 
        !            13: @protocol ServerProtocol
        !            14: - newThread;
        !            15: - (int) doWork;
        !            16: @end
        !            17: 
        !            18: @interface MTS : Object <ServerProtocol,NXSenderIsInvalid>
        !            19: @end
        !            20: 
        !            21: @implementation MTS
        !            22: // when a new client shows up, build a private connection to it
        !            23: - connection: (NXConnection *)oldConn didConnect:(NXConnection *)newConn {
        !            24:        id      outPort = [newConn outPort];
        !            25:        NXProxy *bogus = [NXConnection connectToPort:outPort];
        !            26:        NXConnection *newnewConn = [bogus connectionForProxy];
        !            27: 
        !            28:        [newConn free]; // don't need new connection on old inPort
        !            29:        [newnewConn runInNewThread];    // service new things in new thread
        !            30:        [newnewConn setRoot:self];      // give new conn a root to serve!
        !            31:        [newnewConn registerForInvalidationNotification:self];
        !            32:        return newnewConn;      // service this first request in main thread
        !            33: }
        !            34: - newThread {
        !            35:        return self;    // this will point to newnewConn (and new thread)
        !            36: }
        !            37: - (int) doWork {
        !            38:        return (int) cthread_self();
        !            39: }
        !            40: 
        !            41: - senderIsInvalid:sender {
        !            42:        [sender free];
        !            43:        return self;
        !            44: }
        !            45: @end
        !            46: 
        !            47: void main() {
        !            48:        MTS *mts;
        !            49:        NXConnection *server;
        !            50:        id proxy1, proxy2;
        !            51: 
        !            52: //     [NXConnection debug:"MTS "];
        !            53:        mts = [MTS new];
        !            54:        server = [NXConnection registerRoot:mts withName:"MTS example"];
        !            55:        if (server) {   // we're it!
        !            56:                // start up a new thread that will deliver client death notifications
        !            57:                [NXPort worryAboutPortInvalidation];
        !            58: 
        !            59:                // tell initial connection to tell us about new incoming connections
        !            60:                [server setDelegate:mts];
        !            61: 
        !            62:                // serve requests
        !            63:                [server run];
        !            64:        }
        !            65:        else {
        !            66:                [mts free];
        !            67:                proxy1 = [NXConnection connectToName:"MTS example"];
        !            68: 
        !            69:                if (!proxy1) {
        !            70:                        printf("couldn't get to server\n");
        !            71:                        exit(1);
        !            72:                }
        !            73:                [proxy1 setProtocolForProxy:@protocol(ServerProtocol)];
        !            74: 
        !            75:                proxy2 = [proxy1 newThread];
        !            76:                if (!proxy2) {
        !            77:                        printf("couldn't get new thread\n");
        !            78:                        exit(2);
        !            79:                }
        !            80:                [proxy2 setProtocolForProxy:@protocol(ServerProtocol)];
        !            81: 
        !            82:                printf("new thread is %x\n", [proxy2 doWork]);
        !            83:        }
        !            84:        exit(0);
        !            85: }
        !            86:        

unix.superglobalmegacorp.com

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