-
Notifications
You must be signed in to change notification settings - Fork 3
/
listing5.html
executable file
·368 lines (290 loc) · 13.5 KB
/
listing5.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<!-- BEGIN META TAG INFO -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="home" href="http://developer.apple.com/">
<link rel="find" href="http://developer.apple.com/search/">
<link rel="stylesheet" type="text/css" href="../../documentation/css/adcstyle.css" title="fonts">
<script language="JavaScript" src="../../documentation/js/adc.js" type="text/javascript"></script>
<!-- END META TAG INFO -->
<!-- BEGIN TITLE -->
<title>SimpleThreads - /TransferServer.m</title>
<!-- END TITLE -->
<script language="JavaScript">
function JumpToNewPage() {
window.location=document.scpopupmenu.gotop.value;
return true;
}
</script>
</head>
<!-- BEGIN BODY OPEN -->
<body>
<!--END BODY OPEN -->
<!-- START CENTER OPEN -->
<center>
<!-- END CENTER OPEN -->
<!-- BEGIN LOGO AND SEARCH -->
<!--#include virtual="/includes/adcnavbar"-->
<!-- END LOGO AND SEARCH -->
<!-- START BREADCRUMB -->
<div id="breadcrumb">
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td scope="row"><img width="340" height="10" src="images/1dot.gif" alt=""></td>
<td><img width="340" height="10" src="images/1dot.gif" alt=""></td>
</tr>
<tr valign="middle">
<td align="left" colspan="2">
<a href="http://developer.apple.com/">ADC Home</a> > <a href="../../referencelibrary/index.html">Reference Library</a> > <a href="../../samplecode/index.html">Sample Code</a> > <a href="../../samplecode/Cocoa/index.html">Cocoa</a> > <a href="../../samplecode/Cocoa/idxRuntimeArchitecture-date.html">Runtime Architecture</a> > <A HREF="javascript:location.replace('index.html');">SimpleThreads</A> >
</td>
</tr>
<tr>
<td colspan="2" scope="row"><img width="680" height="35" src="images/1dot.gif" alt=""></td>
</tr>
</table>
</div>
<!-- END BREADCRUMB -->
<!-- START MAIN CONTENT -->
<!-- START TITLE GRAPHIC AND INTRO-->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td><h1><div id="pagehead">SimpleThreads</div></h1></td>
</tr>
</table>
<!-- END TITLE GRAPHIC AND INTRO -->
<!-- START WIDE COLUMN -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td id="scdetails">
<h2>/TransferServer.m</h2>
<form name="scpopupmenu" onSubmit="return false;" method=post>
<p><strong>View Source Code:</strong>
<select name="gotop" onChange="JumpToNewPage();" style="width:340px"><option selected value="ingnore">Select File</option>
<option value="listing1.html">/Controller.h</option>
<option value="listing2.html">/Controller.m</option>
<option value="listing3.html">/main.m</option>
<option value="listing4.html">/TransferServer.h</option>
<option value="listing5.html">/TransferServer.m</option></select>
</p>
</form>
<p><strong><a href="SimpleThreads.zip">Download Sample</a></strong> (“SimpleThreads.zip”, 56.7K)<BR>
<strong><a href="SimpleThreads.dmg">Download Sample</a></strong> (“SimpleThreads.dmg”, 117.9K)</p>
<!--
<p><strong><a href="#">Download Sample</a></strong> (“filename.sit”, 500K)</p>
-->
</td>
</tr>
<tr>
<td scope="row"><img width="680" height="10" src="images/1dot.gif" alt=""><br>
<img height="1" width="680" src="images/1dot_919699.gif" alt=""><br>
<img width="680" height="20" src="images/1dot.gif" alt=""></td>
</tr>
<tr>
<td scope="row">
<!--googleon: index -->
<pre class="sourcecodebox">/* File: TransferServer.m Contains: Sample server class, talked to through Distributed Objects. Written by: Quinn "The Eskimo!". Modified by Timothy Carroll Created: Tue 10-Jun-1997 Copyright: (c)1997 by Apple Computer, Inc., all rights reserved. Change History (most recent first): You may incorporate this sample code into your applications without restriction, though the sample code has been provided "AS IS" and the responsibility for its operation is 100% yours. However, what you are not permitted to do is to redistribute the source as "DSC Sample Code" after having made changes. If you're going to re-distribute the source, we require that you make it clear in the source that the code was descended from Apple Sample Code, but that you've made changes.*/#import "TransferServer.h"#import "Controller.h"// IMPORTANT: See the documentation ("ReadMe.rtf" under Supporting Files) for// big picture information about this project.static long transferCount; // This variable holds the count of the number of transfers // by any object of this class. We use this to generate the // transfer ID for a transfer, which is helpful in debugging // the output of the transfers, matching up starts with finishes // and so on.static NSLock *transferCountLock; // This is a lock for the above variable because it's used by // multiple different threads.static long threadCount;static NSLock *threadCountLock;static NSConnection *theConnection;@implementation TransferServer+ (void)initialize // This method is called before any other methods in our class // are called. We use it to set up the transferCount variable // and its lock.{ static BOOL tooLate = NO; // initialize should only be called once. If it's called // a second time, something weird is happening, and we want // to know about it. NSAssert( ! tooLate, @"Hmm, duplicate initialize messages"); transferCount = 0; transferCountLock = [[NSLock alloc] init]; NSAssert( transferCountLock != nil, @"Could not create transferCountLock"); threadCount = 0; threadCountLock = [[NSLock alloc] init]; NSAssert( threadCountLock != nil, @"Could not create threadCountLock"); tooLate = YES;}+ (long)newTransferID // This method increments the transferCount global variable // and returns it as the new transfer ID. Transfer operations // call this method to get a unique ID with which to stamp // their transfers, which helps in debugging the concurrent // operations in progress. Note that we have to lock // transferCount before modifying it, let another thread // execute while we're halfway through modifying it.{ long result; [transferCountLock lock]; transferCount += 1; result = transferCount; [transferCountLock unlock]; return (result);}+ (void)connectWithPorts:(NSArray *)portArray // See comments in implementation part.{ NSAutoreleasePool *pool; NSConnection *connectionToController; TransferServer *serverObject; // First we must create an autorelease pool. Methods that we invoke // are going to expect to be able to do [object autorelease], but this // doesn't work unless we explicitly create an autorelease pool because // we're running in a new thread, and threads don't start off with a // default autorelease pool. pool = [[NSAutoreleasePool alloc] init]; // Now we connect back to the main thread using the ports given in our // portArray argument. Note the subtle difference in that we use // connectWithReceivePort here, whereas Controller's init method uses // initWithReceivePort. connectionToController = [NSConnection connectionWithReceivePort:[portArray objectAtIndex:0] sendPort:[portArray objectAtIndex:1]]; // Now create a server object. In this example, we only have one server // object to handle all requests. serverObject = [[self alloc] init]; // Now get the proxy of the root object at the other end of the connection // (which was set to be the controller object in Controller's init method) // and send it the setServer message so that it knows about our server object. // Note that there is nothing magic about the method name "setServer"; it's // merely the name I decided to use when designing these two objects. [connectionToController setRootObject:serverObject]; // We now release our server object, so the controller has the only reference // to it. Well, actually, the NSConnection also has a reference to it, // which is what keeps the object around until the main thread picks it up. [serverObject release];theConnection = connectionToController; // Now we enter our run loop. The run loop waits looking for events and // executes them. In the case of a non-application thread, the source // of events is the NSConnections installed in the loop. In our case, this // in the NSConnection we created earlier in this routine. When a DO // message arrives on our receive port, the run loop unpackages the message // and executes the corresponding Objective-C method. [[NSRunLoop currentRunLoop] run]; // Clean up. [pool release]; [NSThread exit]; return;}- (id)init // See comments in interface part.{ self = [super init]; if (self != nil) { [threadCountLock lock]; threadCount += 1; threadID = threadCount; [threadCountLock unlock]; } return (self);}- (oneway void)slowTransfer:(Controller *)controller // See comments in interface part.{ long i; long transferID; transferID = [TransferServer newTransferID]; [controller outputString:[NSString stringWithFormat:@"Thread = %02ld, Connection's retain count is %02ld\n", threadID , [theConnection retainCount]]]; [controller outputString:[NSString stringWithFormat:@"Thread = %02ld, Connection's retain count is %02ld\n", threadID , [theConnection retainCount]]]; [controller outputString:[NSString stringWithFormat:@" Starting slowTransfer Thread=%02ld, ID=%02ld\n", threadID, transferID] ]; for (i = 0; i < 3; i++) { // Sleep for 1 second and then output a progress string to the controller. // You could substitute any other synchronous activity here, such as an // extended computation, or blocking I/O (file system or network). [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; [controller outputString: [NSString stringWithFormat:@" Doing slowTransfer Thread=%02ld, ID=%02ld, Step=%ld\n", threadID, transferID , i] ]; } [controller outputString:[NSString stringWithFormat:@" Finished slowTransfer Thread=%02ld, ID=%02ld\n", threadID, transferID]]; [controller outputString:[NSString stringWithFormat:@"Thread = %02ld, Connection's retain count is %02ld\n", threadID , [theConnection retainCount]]]; [controller serverFinished:self];}- (oneway void)slowerTransfer:(Controller *)controller // See comments in interface part.{ long i; long transferID; transferID = [TransferServer newTransferID]; [controller outputString:[NSString stringWithFormat:@" Starting slowerTransfer Thread=%02ld, ID=%02ld\n", threadID, transferID]]; for (i = 0; i < 10; i++) { // See comment in slowTransfer:. [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; [controller outputString: [NSString stringWithFormat:@" Doing slowerTransfer Thread=%02ld, ID=%02ld, Step=%ld\n", threadID, transferID , i] ]; } [controller outputString:[NSString stringWithFormat:@" Finished slowerTransfer Thread=%02ld, ID=%02ld\n", threadID, transferID]]; [controller outputString:[NSString stringWithFormat:@"Thread = %02ld, Connection's retain count is %02ld\n", threadID , [theConnection retainCount]]]; [controller serverFinished:self];}@end</pre>
<!--googleoff: index -->
</td>
</tr>
</table>
<!-- END WIDE COLUMN -->
<!-- END MAIN CONTENT -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><div style="width: 100%; height: 1px; background-color: #919699; margin-top: 5px; margin-bottom: 15px"></div></td>
</tr>
<tr>
<td align="center"><br/>
<table border="0" cellpadding="0" cellspacing="0" class="graybox">
<tr>
<th>Did this document help you?</th>
</tr>
<tr>
<td>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=1&url=/samplecode/SimpleThreads/listing5.html%3Fid%3DDTS10000756-1.0&media=dvd" target=_new>Yes</a>: Tell us what works for you.</div>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=2&url=/samplecode/SimpleThreads/listing5.html%3Fid%3DDTS10000756-1.0&media=dvd" target=_new>It’s good, but:</a> Report typos, inaccuracies, and so forth.</div>
<div><a href="http://developer.apple.com/feedback/?v=3&url=/samplecode/SimpleThreads/listing5.html%3Fid%3DDTS10000756-1.0&media=dvd" target=_new>It wasn’t helpful</a>: Tell us what would have helped.</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- START BOTTOM APPLE NAVIGATION -->
<!--#include virtual="/includes/footer"-->
<!-- END BOTTOM APPLE NAVIGATION -->
<!-- START CENTER CLOSE -->
</center>
<!-- END CENTER CLOSE -->
</body>
</html>