| #include "Routine.hpp" | |
| #include "../Common/Memory.hpp" | |
| #include "../Common/Thread.hpp" | |
| #include "../Common/Types.hpp" | |
| namespace sw | |
| { | |
| Routine::Routine(int bufferSize) : bufferSize(bufferSize), dynamic(true) | |
| { | |
| void *memory = allocateExecutable(bufferSize); | |
| buffer = memory; | |
| entry = memory; | |
| functionSize = bufferSize; // Updated by RoutineManager::endFunctionBody | |
| bindCount = 0; | |
| } | |
| Routine::Routine(void *memory, int bufferSize, int offset) : bufferSize(bufferSize), functionSize(bufferSize), dynamic(false) | |
| { | |
| buffer = (unsigned char*)memory - offset; | |
| entry = memory; | |
| bindCount = 0; | |
| } | |
| Routine::~Routine() | |
| { | |
| if(dynamic) | |
| { | |
| deallocateExecutable(buffer, bufferSize); | |
| } | |
| } | |
| void Routine::setFunctionSize(int functionSize) | |
| { | |
| this->functionSize = functionSize; | |
| } | |
| const void *Routine::getBuffer() | |
| { | |
| return buffer; | |
| } | |
| const void *Routine::getEntry() | |
| { | |
| return entry; | |
| } | |
| int Routine::getBufferSize() | |
| { | |
| return bufferSize; | |
| } | |
| int Routine::getFunctionSize() | |
| { | |
| return functionSize; | |
| } | |
| int Routine::getCodeSize() | |
| { | |
| return functionSize - ((uintptr_t)entry - (uintptr_t)buffer); | |
| } | |
| bool Routine::isDynamic() | |
| { | |
| return dynamic; | |
| } | |
| void Routine::bind() | |
| { | |
| atomicIncrement(&bindCount); | |
| } | |
| void Routine::unbind() | |
| { | |
| long count = atomicDecrement(&bindCount); | |
| if(count == 0) | |
| { | |
| delete this; | |
| } | |
| } | |
| } |