/********************************************************************/
/*  Shinobi Library                                                 */
/*  Copyright (c) 1998-1999 SEGA                                    */
/*                                                                  */
/*  Library : fiber library (very simple thread library)            */
/*  Module  : Library Interface Header                              */
/*  File    : sg_syfbr.h                                            */
/*  Date    : 1999-07-28                                            */
/*  Version : 2.00                                                  */
/*  History :                                                       */
/********************************************************************/

#ifndef _SG_SYFBR_H_
#define _SG_SYFBR_H_

/********************************************************************/
/*  インクルードファイル                                            */
/*  include files                                                   */
/********************************************************************/
#include    <sg_xpt.h>

/********************************************************************/
/*  定数定義                                                        */
/*  constants                                                       */
/********************************************************************/
#define SYD_FBR_NULL            (NULL)       /* ファイバハンドルエラー値     */
#define SYD_FBR_OK              (0)          /* ファイバ関数戻り値           */
#define SYD_FBR_NG              (-1)         /* ファイバ関数戻り値           */

#define SYD_FBR_NOTEXISTFIBER   (-1)         /* ファイバ未生成               */
/********************************************************************/
/*  型定義                                                          */
/*  structure/union/enum                                            */
/********************************************************************/
typedef struct SyFbrS_INFO_tag{             /* ファイバ情報         */
    Void*       sp ;                        /* ファイバのスタックポインタ(fiber's stack pointer) */
    Void*       data ;                      /* ファイバのデータ          (fiber's data)          */
} SYS_FBR_INFO;                             /*                      */
typedef SYS_FBR_INFO*    SYFBR ;            /* ファイバハンドル     */
                                            /* fiber handle type    */
typedef Void (*SyFbrYfunc)(Void*) ;         /* ファイバ関数型       */
                                            /* fiber function type  */
#define SYD_FBR_FBRSIZE (sizeof(SYS_FBR_INFO)) /*                   */

/********************************************************************/
/*  関数定義                                                        */
/*  functions                                                       */
/********************************************************************/

#ifdef __cplusplus
extern "C"{                                 /* for C++ Interface    */
#endif  /* __cplusplus */

extern  Sint32  syFbrInit( Void*, Sint32) ;

extern  Sint32  syFbrPreInit( Sint32*, int );
extern  Sint32  syFbrExit   ( Void ) ;
extern  Sint32  syFbrSetIntStack( Void* ) ;

extern  SYFBR   syFbrCreateFiber( Void*,Uint32,SyFbrYfunc,Void* ) ;
extern  SYFBR   syFbrConvertThreadToFiber( Void* ) ;
extern  Sint32  syFbrDeleteFiber    ( SYFBR ) ;
extern  SYFBR   syFbrGetCurrentFiber( Void ) ;
extern  Void*   syFbrGetFiberData   ( Void ) ;

extern  Void    syFbrSwitchToFiber        ( SYFBR ) ;
extern  Void    syFbrDelayedSwitchToFiber ( SYFBR ) ;

extern  SYFBR syFbrGetMainFiber (Void) ;
extern  SYFBR syFbrInitEx(Void*, Sint32, Void*, Void* ) ;
extern  Void  syFbrSetCallback( Void(*)(SYFBR,SYFBR) ) ;

#ifdef __cplusplus
}                                           /* for C++ Interface    */
#endif /* __cpulspuls  */
#endif /* _SG_SYFBR_H_ */
/********************************************* End of fiber.h *******/
