txModuleData* fxLoadLibrary(txMachine* the, txString path, txScript* script) { txModuleData* data = C_NULL; if (script) { if (script->version[3] == 1) { char buffer[PATH_MAX]; char* dot; void* library; txCallback callback; c_strcpy(buffer, path); dot = c_strrchr(buffer, '.'); if (dot) *dot = 0; #if mxWindows c_strcat(buffer, ".dll"); #if mxReport fxReport(the, "# Loading library \"%s\"\n", buffer); #endif library = LoadLibrary(buffer); mxElseError(library); callback = (txCallback)GetProcAddress(library, "xsHostModule"); mxElseError(callback); #else c_strcat(buffer, ".so"); #if mxReport fxReport(the, "# Loading library \"%s\"\n", buffer); #endif library = dlopen(buffer, RTLD_NOW); mxElseError(library); callback = (txCallback)dlsym(library, "xsHostModule"); mxElseError(callback); #endif data = c_malloc(sizeof(txModuleData) + c_strlen(buffer)); mxElseError(data); data->library = library; data->the = the; c_strcpy(data->path, buffer); script->callback = callback; return data; } } #if mxReport data = c_malloc(sizeof(txModuleData) + c_strlen(path)); mxElseError(data); data->library = C_NULL; data->the = the; c_strcpy(data->path, path); fxReport(the, "# Loading module \"%s\"\n", path); #endif return data; }
void* fxAllocateChunks(txMachine* the, txSize theSize) { txByte* aData; txBlock* aBlock; if ((theSize < the->minimumChunksSize) && !(the->collectFlag & XS_SKIPPED_COLLECT_FLAG)) theSize = the->minimumChunksSize; theSize += sizeof(txBlock); aData = (txByte *)c_malloc(theSize); if (!aData) fxJump(the); aBlock = (txBlock*)aData; aBlock->nextBlock = the->firstBlock; aBlock->current = aData + sizeof(txBlock); aBlock->limit = aData + theSize; aBlock->temporary = C_NULL; the->firstBlock = aBlock; the->maximumChunksSize += theSize; #if mxReport fxReport(the, "# Chunk allocation: reserved %ld used %ld peak %ld bytes\n", the->maximumChunksSize, the->currentChunksSize, the->peakChunksSize); #endif #if __FSK_LAYER__ FskInstrumentedItemSendMessageNormal(the, kFskXSInstrAllocateChunks, the); #endif return aData; }
void fxOverflow(txMachine* the, txInteger theCount, txString thePath, txInteger theLine) { #if mxBoundsCheck txSlot* aStack = the->stack + theCount; if (theCount < 0) { if (aStack < the->stackBottom) { fxReport(the, "stack overflow (%ld)!\n", (the->stack - the->stackBottom) + theCount); fxJump(the); } } else if (theCount > 0) { if (aStack > the->stackTop) { fxReport(the, "stack overflow (%ld)!\n", theCount - (the->stackTop - the->stack)); fxJump(the); } } #endif }
void fxSweepHost(txMachine* the) { txModuleData* data = the->host; while (data) { txModuleData* next = data->next; if (data->library) { #if mxReport fxReport(data->the, "# Unloading library \"%s\"\n", data->path); #endif #if mxWindows FreeLibrary(data->library); #else dlclose(data->library); #endif } else { #if mxReport fxReport(data->the, "# Unloading module \"%s\"\n", data->path); #endif } c_free(data); data = next; } }