JNI su HP-UX, le dimensioni dello stack contano
Arrugginito forse un po’, quando si passa tanto tempo a fare altro ci si dimentica di avere anche uno spazio web dove annotare quei piccoli successi che potrebbero tornare utili ad altri, ma anche a te semmai te ne dovessi dimenticare :)
Il problema di fondo era che la chiamata JNI_CreateJavaVM produceva il segnale SIGABRT quando invocato all’interno di un altro framework, nello specifico stavo utilizzando l’SDK BoKS.
La porzione di codice interessata, a parte dovuti accorgimenti, era del tutto coerente con quanto riportato da HP al link
http://www.docs.hp.com/en/JAVAPROGUIDE/JNI_java2.html
Provando ad utilizzare i parametri di inizializzazione della VM più svariati non si è cavato un ragno dal buco, seguendo comunque le linee guida riportate qui http://www.docs.hp.com/en/JAVAPROGUIDE/JNI_java2.html#primordial, si è ipotizzato da subito un problema con lo stacksize su HP-UX, su Solaris, infatti, non erano stati riscontrati problemi di sorta.
Una sessione con tusc ha confermato quanto supposto:
[19196] #2 ksleep(PTH_CONDVAR_OBJECT, 0x60000000000ea400, 0x60000000000d75b8, NULL) = 0
[19196] #6 gettimeofday(0x9fffffff7f63cb30, NULL) ........ = 0
[19196] #2 write(1, 0x9fffffffef4c0400, 43) .............. = 43
E r r o r o c c u r r e d d u r i n g i n i t i a l i z a
t i o n o f V M \n
[19196] #2 write(1, 0x60000000001683a0, 28) .............. = 28
j a v a . l a n g . S t a c k O v e r f l o w E r r o r
[19196] #2 write(1, 0xc000000015cf08b8, 1) ............... = 1
\n
[19196] #2 unlink("/var/tmp/hsperfdata_boksa/19196") ..... = 0
[19196] #2 sigaction(SIGILL, 0x9fffffffef7c6740, NULL) ... = 0
[19196] #2 sigprocmask(SIG_UNBLOCK, NULL, 0x9fffffffef4c0b80) = 0
[19196] #2 sigaction(SIGABRT, NULL, 0x9fffffffef4c0ba0) .. = 0
[19196] #2 getpid() ...................................... = 19196 (19194)
[19196] #2 Received signal 6, SIGABRT, in kill(), [0x9fffffffef76bfd0]
[19196] #2 Siginfo: sent by pid 19196 (uid 600), si_errno: 0
La soluzione?
Un semplice export della variabile PTHREAD_DEFAULT_STACK_SIZE a 524288.
Si sarebbe anche potuta usare la chiamata pthread_default_stacksize_np(), ma poiché la parte di codice che crea i thread non è personalizzabile in quel dato SDK, l’export della variabile d’ambiente è stata l’unica soluzione attuabile.
Alla prossima!





More about me...