gstreamer/gst/cothreads/test-pthreads.c
Andy Wingo 259c8c394c some compile fixes, api changes, and i added the ability to create new chunks on the stack, which can extend the main...
Original commit message from CVS:
some compile fixes, api changes, and i added the ability to create new chunks on the
stack, which can extend the main thread's stack up to 8M under linuxthreads. thanks
to billh for the {set,get}rlimit tip.

on the other hand, there's a nasty bug in cothreads when they are run without gthreads
that i'm still tracking down. that's the last bug though, at this point.

the commit is to syn the repository with my working copy before moving cothreads to a
separate module.
2002-02-02 19:07:10 +00:00

61 lines
1.7 KiB
C

#include <stdio.h>
#include "linuxthreads.h"
#include <sys/resource.h>
#include <unistd.h>
/* this function is only really necessary to get the main thread's
* pthread_descr, as the other threads store the pthread_descr (actually the
* first member of struct _pthread_descr_struct, which points to itself for the
* default (non-indirected) case) at the top of the stack. */
static _pthread_descr linuxthreads_self()
{
pthread_mutexattr_t mutexattr;
pthread_mutex_t mutex;
_pthread_descr self;
pthread_mutexattr_init (&mutexattr);
pthread_mutexattr_setkind_np (&mutexattr, PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutex_init (&mutex, &mutexattr);
pthread_mutex_lock (&mutex);
self = mutex.__m_owner;
pthread_mutex_unlock (&mutex);
printf ("pthread_self: %d\n", pthread_self());
printf ("descr: %p\n", self);
printf ("*descr: %p\n", *(int*)self);
return self;
}
void *pthread (void *unused)
{
char *sp = CURRENT_STACK_FRAME;
linuxthreads_self();
printf ("sp: %p\n", sp);
printf ("sp | 0x020000: 0x%x\n", (int) sp | 0x020000 );
printf ("(sp | (0x020000-1))+1 - 1K: 0x%x\n", ((((int)sp | (STACK_SIZE-1))+1) - 1024));
printf ("*(sp | (0x020000-1))+1 - 1K: %p\n", *(int*)((((long int)sp | (STACK_SIZE-1))+1) - 1024));
printf ("(sp &~ (0x020000-1))+1: 0x%x\n", (((int)sp &~ (STACK_SIZE-1))+1));
return NULL;
}
int main (int argc, char *argv[])
{
pthread_t tid;
int i;
struct rlimit limit;
for (i=0; i<5; i++) {
pthread_create (&tid, NULL, pthread, NULL);
sleep(1);
}
linuxthreads_self();
getrlimit (RLIMIT_STACK, &limit);
printf ("\nstack size: %d\nmax stack sizeL %d\n", limit.rlim_cur, limit.rlim_max);
exit (0);
}