fcontext.cpp 936 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include "fcontext.h"
  2. #if _WIN32
  3. #include <windows.h>
  4. unsigned char *alloc_fcontext_stack( size_t size,bool guard ){
  5. void *vp=::VirtualAlloc( 0,size,MEM_COMMIT,PAGE_READWRITE );
  6. if( !vp ) return 0;
  7. if( guard ){
  8. DWORD old_options;
  9. ::VirtualProtect( vp,1,PAGE_READWRITE|PAGE_GUARD /*PAGE_NOACCESS*/,&old_options );
  10. }
  11. return (unsigned char*)vp;
  12. }
  13. void free_fcontext_stack( void *vp,size_t size ){
  14. ::VirtualFree( vp,0,MEM_RELEASE );
  15. }
  16. #else
  17. #include <sys/mman.h>
  18. unsigned char *alloc_fcontext_stack( size_t size,bool guard ){
  19. #if defined(MAP_ANON)
  20. void *vp=::mmap( 0,size,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0 );
  21. #else
  22. void *vp=::mmap( 0,size,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0 );
  23. #endif
  24. if( vp==MAP_FAILED ) return 0;
  25. if( guard ){
  26. ::mprotect( vp,1,PROT_NONE );
  27. }
  28. return (unsigned char*)vp;
  29. }
  30. void free_fcontext_stack( void *vp,size_t size ){
  31. ::munmap( vp,size );
  32. }
  33. #endif