Update to bsnes v028 release.
Changelog:
- OpenGL (with hardware filter mode support) and SDL video drivers added to Linux port
- OpenAL (with speed regulation disable support) and OSS audio drivers added to Linux port [Nach]
- SDL input driver (with joypad support) added to Linux port
- Emulator pause option added
- Added option to select behavior of bsnes when idle: allow input, ignore input or pause emulator
- Added support to remap common GUI actions to key/joypad presses on the "Input Configuration" screen
- bsnes will now clamp the video output size when it is larger than the screen resolution
- GUI library has been enhanced, and renamed to hiro
- Fullscreen mode now always centers video, rather than approximates
- Fullscreen mode now works correctly on Linux/Openbox
- Extra layer of abstraction in src/ui has been removed, as GUI lib unifies all ports anyway
- Video, audio and input drivers unified into standard library, named ruby
- All custom headers have been merged into a new template library, named nall
- Makefile rewritten, vastly improved. Allows quick toggling of compiled-in drivers
- Makefile: all object files now placed in /src/obj, binary placed in /
- libco greatly enhanced, no longer requires an assembler to build [byuu, blargg, Nach]
- libco SJLJ driver added; bsnes should now build on any Unix-derivative now (Solaris, OS X, PS3, etc) [Nach]
- Fixed register $213e.d4 PPU1 open bus behavior [zones]
- Windows port will not activate screensaver while bsnes is running [Nightcrawler]
- Visual C++ target no longer requires stdint.h
- And lots more -- mostly code refactoring related
2008-02-04 16:16:34 +00:00
|
|
|
/*
|
|
|
|
libco.ucontext (2008-01-28)
|
|
|
|
author: Nach
|
|
|
|
license: public domain
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* WARNING: the overhead of POSIX ucontext is very high,
|
|
|
|
* assembly versions of libco or libco_sjlj should be much faster
|
|
|
|
*
|
|
|
|
* This library only exists for two reasons:
|
|
|
|
* 1 - as an initial test for the viability of a ucontext implementation
|
|
|
|
* 2 - to demonstrate the power and speed of libco over existing implementations,
|
|
|
|
* such as pth (which defaults to wrapping ucontext on unix targets)
|
|
|
|
*
|
|
|
|
* Use this library only as a *last resort*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define LIBCO_C
|
2008-03-18 06:19:43 +00:00
|
|
|
#include "libco.h"
|
Update to bsnes v028 release.
Changelog:
- OpenGL (with hardware filter mode support) and SDL video drivers added to Linux port
- OpenAL (with speed regulation disable support) and OSS audio drivers added to Linux port [Nach]
- SDL input driver (with joypad support) added to Linux port
- Emulator pause option added
- Added option to select behavior of bsnes when idle: allow input, ignore input or pause emulator
- Added support to remap common GUI actions to key/joypad presses on the "Input Configuration" screen
- bsnes will now clamp the video output size when it is larger than the screen resolution
- GUI library has been enhanced, and renamed to hiro
- Fullscreen mode now always centers video, rather than approximates
- Fullscreen mode now works correctly on Linux/Openbox
- Extra layer of abstraction in src/ui has been removed, as GUI lib unifies all ports anyway
- Video, audio and input drivers unified into standard library, named ruby
- All custom headers have been merged into a new template library, named nall
- Makefile rewritten, vastly improved. Allows quick toggling of compiled-in drivers
- Makefile: all object files now placed in /src/obj, binary placed in /
- libco greatly enhanced, no longer requires an assembler to build [byuu, blargg, Nach]
- libco SJLJ driver added; bsnes should now build on any Unix-derivative now (Solaris, OS X, PS3, etc) [Nach]
- Fixed register $213e.d4 PPU1 open bus behavior [zones]
- Windows port will not activate screensaver while bsnes is running [Nightcrawler]
- Visual C++ target no longer requires stdint.h
- And lots more -- mostly code refactoring related
2008-02-04 16:16:34 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <ucontext.h>
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static thread_local ucontext_t co_primary;
|
|
|
|
static thread_local ucontext_t *co_running = 0;
|
|
|
|
|
|
|
|
cothread_t co_active() {
|
|
|
|
if(!co_running) co_running = &co_primary;
|
|
|
|
return (cothread_t)co_running;
|
|
|
|
}
|
|
|
|
|
|
|
|
cothread_t co_create(unsigned int heapsize, void (*coentry)(void)) {
|
|
|
|
if(!co_running) co_running = &co_primary;
|
|
|
|
ucontext_t *thread = (ucontext_t*)malloc(sizeof(ucontext_t));
|
|
|
|
if(thread) {
|
|
|
|
if((!getcontext(thread) && !(thread->uc_stack.ss_sp = 0)) && (thread->uc_stack.ss_sp = malloc(heapsize))) {
|
|
|
|
thread->uc_link = co_running;
|
|
|
|
thread->uc_stack.ss_size = heapsize;
|
|
|
|
makecontext(thread, coentry, 0);
|
|
|
|
} else {
|
|
|
|
co_delete((cothread_t)thread);
|
|
|
|
thread = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return (cothread_t)thread;
|
|
|
|
}
|
|
|
|
|
|
|
|
void co_delete(cothread_t cothread) {
|
|
|
|
if(cothread) {
|
|
|
|
if(((ucontext_t*)cothread)->uc_stack.ss_sp) { free(((ucontext_t*)cothread)->uc_stack.ss_sp); }
|
|
|
|
free(cothread);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void co_switch(cothread_t cothread) {
|
|
|
|
ucontext_t *old_thread = co_running;
|
|
|
|
co_running = (ucontext_t*)cothread;
|
|
|
|
swapcontext(old_thread, co_running);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|