libs-base/Testing/thread-except.m
Adam Fedor 2b9ed0e196 Further copyright/license updates.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@21481 72102866-910b-0410-8b05-ffd578937521
2005-07-15 22:51:23 +00:00

102 lines
2.2 KiB
Objective-C

/* Test/example program for the base library
Copyright (C) 2005 Free Software Foundation, Inc.
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.
This file is part of the GNUstep Base Library.
*/
/* Test whether each thread has their own exception handlers. */
#ifndef _REENTRANT
#define _REENTRANT
#endif
#include <stdio.h>
#include <stdlib.h>
#include <Foundation/NSException.h>
#include <Foundation/NSString.h>
#include <Foundation/NSThread.h>
#include <Foundation/NSAutoreleasePool.h>
#define N 10 /* Number of threads */
#define MAX_ITER 10000.0 /* Max number of iterations. */
FILE *file;
@interface SingleThread : NSObject
{
int ident; // Identifier
}
- initWithInt: (int)n;
- (void)runWith: (id)thing;
@end
@implementation SingleThread
- initWithInt: (int)n
{
ident = n;
return self;
}
- (void)runWith: (id)thing
{
int i, n;
CREATE_AUTORELEASE_POOL(pool);
NS_DURING
n = 1+(int)((MAX_ITER*rand())/(RAND_MAX+1.0));
fflush(stdout);
for (i = 0; i < n; i++)
{
fprintf(file, "%d ", i);
fflush(file);
}
fflush(stdout);
[NSException raise: @"Some exception" format: @"thread %d", ident];
NS_HANDLER
printf("%s: %s for thread %d\n", [[localException name] cString],
[[localException reason] cString], ident);
NS_ENDHANDLER
DESTROY(pool);
[NSThread exit];
}
@end
int main()
{
int i;
SingleThread *threads[N];
CREATE_AUTORELEASE_POOL(pool);
printf("We run %d threads.\n", N);
printf("Some of them might not raise exceptions,\n");
printf("but the exception associated with each thread must match.\n");
file = fopen("/dev/null", "w");
srand(10);
for (i = 0; i < N; i++)
threads[i] = [[SingleThread alloc] initWithInt: i];
NS_DURING
for (i = 0; i < N; i++)
[NSThread detachNewThreadSelector: @selector(runWith:)
toTarget: threads[i] withObject: nil];
// Hopefully this will end after all the other threads end.
for (i = 0; i < N*MAX_ITER; i++)
{
fprintf(file, "%d", i);
fflush(file);
}
NS_HANDLER
printf("There's a runaway exception! Something is wrong!\n");
NS_ENDHANDLER
fclose(file);
DESTROY(pool);
return 0;
}