mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-16 21:36:35 +00:00
d48d5c640a
Original commit message from CVS: added a test for pth and pthreads. in summary, it doesn't work because in __pthread_find_self() some funny stack pointer math is done that will result in no matches for __pthread_find_self(). this is dereferenced in __errno_location, causing a segfault on context switch because of the errno-swapping on the part of pth. it's a mess and i don't know how to get around it. i'll have to look into what ngpt does for looking up errno, as it has kernel threads as well as user threads.
85 lines
2.1 KiB
C
85 lines
2.1 KiB
C
#include "pth_p.h"
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <pthread.h>
|
|
|
|
#ifndef CURRENT_STACK_FRAME
|
|
#define CURRENT_STACK_FRAME ({ char __csf; &__csf; })
|
|
#endif /* CURRENT_STACK_FRAME */
|
|
|
|
pth_mctx_t main_context;
|
|
int threadnum = 0;
|
|
/*
|
|
int *__errno_location()
|
|
{
|
|
static pth_mctx_t ctx;
|
|
|
|
errno_shield {
|
|
pth_mctx_save (&ctx);
|
|
}
|
|
|
|
return &ctx.error;
|
|
return &main_context.error;
|
|
}
|
|
*/
|
|
void thread (char *str)
|
|
{
|
|
printf ("1.1: current stack frame: %p\n", CURRENT_STACK_FRAME);
|
|
printf ("1.1: sleeping 2s in thread %d...\n", threadnum);
|
|
sleep (2);
|
|
printf ("1.1: current stack frame: %p\n", CURRENT_STACK_FRAME);
|
|
printf ("1.1: returning to cothread 0\n");
|
|
pth_mctx_restore (&main_context);
|
|
}
|
|
|
|
void pthread (void* unused)
|
|
{
|
|
pth_mctx_t ctx;
|
|
char *skaddr;
|
|
|
|
printf ("1: saving the main context\n");
|
|
printf ("1: current stack frame: %p\n", CURRENT_STACK_FRAME);
|
|
pth_mctx_save (&main_context);
|
|
|
|
while (1) {
|
|
skaddr = malloc (1024 * 1024);
|
|
|
|
printf ("1: current stack frame: %p\n", CURRENT_STACK_FRAME);
|
|
printf ("1: spawning a new cothread\n");
|
|
pth_mctx_set (&ctx, thread, skaddr, skaddr + 1024 * 1024);
|
|
printf ("1: new thread's stack frame will be in the heap at %p\n", skaddr);
|
|
|
|
printf ("1: current stack frame: %p\n", CURRENT_STACK_FRAME);
|
|
printf ("1: switching to cothread %d...\n", ++threadnum);
|
|
|
|
printf ("1: current stack frame: %p\n", CURRENT_STACK_FRAME);
|
|
pth_mctx_switch (&main_context, &ctx);
|
|
|
|
printf ("1: current stack frame: %p\n", CURRENT_STACK_FRAME);
|
|
printf ("1: back now, looping\n");
|
|
}
|
|
}
|
|
|
|
|
|
int main (int argc, char *argv[])
|
|
{
|
|
pthread_t tid;
|
|
|
|
printf ("0: current stack frame: %p\n", CURRENT_STACK_FRAME);
|
|
printf ("0: creating the pthread\n");
|
|
pthread_create (&tid, NULL, pthread, NULL);
|
|
|
|
// printf ("joining the pthread\n");
|
|
// pthread_join (tid, NULL);
|
|
|
|
printf ("0: current stack frame: %p\n", CURRENT_STACK_FRAME);
|
|
printf ("0: take five...\n");
|
|
sleep(5);
|
|
|
|
printf ("0 current stack frame: %p\n", CURRENT_STACK_FRAME);
|
|
printf ("exiting\n");
|
|
|
|
exit (0);
|
|
}
|
|
|