A Tcl like command language made for the Clinl kernel testing
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
913 B

5 years ago
  1. #pragma once
  2. #include "buffer.hpp"
  3. #include "stdlib.h"
  4. #include "string.h"
  5. class arena{
  6. ksdk::buffer<char> data;
  7. size_t last;
  8. size_t count;
  9. public:
  10. arena()
  11. :last(0)
  12. ,count(0)
  13. ,data(ksdk::buffer<char>(nullptr,(size_t)0))
  14. {}
  15. arena(size_t sz)
  16. :last(0)
  17. ,count(0)
  18. ,data(ksdk::buffer<char>(nullptr,(size_t)0))
  19. {
  20. if(sz!=0)
  21. {
  22. auto v=malloc(sz);
  23. if(v!=nullptr)
  24. {
  25. data=ksdk::buffer<char>((char*)v,sz);
  26. }
  27. }
  28. }
  29. arena(char* pos,size_t sz)
  30. :last(0)
  31. ,count(0)
  32. ,data(ksdk::buffer<char>(pos,(size_t)sz))
  33. {
  34. }
  35. void* allocate(size_t sz)
  36. {
  37. auto ret=data.begin()+last;
  38. if(ret<data.end())
  39. {
  40. count++;
  41. last+=sz;
  42. return ret;
  43. }
  44. else
  45. {
  46. return nullptr;
  47. }
  48. }
  49. bool desallocate(void* ptr)
  50. {
  51. if(ptr>=data.begin() && ptr<data.end())
  52. {
  53. count--;
  54. if(count==0)
  55. {
  56. memset(data.begin(),data.size(),0);
  57. last=0;
  58. }
  59. return true;
  60. }
  61. return false;
  62. }
  63. };