This is TWS.m in view mode; [Download] [Up]
#import "TWS.h"
#import <stdio.h>
#import <appkit/Matrix.h>
#import <appkit/TextField.h>
static TWS *sf;
@implementation TWS
- incField:(int)fnum
{
int i,max=201;
id target;
target=[fields findCellWithTag:fnum];
for(i=0;i<max;i++){
// debugging code-- this slows things down ALOT
// mutex_lock(printM);
// fprintf(stderr, "incing %d\n", fnum);
// mutex_unlock(printM);
if(!(i%10)){
mutex_lock(lockM);
[target setIntValue:i];
mutex_unlock(lockM);
}
cthread_yield();
}
mutex_lock(doneM);
threadCount--;
condition_signal(doneC);
mutex_unlock(doneM);
mutex_lock(printM);
fprintf(stderr, "Thread %d FINISHED...\n",fnum);
mutex_unlock(printM);
return self;
}
void dofield(int fnum)
{
[sf incField:fnum];
}
- init
{
fprintf(stderr, "Initializing TWS...\n");
lockM=mutex_alloc();
printM=mutex_alloc();
doneM=mutex_alloc();
doneC=condition_alloc();
sf=self;
return self;
}
- doIt:sender
{
int i=0;
int count=10;
threadCount=0;
for(i=0;i<count;i++){
mutex_lock(printM);
fprintf(stderr, "Starting thread %d....\n",i);
mutex_unlock(printM);
mutex_lock(lockM);
cthread_detach(cthread_fork((cthread_fn_t)dofield, (any_t)i));
mutex_lock(doneM);
threadCount++;
mutex_unlock(doneM);
mutex_unlock(lockM);
}
mutex_lock(doneM);
while(threadCount != 0)
condition_wait(doneC,doneM);
mutex_unlock(doneM);
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.