[ 
https://issues.apache.org/jira/browse/UIMA-4899?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Edward Epstein reassigned UIMA-4899:
------------------------------------

    Assignee: Edward Epstein

> UIMACPP access violation in destroyJNI()
> ----------------------------------------
>
>                 Key: UIMA-4899
>                 URL: https://issues.apache.org/jira/browse/UIMA-4899
>             Project: UIMA
>          Issue Type: Bug
>          Components: C++ Framework
>    Affects Versions: 2.8.1SDK
>         Environment: Windows 10 64bit
>            Reporter: Benjamin De Boe
>            Assignee: Edward Epstein
>            Priority: Major
>
> When running a bunch of threads accessing separate AE instances of the 
> UIMACPP DaveDetector in JNI mode, the process crashes with an access 
> violation on the call to "delete pInstance" in destructorJNI in jni/jni.cpp.
> The code below should allow you to reproduce the issue and takes three 
> command-line arguments:
> 1: the full path to DaveDescriptor.xml
> 2: whether to use simple threads ("n") or separate processes ("y")
> 3: (optional, default 20) size of the CAS pool to use, which we found out has 
> an impact in reproducing the issue.
> /*
>  * To change this license header, choose License Headers in Project 
> Properties.
>  * To change this template file, choose Tools | Templates
>  * and open the template in the editor.
>  */
> package com.intersys.uima.test;
> import java.io.File;
> import java.net.URL;
> import java.net.URLClassLoader;
> import org.apache.uima.UIMAFramework;
> import org.apache.uima.analysis_engine.AnalysisEngine;
> import org.apache.uima.cas.CAS;
> import org.apache.uima.resource.ResourceSpecifier;
> import org.apache.uima.util.CasCreationUtils;
> import org.apache.uima.util.CasPool;
> import org.apache.uima.util.Level;
> import org.apache.uima.util.XMLInputSource;
> /**
>  *
>  * @author bdeboe
>  */
> public class Standalone implements Runnable {
>     private String text;
>     private AnalysisEngine ae;
>     private CasPool pool;
>     public Standalone(String txt, AnalysisEngine ae, CasPool pool) {
>         this.text = txt;
>         this.ae = ae;
>         this.pool = pool;
>     }
>     public static void main(String[] args) throws Exception {
>         String descPath = ((args != null) && (args.length > 0)) ? args[0] : 
> "C:\\InterSystems\\UIMA\\bin\\DaveDetector.xml";
>  
>         if ((args != null) && (args.length > 1) && (args[1].charAt(0) == 
> 'y')) {
>             async(descPath);
>             return;
>         }
>         
>        int casPoolSize = ((args != null) && (args.length > 2)) ? 
> Integer.valueOf(args[2]) : 20;
>         XMLInputSource in = new XMLInputSource(descPath);
>         ResourceSpecifier specifier
>                 = UIMAFramework.getXMLParser().parseResourceSpecifier(in);
>         AnalysisEngine ae = UIMAFramework.produceAnalysisEngine(specifier);
>         CasPool pool = (casPoolSize > 0) ? new CasPool(casPoolSize, ae) : 
> null;
>         String loremIpsum = "Lorem ipsum dolor sit amet, consectetur 
> adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna 
> aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris 
> nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in 
> reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
> Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia 
> deserunt mollit anim id est laborum.";
>         for (int i = 0; i < 25; i++) {
>             Standalone task = new Standalone(loremIpsum, 
> UIMAFramework.produceAnalysisEngine(specifier), (casPoolSize > 0) ? pool : 
> null);
>             Thread t = new Thread(task);
>             t.start();
>         }
>     }
>     public static int async(String descriptor) throws Exception {
>         String javaHome = System.getProperty("java.home");
>         String javaBin = javaHome
>                 + File.separator + "bin"
>                 + File.separator + "java";
>         //String classpath = System.getProperty("java.class.path");
>         URL[] urls = ((URLClassLoader) 
> Thread.currentThread().getContextClassLoader()).getURLs();
>         StringBuilder classPath = new StringBuilder();
>         for (URL url : urls) {
>             classPath.append(url.getPath()).append(";");
>         }
>         System.out.println(javaBin.concat(" -cp 
> ").concat(classPath.toString()).concat(" 
> ").concat(Standalone.class.getCanonicalName()).concat(" 
> ").concat(descriptor));
>         ProcessBuilder builder = new ProcessBuilder(
>                 javaBin, "-cp", classPath.toString(), 
> Standalone.class.getCanonicalName(), descriptor);
>         builder.redirectErrorStream(true);
>         builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
>         Process[] processes = new Process[4];
>         processes[0] = builder.start();
>         processes[1] = builder.start();
>         processes[2] = builder.start();
>         processes[3] = builder.start();
>         int done = 0;
>         do {
>             Thread.sleep(1000);
>             done = 0;
>             for (int i = 0; i < 4; i++) {
>                 if (!processes[i].isAlive()) {
>                     done++;
>                 }
>             }
>             System.out.println(String.valueOf(done).concat(" processes 
> done"));
>         } while (done < 4);
>         return processes[3].exitValue();
>     }
>     @Override
>     public void run() {
>         CAS cas  = null;
>         try {
>             if (pool != null) { 
>                 cas = pool.getCas();
>             } else {
>                 cas = 
> CasCreationUtils.createCas(ae.getAnalysisEngineMetaData());
>             }
>             UIMAFramework.getLogger().log(Level.WARNING, "created CAS in 
> thread ".concat(String.valueOf(Thread.currentThread().getId())));
>             cas.setDocumentText(text);
>             ae.process(cas);
>             
>             System.out.println("Done processing text");
>         } catch (Exception e) {
>             e.printStackTrace();
>         } finally {
>             if (pool != null) pool.releaseCas(cas);
>         }
>     }
> }



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to