A followup on the munmap issue: I think it has something to do with how NativeBoost does the lookup. I looked at the way that "mmap" is called and noticed that the selector #getGlobalSymbolPointer: is being used. Resolving "munmap" with this selector succeeds while doing
NativeBoost loadSymbol: 'munmap' aName fromModule: -2 (which is what happens when the heap manager tries to call "munmap") results the stack trace shown below. I'll keep digging... On 15.11.2012, at 17:20, Max Leske <[email protected]> wrote: > Hi > > When NativeBoost tries to call munmap to free a page (happens because a > pointer I freed was the last reserved one in that page) it will throw a > NBFFICalloutError (every time) because (I think) it can't find the symbol. I > have absolutely no clue how to fix this so I'm in need of help. > > System: OS X 10.8.2 > Image: 1.4 > NativeBoost-Core: CamilloBruni.80 (Installed by using the latest NBInstaller) > > Cheers, > Max > > Here's the stack: > > 15 November 2012 5:04:23.895 pm > > VM: Mac OS - intel - 1082 - NBCoInterpreter > NativeBoost-CogPlugin-IgorStasenko.14 uuid: > da3a649c-e2b2-bd4c-aa2f-9c2ebdb2658a Oct 26 2012, StackToRegisterMappingCogit > VMMaker-oscog-EstebanLorenzano.164 uuid: d77dee73-00f5-4d00-847b-00646b08329d > Oct 26 2012, git://gitorious.org/cogvm/blessed.git Commit: > 48af8595004fd0ec3a3ac6d44c3d7516a87981ca Date: 2012-10-24 16:56:20 +0200 By: > Igor Stasenko <[email protected]> Jenkins build #131 > Image: Pharo1.4 [Latest update: #14457] > > NBFFICallout class>>signalError: > Receiver: NBFFICallout > Arguments and temporary variables: > errorCode: 1 > Receiver's instance variables: > superclass: NBNativeCodeGen > methodDict: a > MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc... > format: 148 > instanceVariables: #('fnSpec' 'requestor' 'methodArgs' > 'coercionMayFail' 'callI...etc... > organization: ('type aliases' aliasForType:) > ('accessing' anonSpec: callType: c...etc... > subclasses: {NBNativeFunctionGen} > name: #NBFFICallout > classPool: a Dictionary(#CustomErrorCodes->a > Dictionary(600->'An instance of NB...etc... > sharedPools: nil > environment: a SystemDictionary(lots of globals) > category: #'NativeBoost-Core-FFI' > traitComposition: {} > localSelectors: nil > > NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode: > Receiver: NBFFICallout > Arguments and temporary variables: > aContext: > NativeBoostMac32(NativeBoost)>>bootstrapLoadSymbol:ofLength:fromModul...etc... > aBlock: [:gen | gen useEmitCall; sender: sender; > parseOptions: anOptions; cdecl...etc... > method: > (NativeBoost>>#bootstrapLoadSymbol:ofLength:fromModule:into: "a > Compile...etc... > lastError: 1 > Receiver's instance variables: > superclass: NBNativeCodeGen > methodDict: a > MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc... > format: 148 > instanceVariables: #('fnSpec' 'requestor' 'methodArgs' > 'coercionMayFail' 'callI...etc... > organization: ('type aliases' aliasForType:) > ('accessing' anonSpec: callType: c...etc... > subclasses: {NBNativeFunctionGen} > name: #NBFFICallout > classPool: a Dictionary(#CustomErrorCodes->a > Dictionary(600->'An instance of NB...etc... > sharedPools: nil > environment: a SystemDictionary(lots of globals) > category: #'NativeBoost-Core-FFI' > traitComposition: {} > localSelectors: nil > > NBFFICallout class>>cdecl:emitCall:options: > Receiver: NBFFICallout > Arguments and temporary variables: > functionSpec: #(#NBBootstrapUlong #(#byte #* #symbolName #, > #long #symbolLen #,...etc... > aCallEmittingBlock: [:gen | gen proxy callFn: > #ioLoadSymbol:OfLength:FromModule...etc... > anOptions: #(#- #optDirectProxyFnAddress > #optAllowExternalAddressPtr) > sender: > NativeBoostMac32(NativeBoost)>>bootstrapLoadSymbol:ofLength:fromModule:...etc... > Receiver's instance variables: > superclass: NBNativeCodeGen > methodDict: a > MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc... > format: 148 > instanceVariables: #('fnSpec' 'requestor' 'methodArgs' > 'coercionMayFail' 'callI...etc... > organization: ('type aliases' aliasForType:) > ('accessing' anonSpec: callType: c...etc... > subclasses: {NBNativeFunctionGen} > name: #NBFFICallout > classPool: a Dictionary(#CustomErrorCodes->a > Dictionary(600->'An instance of NB...etc... > sharedPools: nil > environment: a SystemDictionary(lots of globals) > category: #'NativeBoost-Core-FFI' > traitComposition: {} > localSelectors: nil > > NativeBoostMac32(NativeBoost)>>bootstrapLoadSymbol:ofLength:fromModule:into: > Receiver: a NativeBoostMac32 > Arguments and temporary variables: > symbolName: 'munmap' > symbolLen: 6 > moduleHandle: -2 > returnValueBuffer: #[0 0 0 0 0 0 0 0] > Receiver's instance variables: > bootstrapping: false > insideCallback: nil > callbackCounterAddr: @ 16r5F74000 > extraRootsRegistry: a NBExtraRootsRegistry > rootsCell: @ 16r5F7402A > gateFunction: @ 16r5F74004 > heap: a NBMacExternalHeapManager > > NativeBoostMac32(NativeBoost)>>loadSymbol:fromModule: > Receiver: a NativeBoostMac32 > Arguments and temporary variables: > aSymbolName: 'munmap' > moduleName: -2 > bytes: #[0 0 0 0 0 0 0 0] > module: -2 > handle: nil > Receiver's instance variables: > bootstrapping: false > insideCallback: nil > callbackCounterAddr: @ 16r5F74000 > extraRootsRegistry: a NBExtraRootsRegistry > rootsCell: @ 16r5F7402A > gateFunction: @ 16r5F74004 > heap: a NBMacExternalHeapManager > > NativeBoostMac32(NativeBoostLinux32)>>loadSymbol:fromModule: > Receiver: a NativeBoostMac32 > Arguments and temporary variables: > aSymbolName: 'munmap' > moduleName: -2 > Receiver's instance variables: > bootstrapping: false > insideCallback: nil > callbackCounterAddr: @ 16r5F74000 > extraRootsRegistry: a NBExtraRootsRegistry > rootsCell: @ 16r5F7402A > gateFunction: @ 16r5F74004 > heap: a NBMacExternalHeapManager > > NativeBoost class>>loadSymbol:fromModule: > Receiver: NativeBoost > Arguments and temporary variables: > aSymbolName: 'munmap' > moduleName: -2 > Receiver's instance variables: > superclass: Object > methodDict: a > MethodDictionary(#CLibrary->(NativeBoost>>#CLibrary "a CompiledMe...etc... > format: 142 > instanceVariables: #('bootstrapping' 'insideCallback' > 'callbackCounterAddr' 'ex...etc... > organization: ('retrieving symbols' CLibrary VMModule > ioLoadFunction:from: ioLo...etc... > subclasses: {NativeBoostLinux32. NativeBoostWin32} > name: #NativeBoost > classPool: a Dictionary(#Current->a NativeBoostMac32 > #NBAnnouncer->an Announcer...etc... > sharedPools: an OrderedCollection(AJx86Registers > NativeBoostConstants) > environment: a SystemDictionary(lots of globals) > category: #'NativeBoost-Core' > traitComposition: {} > localSelectors: nil > > NBMacExternalHeapManager class(Object)>>nbGetSymbolAddress:module: > Receiver: NBMacExternalHeapManager > Arguments and temporary variables: > aName: 'munmap' > aModuleNameOrHandle: -2 > addr: nil > Receiver's instance variables: > superclass: NBExternalHeapManager > methodDict: a > MethodDictionary(#mapFlags->(NBMacExternalHeapManager>>#mapFlags ...etc... > format: 138 > instanceVariables: nil > organization: ('as yet unclassified' mapFlags > mmapLength:prot:flags:into: primA...etc... > subclasses: nil > name: #NBMacExternalHeapManager > classPool: nil > sharedPools: an OrderedCollection(NBMacConstants) > environment: a SystemDictionary(lots of globals) > category: #'NativeBoost-Mac' > traitComposition: {} > localSelectors: nil > > [:gen | > fnAddress := requestor nbGetSymbolAddress: fnSpec functionName module: > aModuleNameOrHandle. > fnAddress > ifNil: [self error: 'function unavailable']. > self optMayGC > ifTrue: [asm push: fnAddress asUImm32; > mov: NativeBoost callgateFunctionAddress > asUImm32 to: EAX; > call: EAX] > ifFalse: [asm mov: fnAddress asUImm32 to: EAX; > call: EAX]] in > NBFFICallout>>generateCall:module: > Receiver: a NBFFICallout > Arguments and temporary variables: > aModuleNameOrHandle: a NBFFICallout > fnAddress: -2 > gen: #(nil) > Receiver's instance variables: > asm: an AJx86Assembler > proxy: a NBInterpreterProxy > options: a Set(#optCdecl #optAllowByteArraysPtr > #optUseStackPointer #optReturnP...etc... > method: (NBMacExternalHeapManager>>#unmap:length: "a > CompiledMethod(355205120)"...etc... > fnSpec: a NBFnSpec > requestor: NBMacExternalHeapManager > methodArgs: an OrderedCollection('addr' 'len') > coercionMayFail: true > callInfo: an AJCdeclCallInfo > > BlockClosure>>valueWithPossibleArgs: > Receiver: [:gen | > fnAddress := requestor nbGetSymbolAddress: fnSpec functionName module: > aModuleNam...etc... > Arguments and temporary variables: > anArray: an Array(a NBFFICallout a NBInterpreterProxy an > AJx86Assembler) > Receiver's instance variables: > outerContext: NBFFICallout>>generateCall:module: > startpc: 91 > numArgs: 1 > > [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}. > (self optEmitCall > or: [self optNoCleanup]) > ifTrue: [call disableCleanup]] in [:call | > self optNoAlignment > ifTrue: [call alignment: 1]. > self pushArguments. > coercionMayFail > ifTrue: [proxy ifFailedJumpTo: self failedLabel]. > asm > decorateWith: 'FFI: performing a call' > during: [aFunctionBodyBlock valueWithPossibleArgs: {self. > proxy. asm}. > (self optEmitCall > or: [self optNoCleanup]) > ifTrue: [call disableCleanup]]] in > NBFFICallout>>generateInstructions: > Receiver: a NBFFICallout > Arguments and temporary variables: > aFunctionBodyBlock: an AJCdeclCallInfo > call: [:gen | > fnAddress := requestor nbGetSymbolAddress: fnSpec functionName m...etc... > Receiver's instance variables: > asm: an AJx86Assembler > proxy: a NBInterpreterProxy > options: a Set(#optCdecl #optAllowByteArraysPtr > #optUseStackPointer #optReturnP...etc... > method: (NBMacExternalHeapManager>>#unmap:length: "a > CompiledMethod(355205120)"...etc... > fnSpec: a NBFnSpec > requestor: NBMacExternalHeapManager > methodArgs: an OrderedCollection('addr' 'len') > coercionMayFail: true > callInfo: an AJCdeclCallInfo > > BlockClosure>>ensure: > Receiver: [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}. > (self optEmitCall > or: [...etc... > Arguments and temporary variables: > aBlock: [level := level - 1. > self > addInstruction: (AJInstructionDecoration n...etc... > complete: nil > returnValue: nil > Receiver's instance variables: > outerContext: [:call | > self optNoAlignment > ifTrue: [call alignment: 1]. > sel...etc... > startpc: 155 > numArgs: 0 > > AJx86Assembler>>decorateWith:during: > Receiver: an AJx86Assembler > Arguments and temporary variables: > annotation: 'FFI: performing a call' > aBlock: [aFunctionBodyBlock valueWithPossibleArgs: > {self. proxy. asm}. > (self o...etc... > Receiver's instance variables: > instructions: <<error during printing>> > > [:call | > self optNoAlignment > ifTrue: [call alignment: 1]. > self pushArguments. > coercionMayFail > ifTrue: [proxy ifFailedJumpTo: self failedLabel]. > asm > decorateWith: 'FFI: performing a call' > during: [aFunctionBodyBlock valueWithPossibleArgs: {self. > proxy. asm}. > (self optEmitCall > or: [self optNoCleanup]) > ifTrue: [call disableCleanup]]] in > NBFFICallout>>generateInstructions: > Receiver: a NBFFICallout > Arguments and temporary variables: > aFunctionBodyBlock: an AJCdeclCallInfo > call: [:gen | > fnAddress := requestor nbGetSymbolAddress: fnSpec functionName m...etc... > Receiver's instance variables: > asm: an AJx86Assembler > proxy: a NBInterpreterProxy > options: a Set(#optCdecl #optAllowByteArraysPtr > #optUseStackPointer #optReturnP...etc... > method: (NBMacExternalHeapManager>>#unmap:length: "a > CompiledMethod(355205120)"...etc... > fnSpec: a NBFnSpec > requestor: NBMacExternalHeapManager > methodArgs: an OrderedCollection('addr' 'len') > coercionMayFail: true > callInfo: an AJCdeclCallInfo > > AJx86Assembler>>performingCall:in: > Receiver: an AJx86Assembler > Arguments and temporary variables: > ci: an AJCdeclCallInfo > aBlock: [:call | > self optNoAlignment > ifTrue: [call alignment: 1]. > self push...etc... > Receiver's instance variables: > instructions: <<error during printing>> > > NBFFICallout>>foreignCall: > Receiver: a NBFFICallout > Arguments and temporary variables: > aBlock: [:call | > self optNoAlignment > ifTrue: [call alignment: 1]. > self push...etc... > Receiver's instance variables: > asm: an AJx86Assembler > proxy: a NBInterpreterProxy > options: a Set(#optCdecl #optAllowByteArraysPtr > #optUseStackPointer #optReturnP...etc... > method: (NBMacExternalHeapManager>>#unmap:length: "a > CompiledMethod(355205120)"...etc... > fnSpec: a NBFnSpec > requestor: NBMacExternalHeapManager > methodArgs: an OrderedCollection('addr' 'len') > coercionMayFail: true > callInfo: an AJCdeclCallInfo > > NBFFICallout>>generateInstructions: > Receiver: a NBFFICallout > Arguments and temporary variables: > aFunctionBodyBlock: [:gen | > fnAddress := requestor nbGetSymbolAddress: fnSpec ...etc... > instructions: nil > Receiver's instance variables: > asm: an AJx86Assembler > proxy: a NBInterpreterProxy > options: a Set(#optCdecl #optAllowByteArraysPtr > #optUseStackPointer #optReturnP...etc... > method: (NBMacExternalHeapManager>>#unmap:length: "a > CompiledMethod(355205120)"...etc... > fnSpec: a NBFnSpec > requestor: NBMacExternalHeapManager > methodArgs: an OrderedCollection('addr' 'len') > coercionMayFail: true > callInfo: an AJCdeclCallInfo > > NBFFICallout>>generate: > Receiver: a NBFFICallout > Arguments and temporary variables: > aFunctionBodyBlock: [:gen | > fnAddress := requestor nbGetSymbolAddress: fnSpec ...etc... > generatedCode: nil > Receiver's instance variables: > asm: an AJx86Assembler > proxy: a NBInterpreterProxy > options: a Set(#optCdecl #optAllowByteArraysPtr > #optUseStackPointer #optReturnP...etc... > method: (NBMacExternalHeapManager>>#unmap:length: "a > CompiledMethod(355205120)"...etc... > fnSpec: a NBFnSpec > requestor: NBMacExternalHeapManager > methodArgs: an OrderedCollection('addr' 'len') > coercionMayFail: true > callInfo: an AJCdeclCallInfo > > NBFFICallout>>generateCall:module: > Receiver: a NBFFICallout > Arguments and temporary variables: > functionSpec: #(#int #munmap #(#uint #addr #, #ulong #len)) > aModuleNameOrHandle: -2 > fnAddress: #(nil) > Receiver's instance variables: > asm: an AJx86Assembler > proxy: a NBInterpreterProxy > options: a Set(#optCdecl #optAllowByteArraysPtr > #optUseStackPointer #optReturnP...etc... > method: (NBMacExternalHeapManager>>#unmap:length: "a > CompiledMethod(355205120)"...etc... > fnSpec: a NBFnSpec > requestor: NBMacExternalHeapManager > methodArgs: an OrderedCollection('addr' 'len') > coercionMayFail: true > callInfo: an AJCdeclCallInfo > > [:gen | gen sender: sender; > cdecl; > generateCall: functionSpec module: aModuleName] in > NBFFICallout class>>cdecl:module: > Receiver: NBFFICallout > Arguments and temporary variables: > functionSpec: a NBFFICallout > aModuleName: #(#int #munmap #(#uint #addr #, #ulong #len)) > sender: -2 > gen: NBMacExternalHeapManager>>unmap:length: > Receiver's instance variables: > superclass: NBNativeCodeGen > methodDict: a > MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc... > format: 148 > instanceVariables: #('fnSpec' 'requestor' 'methodArgs' > 'coercionMayFail' 'callI...etc... > organization: ('type aliases' aliasForType:) > ('accessing' anonSpec: callType: c...etc... > subclasses: {NBNativeFunctionGen} > name: #NBFFICallout > classPool: a Dictionary(#CustomErrorCodes->a > Dictionary(600->'An instance of NB...etc... > sharedPools: nil > environment: a SystemDictionary(lots of globals) > category: #'NativeBoost-Core-FFI' > traitComposition: {} > localSelectors: nil > > [bytes := aBlock > value: (self newForMethod: method)] in > NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry: > Receiver: NBFFICallout > Arguments and temporary variables: > aBlock: [:gen | gen sender: sender; > cdecl; > generateCall: functionSpec mod...etc... > method: (NBMacExternalHeapManager>>#unmap:length: "a > CompiledMethod(355205120)"...etc... > bytes: #(nil) > Receiver's instance variables: > superclass: NBNativeCodeGen > methodDict: a > MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc... > format: 148 > instanceVariables: #('fnSpec' 'requestor' 'methodArgs' > 'coercionMayFail' 'callI...etc... > organization: ('type aliases' aliasForType:) > ('accessing' anonSpec: callType: c...etc... > subclasses: {NBNativeFunctionGen} > name: #NBFFICallout > classPool: a Dictionary(#CustomErrorCodes->a > Dictionary(600->'An instance of NB...etc... > sharedPools: nil > environment: a SystemDictionary(lots of globals) > category: #'NativeBoost-Core-FFI' > traitComposition: {} > localSelectors: nil > > BlockClosure>>on:do: > Receiver: [bytes := aBlock > value: (self newForMethod: method)] > Arguments and temporary variables: > exception: NBRecursionDetect > handlerAction: [:ex | ex check: aMethod] > handlerActive: true > Receiver's instance variables: > outerContext: NBFFICallout class(NBNativeCodeGen > class)>>generateCode:andRetry:...etc... > startpc: 96 > numArgs: 0 > > NBRecursionDetect class>>in:during: > Receiver: NBRecursionDetect > Arguments and temporary variables: > aMethod: (NBMacExternalHeapManager>>#unmap:length: "a > CompiledMethod(355205120)...etc... > aBlock: [bytes := aBlock > value: (self newForMethod: method)] > Receiver's instance variables: > superclass: Notification > methodDict: a > MethodDictionary(#check:->(NBRecursionDetect>>#check: "a Compiled...etc... > format: 144 > instanceVariables: #('method') > organization: ('as yet unclassified' check: defaultAction > method signalForMetho...etc... > subclasses: nil > name: #NBRecursionDetect > classPool: nil > sharedPools: nil > environment: a SystemDictionary(lots of globals) > category: #'NativeBoost-Core-Errors' > traitComposition: {} > localSelectors: nil > > NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry: > Receiver: NBFFICallout > Arguments and temporary variables: > aBlock: [:gen | gen sender: sender; > cdecl; > generateCall: functionSpec mod...etc... > retryCtx: NBMacExternalHeapManager>>unmap:length: > method: (NBMacExternalHeapManager>>#unmap:length: "a > CompiledMethod(355205120)"...etc... > newMethod: nil > args: nil > bytes: #(nil) > Receiver's instance variables: > superclass: NBNativeCodeGen > methodDict: a > MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc... > format: 148 > instanceVariables: #('fnSpec' 'requestor' 'methodArgs' > 'coercionMayFail' 'callI...etc... > organization: ('type aliases' aliasForType:) > ('accessing' anonSpec: callType: c...etc... > subclasses: {NBNativeFunctionGen} > name: #NBFFICallout > classPool: a Dictionary(#CustomErrorCodes->a > Dictionary(600->'An instance of NB...etc... > sharedPools: nil > environment: a SystemDictionary(lots of globals) > category: #'NativeBoost-Core-FFI' > traitComposition: {} > localSelectors: nil > > NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode: > Receiver: NBFFICallout > Arguments and temporary variables: > aContext: NBMacExternalHeapManager>>unmap:length: > aBlock: [:gen | gen sender: sender; > cdecl; > generateCall: functionSpec mod...etc... > method: (NBMacExternalHeapManager>>#unmap:length: "a > CompiledMethod(355205120)"...etc... > lastError: 502 > Receiver's instance variables: > superclass: NBNativeCodeGen > methodDict: a > MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc... > format: 148 > instanceVariables: #('fnSpec' 'requestor' 'methodArgs' > 'coercionMayFail' 'callI...etc... > organization: ('type aliases' aliasForType:) > ('accessing' anonSpec: callType: c...etc... > subclasses: {NBNativeFunctionGen} > name: #NBFFICallout > classPool: a Dictionary(#CustomErrorCodes->a > Dictionary(600->'An instance of NB...etc... > sharedPools: nil > environment: a SystemDictionary(lots of globals) > category: #'NativeBoost-Core-FFI' > traitComposition: {} > localSelectors: nil > > NBFFICallout class>>cdecl:module: > Receiver: NBFFICallout > Arguments and temporary variables: > functionSpec: #(#int #munmap #(#uint #addr #, #ulong #len)) > aModuleName: -2 > sender: NBMacExternalHeapManager>>unmap:length: > Receiver's instance variables: > superclass: NBNativeCodeGen > methodDict: a > MethodDictionary(#aliasForType:->(NBFFICallout>>#aliasForType: "a...etc... > format: 148 > instanceVariables: #('fnSpec' 'requestor' 'methodArgs' > 'coercionMayFail' 'callI...etc... > organization: ('type aliases' aliasForType:) > ('accessing' anonSpec: callType: c...etc... > subclasses: {NBNativeFunctionGen} > name: #NBFFICallout > classPool: a Dictionary(#CustomErrorCodes->a > Dictionary(600->'An instance of NB...etc... > sharedPools: nil > environment: a SystemDictionary(lots of globals) > category: #'NativeBoost-Core-FFI' > traitComposition: {} > localSelectors: nil > > NBMacExternalHeapManager>>unmap:length: > Receiver: a NBMacExternalHeapManager > Arguments and temporary variables: > addr: 7380992 > len: 32768 > errorCode: 502 > Receiver's instance variables: > pages: a Dictionary(24981504->a NBMemoryPage 100089856->a > NBMemoryPage ) > freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, > 17, free) a NBMemoryB...etc... > reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( > @ 16r17D3000, 38) 24981...etc... > sema: a Semaphore() > > NBMacExternalHeapManager>>primFreePage: > Receiver: a NBMacExternalHeapManager > Arguments and temporary variables: > aMemoryPage: a NBMemoryPage > res: nil > Receiver's instance variables: > pages: a Dictionary(24981504->a NBMemoryPage 100089856->a > NBMemoryPage ) > freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, > 17, free) a NBMemoryB...etc... > reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( > @ 16r17D3000, 38) 24981...etc... > sema: a Semaphore() > > NBMacExternalHeapManager(NBExternalHeapManager)>>freePage: > Receiver: a NBMacExternalHeapManager > Arguments and temporary variables: > aMemoryPage: a NBMemoryPage > Receiver's instance variables: > pages: a Dictionary(24981504->a NBMemoryPage 100089856->a > NBMemoryPage ) > freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, > 17, free) a NBMemoryB...etc... > reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( > @ 16r17D3000, 38) 24981...etc... > sema: a Semaphore() > > [:page | > page length = aMemoryBlock length > ifTrue: [self freePage: page. > ^ true]. > nil] in > NBMacExternalHeapManager(NBExternalHeapManager)>>checkForFreePage: > Receiver: a NBMacExternalHeapManager > Arguments and temporary variables: > aMemoryBlock: a NBMemoryPage > page: a NBMemoryBlock( @ 16r70A000, 32768, free) > Receiver's instance variables: > pages: a Dictionary(24981504->a NBMemoryPage 100089856->a > NBMemoryPage ) > freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, > 17, free) a NBMemoryB...etc... > reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( > @ 16r17D3000, 38) 24981...etc... > sema: a Semaphore() > > BlockClosure>>cull: > Receiver: [:page | > page length = aMemoryBlock length > ifTrue: [self freePage: page. > ^ true]. > n...etc... > Arguments and temporary variables: > anArg: a NBMemoryPage > Receiver's instance variables: > outerContext: > NBMacExternalHeapManager(NBExternalHeapManager)>>checkForFreePage...etc... > startpc: 41 > numArgs: 1 > > Dictionary>>at:ifPresent: > Receiver: a Dictionary(24981504->a NBMemoryPage 100089856->a > NBMemoryPage ) > Arguments and temporary variables: > key: 7380992 > aBlock: [:page | > page length = aMemoryBlock length > ifTrue: [self freePage: p...etc... > assoc: 7380992->a NBMemoryPage > Receiver's instance variables: > tally: 2 > array: an Array(nil 100089856->a NBMemoryPage nil nil > 24981504->a NBMemoryPage)...etc... > > NBMacExternalHeapManager(NBExternalHeapManager)>>checkForFreePage: > Receiver: a NBMacExternalHeapManager > Arguments and temporary variables: > aMemoryBlock: a NBMemoryBlock( @ 16r70A000, 32768, free) > Receiver's instance variables: > pages: a Dictionary(24981504->a NBMemoryPage 100089856->a > NBMemoryPage ) > freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, > 17, free) a NBMemoryB...etc... > reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( > @ 16r17D3000, 38) 24981...etc... > sema: a Semaphore() > > NBMemoryBlock>>makeFreeFor: > Receiver: a NBMemoryBlock( @ 16r70A030, 32720, free) > Arguments and temporary variables: > heapManager: a NBMacExternalHeapManager > Receiver's instance variables: > left: a NBMemoryBlock( @ 16r70A000, 32768, free) > right: nil > address: 7381040 > length: 32720 > free: true > > [| block | > block := reservedBlocks > removeKey: address > ifAbsent: [self error: 'Unable to find a memory > block with given address']. > block makeFreeFor: self] in > NBMacExternalHeapManager(NBExternalHeapManager)>>free: > Receiver: a NBMacExternalHeapManager > Arguments and temporary variables: > address: 7381040 > block: a NBMemoryBlock( @ 16r70A030, 32720, free) > Receiver's instance variables: > pages: a Dictionary(24981504->a NBMemoryPage 100089856->a > NBMemoryPage ) > freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, > 17, free) a NBMemoryB...etc... > reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( > @ 16r17D3000, 38) 24981...etc... > sema: a Semaphore() > > [caught := true. > self wait. > blockValue := mutuallyExcludedBlock value] in Semaphore>>critical: > Receiver: a Semaphore() > Arguments and temporary variables: > <<error during printing> > Receiver's instance variables: > firstLink: nil > lastLink: nil > excessSignals: 0 > > BlockClosure>>ensure: > Receiver: [caught := true. > self wait. > blockValue := mutuallyExcludedBlock value] > Arguments and temporary variables: > aBlock: [caught > ifTrue: [self signal]] > complete: nil > returnValue: nil > Receiver's instance variables: > outerContext: Semaphore>>critical: > startpc: 42 > numArgs: 0 > > Semaphore>>critical: > Receiver: a Semaphore() > Arguments and temporary variables: > <<error during printing> > Receiver's instance variables: > firstLink: nil > lastLink: nil > excessSignals: 0 > > NBMacExternalHeapManager(NBExternalHeapManager)>>free: > Receiver: a NBMacExternalHeapManager > Arguments and temporary variables: > address: 7381040 > Receiver's instance variables: > pages: a Dictionary(24981504->a NBMemoryPage 100089856->a > NBMemoryPage ) > freeBlocks: an IdentitySet(a NBMemoryBlock( @ 16r17D302E, > 17, free) a NBMemoryB...etc... > reservedBlocks: a Dictionary(24981504->a NBMemoryBlock( > @ 16r17D3000, 38) 24981...etc... > sema: a Semaphore() > > > --- The full stack --- > NBFFICallout class>>signalError: > NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode: > NBFFICallout class>>cdecl:emitCall:options: > NativeBoostMac32(NativeBoost)>>bootstrapLoadSymbol:ofLength:fromModule:into: > NativeBoostMac32(NativeBoost)>>loadSymbol:fromModule: > NativeBoostMac32(NativeBoostLinux32)>>loadSymbol:fromModule: > NativeBoost class>>loadSymbol:fromModule: > NBMacExternalHeapManager class(Object)>>nbGetSymbolAddress:module: > [:gen | > fnAddress := requestor nbGetSymbolAddress: fnSpec functionName module: > aModuleNameOrHandle. > fnAddress > ifNil: [self error: 'function unavailable']. > self optMayGC > ifTrue: [asm push: fnAddress asUImm32; > mov: NativeBoost callgateFunctionAddress > asUImm32 to: EAX; > call: EAX] > ifFalse: [asm mov: fnAddress asUImm32 to: EAX; > call: EAX]] in > NBFFICallout>>generateCall:module: > BlockClosure>>valueWithPossibleArgs: > [aFunctionBodyBlock valueWithPossibleArgs: {self. proxy. asm}. > (self optEmitCall > or: [self optNoCleanup]) > ifTrue: [call disableCleanup]] in [:call | > self optNoAlignment > ifTrue: [call alignment: 1]. > self pushArguments. > coercionMayFail > ifTrue: [proxy ifFailedJumpTo: self failedLabel]. > asm > decorateWith: 'FFI: performing a call' > during: [aFunctionBodyBlock valueWithPossibleArgs: {self. > proxy. asm}. > (self optEmitCall > or: [self optNoCleanup]) > ifTrue: [call disableCleanup]]] in > NBFFICallout>>generateInstructions: > BlockClosure>>ensure: > AJx86Assembler>>decorateWith:during: > [:call | > self optNoAlignment > ifTrue: [call alignment: 1]. > self pushArguments. > coercionMayFail > ifTrue: [proxy ifFailedJumpTo: self failedLabel]. > asm > decorateWith: 'FFI: performing a call' > during: [aFunctionBodyBlock valueWithPossibleArgs: {self. > proxy. asm}. > (self optEmitCall > or: [self optNoCleanup]) > ifTrue: [call disableCleanup]]] in > NBFFICallout>>generateInstructions: > AJx86Assembler>>performingCall:in: > NBFFICallout>>foreignCall: > NBFFICallout>>generateInstructions: > NBFFICallout>>generate: > NBFFICallout>>generateCall:module: > [:gen | gen sender: sender; > cdecl; > generateCall: functionSpec module: aModuleName] in > NBFFICallout class>>cdecl:module: > [bytes := aBlock > value: (self newForMethod: method)] in > NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry: > BlockClosure>>on:do: > NBRecursionDetect class>>in:during: > NBFFICallout class(NBNativeCodeGen class)>>generateCode:andRetry: > NBFFICallout class(NBNativeCodeGen class)>>handleFailureIn:nativeCode: > NBFFICallout class>>cdecl:module: > NBMacExternalHeapManager>>unmap:length: > NBMacExternalHeapManager>>primFreePage: > NBMacExternalHeapManager(NBExternalHeapManager)>>freePage: > [:page | > page length = aMemoryBlock length > ifTrue: [self freePage: page. > ^ true]. > nil] in > NBMacExternalHeapManager(NBExternalHeapManager)>>checkForFreePage: > BlockClosure>>cull: > Dictionary>>at:ifPresent: > NBMacExternalHeapManager(NBExternalHeapManager)>>checkForFreePage: > NBMemoryBlock>>makeFreeFor: > [| block | > block := reservedBlocks > removeKey: address > ifAbsent: [self error: 'Unable to find a memory > block with given address']. > block makeFreeFor: self] in > NBMacExternalHeapManager(NBExternalHeapManager)>>free: > [caught := true. > self wait. > blockValue := mutuallyExcludedBlock value] in Semaphore>>critical: > BlockClosure>>ensure: > Semaphore>>critical: > NBMacExternalHeapManager(NBExternalHeapManager)>>free: > - - - - - - - - - - - - - - - > - - - - - - - - - - - - - - - - - - > NativeBoostMac32(NativeBoostLinux32)>>free: > NativeBoost class>>free: > NBExternalAddress>>free > [:pointer | pointer value free] in LimboCommand>>freePointers > Set>>do: > LimboCommand>>freePointers > [self freePointers] in LimboCommand>>run > BlockClosure>>ensure: > LimboCommand>>run > Limbo>>run:arguments: > Limbo>>runSh: > Limbo class>>runSh: > [limbo := Limbo runSh: '/bin/echo ' , arg] in > LimboTest>>testShellCommandWithNewLines > [aBlock value. > false] in LimboTest(TestCase)>>executeShould:inScopeOf: > BlockClosure>>on:do: > LimboTest(TestCase)>>executeShould:inScopeOf: > LimboTest(TestCase)>>shouldnt:raise: > LimboTest>>testShellCommandWithNewLines > LimboTest(TestCase)>>performTest > [self setUp. > self performTest] in LimboTest(TestCase)>>runCase > BlockClosure>>ensure: > LimboTest(TestCase)>>runCase > [(self class selector: testSelector) runCase] in LimboTest(TestCase)>>debug > BlockClosure>>ensure: > LimboTest(TestCase)>>debug > OBCmdRunTests>>execute > [:each | > (each isActive > and: [each isEnabled]) > ifTrue: [each execute. > ^ true]. > nil] in OBNodeCommandScan(OBCommandScan)>>processKeystroke:withNode:for: > OrderedCollection>>do: > OBNodeCommandScan(OBCommandScan)>>processKeystroke:withNode:for: > [:each | > (scan > processKeystroke: aCharacter asKeystroke > withNode: each > for: self) > ifTrue: [^ self]. > nil] in OBColumn>>keystroke:from: > OrderedCollection>>reverseDo: > OBColumn>>keystroke:from: > OBPluggableListMorph(PluggableListMorph)>>modifierKeyPressed: > OBPluggableListMorph(PluggableListMorph)>>keyStroke: > OBPluggableListMorph(Morph)>>handleKeystroke: > KeyboardEvent>>sentTo: > OBPluggableListMorph(Morph)>>handleEvent: > MorphicEventDispatcher>>dispatchDefault:with: > MorphicEventDispatcher>>dispatchEvent:with: > OBPluggableListMorph(Morph)>>processEvent:using: > OBPluggableListMorph(Morph)>>processEvent: > OBPluggableListMorph(PluggableListMorph)>>handleFocusEvent: > [ActiveHand := self. > ActiveEvent := anEvent. > result := focusHolder > handleFocusEvent: (anEvent > transformedBy: (focusHolder > transformedFrom: self))] in HandMorph>>sendFocusEvent:to:clear: > [aBlock value] in PasteUpMorph>>becomeActiveDuring: > BlockClosure>>on:do: > PasteUpMorph>>becomeActiveDuring: > HandMorph>>sendFocusEvent:to:clear: > HandMorph>>sendEvent:focus:clear: > HandMorph>>sendKeyboardEvent: > HandMorph>>handleEvent: > HandMorph>>processEvents > [:h | > ActiveHand := h. > h processEvents. > ActiveHand := nil] in WorldState>>doOneCycleNowFor: > Array(SequenceableCollection)>>do: > WorldState>>handsDo: > WorldState>>doOneCycleNowFor: > WorldState>>doOneCycleFor: > PasteUpMorph>>doOneCycle > [[World doOneCycle. > Processor yield. > false] whileFalse. > nil] in MorphicUIManager>>spawnNewProcess > [self value. > Processor terminateActive] in BlockClosure>>newProcess >
