Return to BSD News archive
Path: sserve!newshost.anu.edu.au!munnari.oz.au!network.ucsd.edu!library.ucla.edu!agate!spool.mu.edu!uwm.edu!daffy!uwvax!sinetnews!news.u-tokyo.ac.jp!graco!nitta
From: nitta@c.u-tokyo.ac.jp (Yoshihisa Nitta)
Newsgroups: comp.unix.bsd
Subject: Re: thread-implementation details
Message-ID: <NITTA.93Oct17021419@davinci.c.u-tokyo.ac.jp>
Date: 16 Oct 93 17:14:19 GMT
References: <CEw92y.GoA@ms.uky.edu>
Sender: news@graco.c.u-tokyo.ac.jp
Organization: Coll. Arts & Sci., University of Tokyo, Japan.
Lines: 51
In-reply-to: nimrod@ms.uky.edu's message of 14 Oct 93 15:44:56 GMT
In article <CEw92y.GoA@ms.uky.edu> nimrod@ms.uky.edu (B. A Krishna) writes:
>I am attempting to implement a user-level thread library on sun4. I need to
>be able to execute a thread in its own allocated stack and for this reason,
>I need to be able to modify the stack pointer to point to the top of the new
>thread's stack at thread creation time. Is there any way of achieving this
How about using _setjmp/_longjmp functions?
With them, thread can be implemented portable to work on
Sun4, Sun3, 386bsd, ...
Be sure the address of new stack pointer (newsp in the below)
must be aligned to 8 bytes (last 3 bits are 0) on SPARC.
#include <setjmp.h>
/* jmp_buf index */
#if defined(sun)
# define SP 2
# define PC 3
# if defined(sparc)
# define NPC 4
# endif /* sparc */
#elif defined(_386BSD_) /* !sun*/
#define intel386
#define SP 2
#define PC 0
#else /* sony cisc-news */
#define SP 9
#define PC 10
#endif /* !sun */
create_thread()
{
jmp_buf env, newenv;
i = _setjmp(env);
if (!i) {
bcopy(env,newenv,sizeof(jmp_buf));
newenv[SP]=(int)newsp; /* new stack */
newenv[PC]=(int)func; /* C function executed in the new thread */
#if defined(sparc)
newenv[NPC]=newenv[PC]+4; /* only SPARC */
#endif
_longjmp(newenv,1);
/* NOT REACHED */
}
/* continue point with _longjmp(env) */
...
}
--
Yoshihisa Nitta, Univ. of Tokyo, Japan
[Tel] +81-3-3469-5388(dialin) or +81-3-3467-1171(ex)542 [Fax] +81-3-3465-2896
[e-mail] nitta@c.u-tokyo.ac.jp