Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 01 Nov 1999 15:17:42 -0800
From:      Jake Burkholder <jake@checker.org>
To:        Peter Dufault <dufault@hda.com>
Cc:        freebsd-arch@freebsd.org
Subject:   Re: Threads goals version III 
Message-ID:  <19991101231743.F30501FD7@io.yi.org>
In-Reply-To: Your message of "Mon, 01 Nov 1999 16:53:10 EST." <199911012153.QAA19185@hda.hda.com> 

next in thread | previous in thread | raw e-mail | index | archive | help
> Obviously he can't return though.  Here's what I would
> argue for in setting a standards document:
> 
> main()
> {
> 	int mainvar;
> 
> 	newthread(t1);	/* t1 is a thread and it can access mainvar... */
> 
> 	sub();
> }
> 
> sub()
> {
> 	int subvar;
> 
> 	newthread(t2);	/* t2 can access subvar or mainvar, but maybe
> 			 * t1 can't access subvar.
> 			 * Maybe the stack just crossed a page boundary.
> 			 */
> 
> 	while(1)
> 		keep_stack_context();
> }
> 

I think there's confusion here, forking a new thread is not like
forking a new process.  A start routine needs to be passed in
and a new stack and context setup, so the thread begins execution
as if start_routine were its "main".  See Daniel's
{get,set,make,swap}context diffs.

I supposed that newthread(t1) could mean that there is now
a new thread, which starts executing at the point newthread
was called (in main), only on a new stack, but that doesn't
seem to me to be the way it is commonly implemented.

int global;  /* all threads can access this */

main() {
	thread t1;
	int mainvar;
	
	/* this could also be mmaped or stack based storage */
	t.stack = malloc(some memory);

	new_thread(&t1, foo, 1, &mainvar);

	sub();

	wait(t1);
}

sub() {
	thread t2;
	int subvar;
	/* t1 has no access to this at all */

	new_thread(&t2, foo, 1, &subvar);

	wait(t2);
}

foo(int ac, ...) {	
	int *p;
	va_list ap;

	assert(ac == 1);

	va_start(ap, ac);
	p = va_arg(ap, int *)
	va_end(ap);

	/* t1 now has access to mainvar through p */
	/* t2 now has access to subvar through p */
}

The WHOLE address space is shared.  You can pass around
pointers to stack based storage, but a new thread executes
a new start_routine, so it can't access variables from the
scope in which new_thread was called, only what get passed
into start_routine.

At least that is my understanding.  Apologies if I
misinterpreted what you were trying to say.






To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19991101231743.F30501FD7>