Posts Tagged ‘ tusc

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] #6 kwakeup(PTH_CONDVAR_OBJECT, 0x60000000000ea400, WAKEUP_ONE, 0x9fffffff7f63cb50) = 0
[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.

export PTHREAD_DEFAULT_STACK_SIZE=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!