root/lang/objective-cplusplus/i3/trunk/tmp/distant.m @ 36642

Revision 36642, 5.6 kB (checked in by saturday06, 3 years ago)

aaaaa

Line 
1// -*- coding: utf-8-dos -*-
2
3#import <Foundation/Foundation.h>
4//#import <Appkit/Appkit.h>
5
6#define NUM_THREADS 2
7
8@interface SubTask : NSObject {
9@private
10    NSNumber* taskNumber;
11    SubTask* proxies[NUM_THREADS];
12}
13- (NSArray*)createConnectionData;
14- (oneway void)addNewThread:(NSArray*)data;
15- (void)startThread:(NSNumber*)data;
16- (oneway void)hello;
17@end
18
19SubTask* proxies[NUM_THREADS];
20
21@interface MainTask : NSObject {
22}
23- (void)addNewThread:(NSArray*)data;
24- (void)start;
25@end
26
27@implementation MainTask
28- (void)start {
29    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
30    NS_DURING
31    {
32        //[NSApplication sharedApplication];
33
34
35        int task_num = 0;
36        for (task_num = 0; task_num < NUM_THREADS; task_num++) {
37            proxies[task_num] = nil;
38        }       
39
40        for (task_num = 0; task_num < NUM_THREADS; task_num++) {
41            NSNumber* taskNumber = [[NSNumber numberWithInt:task_num] retain];
42            SubTask* task = [[[SubTask alloc] init] retain];
43            [NSThread detachNewThreadSelector:@selector(startThread:)
44                      toTarget:task
45                      withObject:taskNumber];
46        }
47
48        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]];
49    }
50    NS_HANDLER
51    {
52        NSLog(@"Exception name=[%s] reason=[%s]\n",
53              [[localException name] UTF8String],
54              [[localException reason] UTF8String]);
55    }
56    NS_ENDHANDLER;
57    [pool release];
58}
59
60
61- (void)addNewThread:(NSArray*)data {
62    NSNumber* taskNumber = [data objectAtIndex:0];
63    NSPort* port1 = [data objectAtIndex:1];
64    NSPort* port2 = [data objectAtIndex:2];
65
66    int task_num = [taskNumber intValue];
67    NSConnection* connection = [NSConnection connectionWithReceivePort:port2
68                                                           sendPort:port1];
69    [connection retain];
70
71    proxies[task_num] = [(SubTask*)[[connection rootProxy] retain] retain];
72
73    int i = 0;
74    for (i = 0; i < NUM_THREADS; i++) {
75        if (i == task_num) {
76            continue;
77        }
78        if (proxies[i] == nil) {
79            continue;
80        }
81
82        NSArray* newData = [proxies[task_num] createConnectionData];
83
84        NS_DURING
85        {
86            [proxies[i] addNewThread:newData];
87        }
88        NS_HANDLER
89        {
90            NSLog(@"Exception name=[%s] reason=[%s]\n",
91                  [[localException name] UTF8String],
92                  [[localException reason] UTF8String]);
93        }
94        NS_ENDHANDLER;
95
96    }
97}
98@end
99
100MainTask* mainTask = nil;
101
102@implementation SubTask
103
104- (oneway void)hello {
105    NSLog(@"hello");
106}
107
108- (oneway void)addNewThread:(NSArray*)data {
109    NSNumber* subTaskNumber = [data objectAtIndex:0];
110    int sub_task_num = [subTaskNumber intValue];
111    NSLog(@"a");
112    NSPort* port1 = [data objectAtIndex:1];
113    NSLog(@"b");
114    NSPort* port2 = [data objectAtIndex:2];
115    NSLog(@"c");
116    NSConnection* connection = [NSConnection connectionWithReceivePort:port2
117                                                              sendPort:port1];
118    [connection retain];
119    NSLog(@"d");
120
121    proxies[sub_task_num] = [(SubTask*)[[connection rootProxy] retain] retain];
122    NSLog(@"e");
123
124    int i = 0;
125    for (i = 0; i < NUM_THREADS; i++) {
126        if (proxies[i] == nil) {
127            NSLog(@"f");
128            continue;
129        }
130        NSLog(@"g");
131        [proxies[i] hello];
132    }
133    NSLog(@"h");
134}
135
136- (NSArray*)createConnectionData {
137    [[taskNumber retain] retain];
138
139    NSPort* port1 = [NSPort port];
140    NSPort* port2 = [NSPort port];
141    [[port1 retain] retain];
142    [[port2 retain] retain];
143
144    if (port1 == nil || port2 == nil) {
145        NSLog(@"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
146    }
147
148    NSConnection *serverConnection =
149        [[NSConnection alloc] initWithReceivePort:port1
150                                         sendPort:port2];
151    [[serverConnection retain] retain];
152    [serverConnection setRootObject:self];
153
154    NSArray* data = [NSArray arrayWithObjects:taskNumber, port1, port2, nil];
155    [[data retain] retain];
156    return data;
157}
158
159- (void)startThread:(NSNumber*)taskNumber_ {
160    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
161
162    NS_DURING
163    {
164        int i = 0;
165        for (i = 0; i < NUM_THREADS; i++) {
166            proxies[i] = nil;
167        }
168
169        taskNumber = taskNumber_;
170
171        NSArray* data = [self createConnectionData];
172        [[data retain] retain];
173       
174        @synchronized (mainTask) {
175            [mainTask performSelectorOnMainThread:@selector(addNewThread:)
176                      withObject:data
177                      waitUntilDone:NO];
178        }
179
180        [[NSRunLoop currentRunLoop] run];
181    } 
182    NS_HANDLER
183    {
184        NSLog(@"Exception name=[%s] reason=[%s]\n",
185              [[localException name] UTF8String],
186              [[localException reason] UTF8String]);
187    }
188    NS_ENDHANDLER;
189       
190
191    [pool release];
192}
193@end
194
195int main() {
196    fputs("main()\n", stderr);
197
198    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
199    NS_DURING
200    {
201        mainTask = [[MainTask alloc] init];
202        [mainTask start];
203        [mainTask release];
204    }
205    NS_HANDLER
206    {
207        NSLog(@"Exception name=[%s] reason=[%s]\n",
208              [[localException name] UTF8String],
209              [[localException reason] UTF8String]);
210    }
211    NS_ENDHANDLER;
212    [pool release];
213     
214    fputs("main() return\n", stderr);
215    return 0;
216}
217
218
219
Note: See TracBrowser for help on using the browser.