| Thread overview |
|---|
January 06, 2004 implementation of fiber in D | ||||
|---|---|---|---|---|
| ||||
It is very important for the modern langauge
to have mechanism such as co-routine (like fiber in Win32).
I want to introduce my implementation of fiber, what is called , 'micro-thread' in D. micro-thread is too easy to implement. (If you have more interest, see Game Programming Gems 2)
A brief idea is to switch the stack frame like this :
asm {
naked;
push EBX;
push EBP;
push ESI;
push EDI;
// push dword ptr FS:[0]; // for SEH
xchg ESP,[EAX+8];
// pop dword ptr FS:[0]; // for SEH
pop EDI;
pop ESI;
pop EBP;
pop EBX;
ret;
}
FS:[0] means the pointer to SEH(Win32 structure exception handling) table.
If you want to use exception in micro-thread ,
you need to use SEH and provide the virtual stack buffer
from the real stack frame managed by Operating System.
Here is my implementation :
class MicroThread {
public:
void start(void delegate() start_func,int nStackSize/*=0x1000*/)
{
if (nStackSize) nStackSize_ = nStackSize;
if (!nStackSize_) nStackSize_ = 0x1000;
if (abyStack_.length < nStackSize_)
{
abyStack_ = new byte[nStackSize_];
}
register_esp_ = &abyStack_[0] + nStackSize_;
bEnd_ = false; bSuspended_ = false;
register_esp_start_ = register_esp_;
start_func_ = start_func;
ms_push(cast(uint)(&start_));
ms_push(0); // ebx
ms_push(0); // ebp
ms_push(0); // esi
ms_push(0); // edi
switchThread();
}
void start(void delegate () start_func)
{ start(start_func,0); }
void suspend()
{
bSuspended_ = true;
switchThread();
}
void sleep(int n)
{ while(--n >= 0) suspend(); }
void resume()
{
if (!isSuspended()) return ;
bSuspended_ = false;
switchThread();
}
bool isSuspended() { return bSuspended_;}
bool isEnd() { return bEnd_; }
void onMove() {
if (!isEnd()){
if (!isSuspended()) {
start(start_func_);
} else {
resume();
}
}
}
this() {}
this(void delegate () start_func)
{ start_func_ = start_func; }
this(void delegate () start_func,int nStackSize)
{ start_func_ = start_func; nStackSize_ = nStackSize; }
private:
byte* register_esp_; // ESP
byte* register_esp_start_;// ESP when start
bool bSuspended_; // suspend flag
bool bEnd_; // termination flag
byte[] abyStack_; // virtual stack
int nStackSize_; // virtual stack size
void delegate() start_func_; // function to call
static void start_(MicroThread mt) {
mt.start_func_();
mt.bEnd_ = true;
mt.switchThread();
}
void ms_push(uint u)
{
register_esp_ -= 4;
*cast(uint*)(register_esp_) = u;
}
void switchThread(){
asm {
naked;
push EBX;
push EBP;
push ESI;
push EDI;
// push dword ptr FS:[0]; // for SEH
xchg ESP,[EAX+8];
// pop dword ptr FS:[0]; // for SEH
pop EDI;
pop ESI;
pop EBP;
pop EBX;
ret;
}
}
};
| ||||
January 06, 2004 Re: implementation of fiber in D | ||||
|---|---|---|---|---|
| ||||
Posted in reply to yaneurao | > It is very important for the modern langauge > to have mechanism such as co-routine (like fiber in Win32). Quite true. > I want to introduce my implementation of fiber, what is called , 'micro-thread' in D. micro-thread is too easy to implement. (If you have more interest, see Game Programming Gems 2) I have that book. Maybe it's time I read it ... :) > A brief idea is to switch the stack frame like this : <snip> Do you have this in a form that you could contribute? I think it would be fantastic if we could get this in the language itself, but if it was a servicable library that would be fine. Matthew | |||
January 06, 2004 Re: implementation of fiber in D | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Matthew | In article <btd95o$1o1a$2@digitaldaemon.com>, Matthew says... >Do you have this in a form that you could contribute? >I think it would be fantastic if we could get this in the language itself, >but if it was a servicable library that would be fine. my micro-thread source code is included in my game library : http://www.sun-inet.or.jp/~yaneurao/dlang/english.html please use freely if you need. but obviously it is better to be supported in the language itself. Fortunately , GC in D is so conservative that virtual stack frame used by micro-thread is going well. GC in D would be scanning into virtual stack frame because it is allocated by GC's heap. But unfortunately my micro-thread is exception unsafe. | |||
January 06, 2004 Re: implementation of fiber in D | ||||
|---|---|---|---|---|
| ||||
Posted in reply to yaneurao | In article <btdqmo$2k29$1@digitaldaemon.com>, yaneurao@sun-inet.or.jp says... > > >my micro-thread source code is included in my game library : > >http://www.sun-inet.or.jp/~yaneurao/dlang/english.html > >please use freely if you need. Nice set of features. I now feel stupid for being waiting for a directory listing thing for over a month. That does it, from now on I will do windows ;) Ant | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply