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

Jan Winter updated FELIX-5286:
------------------------------
    Description: 
{code}
g! grep 'test'
# DEADLOCK !!! Java process must be killed. 
{code}

*My 'produce | consume' sample*: 

{code:java}
package gogo.runtime.deadlock;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;

import org.apache.felix.gogo.runtime.CommandProcessorImpl;
import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
import org.apache.felix.service.command.CommandSession;

public class Main {

        public static void main(String[] args) throws Exception {
                ThreadIOImpl tio = new ThreadIOImpl();
                tio.start();
                
                CommandProcessorImpl processor = new CommandProcessorImpl(tio);
                DeadlockSample commands = new DeadlockSample();
                
                processor.addCommand("deadlock", commands, "produce");
                processor.addCommand("deadlock", commands, "consume");
                
                CommandSession session = processor.createSession(System.in, 
System.out, System.err);
                
                session.execute("produce"); // SUCC
                session.execute("consume"); // SUCC
                session.execute("produce | consume"); //SUCC
                
                Thread deadlockThread = new Thread(new Runnable() {
                        
                        @Override
                        public void run() {
                                System.out.println("'consume | consume' pipe 
run in deadlock."); 
                                try {
                                        session.execute("consume | consume"); 
// DEADLOCK
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }
                                System.out.println("Never reached :("); 
                        }
                });
                deadlockThread.start();
                
                Thread.sleep(1000);
                System.out.println("Exit bevor 'Never reached :(' line is 
written.");
        }

        public static class DeadlockSample{
                public void produce(){
                        System.out.println(Math.random());
                }
                
                public void consume() throws IOException{
                        List<String> lines = readSysin();
                        
                        if(lines.isEmpty()){
                                System.out.println("'consume' execution is 
catched by thread-name != 'pipe-...': '" + Thread.currentThread().getName() + 
"'");
                                return;
                        }
                        
                        for (String line : lines) {
                                System.out.println("'consume' " + line);
                        }
                }
        }
        
        public static List<String> readSysin() throws IOException {
                final List<String> lines = new LinkedList<String>();

                BufferedReader reader = new BufferedReader(new 
InputStreamReader(System.in));

                String lastLine = null;
                boolean isFirstLine = true;
                boolean hasNoInput = false;

                while (true) {
                        if (hasNoInput) {
                                break;
                        }
                        String line = null;

                        if (isFirstLine) {
                                isFirstLine = false;
                                boolean isSysinAvailable = 
System.in.available() != 0;
                                boolean isPipedGogoThread = 
Thread.currentThread().getName().startsWith("pipe-");
                                
                                if (isSysinAvailable || isPipedGogoThread) {
                                        line = reader.readLine();
                                }
                        } else
                                line = reader.readLine();

                        if (line == null) {
                                hasNoInput = true;
                                
                                boolean isPreviousLineNull = lastLine == null;
                                if(isPreviousLineNull)
                                        continue;
                                
                                switch (lastLine) {
                                case "":
                                case "true":
                                case "false":
                                        lines.remove(lines.size() - 1);
                                        break;
                                default:
                                        continue;
                                }
                                continue;
                        }
                        lines.add(line);
                        lastLine = line;
                }
                return lines;
        }
}
{code}

I expected a output like: 

{noformat}
0.8792454918763092
'consume' execution is catched by thread-name != 'pipe-...': 'main'
'consume' 0.15400105033134115
'consume | consume' pipe run in deadlock.
Exit bevor 'Never reached :(' line is written.
{noformat}



  was:
{code:java}
package gogo.runtime.deadlock;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;

import org.apache.felix.gogo.runtime.CommandProcessorImpl;
import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
import org.apache.felix.service.command.CommandSession;

public class Main {

        public static void main(String[] args) throws Exception {
                ThreadIOImpl tio = new ThreadIOImpl();
                tio.start();
                
                CommandProcessorImpl processor = new CommandProcessorImpl(tio);
                DeadlockSample commands = new DeadlockSample();
                
                processor.addCommand("deadlock", commands, "produce");
                processor.addCommand("deadlock", commands, "consume");
                
                CommandSession session = processor.createSession(System.in, 
System.out, System.err);
                
                session.execute("produce"); // SUCC
                session.execute("consume"); // SUCC
                session.execute("produce | consume"); //SUCC
                
                Thread deadlockThread = new Thread(new Runnable() {
                        
                        @Override
                        public void run() {
                                System.out.println("'consume | consume' pipe 
run in deadlock."); 
                                try {
                                        session.execute("consume | consume"); 
// DEADLOCK
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }
                                System.out.println("Never reached :("); 
                        }
                });
                deadlockThread.start();
                
                Thread.sleep(1000);
                System.out.println("Exit bevor 'Never reached :(' line is 
written.");
        }

        public static class DeadlockSample{
                public void produce(){
                        System.out.println(Math.random());
                }
                
                public void consume() throws IOException{
                        List<String> lines = readSysin();
                        
                        if(lines.isEmpty()){
                                System.out.println("'consume' execution is 
catched by thread-name != 'pipe-...': '" + Thread.currentThread().getName() + 
"'");
                                return;
                        }
                        
                        for (String line : lines) {
                                System.out.println("'consume' " + line);
                        }
                }
        }
        
        public static List<String> readSysin() throws IOException {
                final List<String> lines = new LinkedList<String>();

                BufferedReader reader = new BufferedReader(new 
InputStreamReader(System.in));

                String lastLine = null;
                boolean isFirstLine = true;
                boolean hasNoInput = false;

                while (true) {
                        if (hasNoInput) {
                                break;
                        }
                        String line = null;

                        if (isFirstLine) {
                                isFirstLine = false;
                                boolean isSysinAvailable = 
System.in.available() != 0;
                                boolean isPipedGogoThread = 
Thread.currentThread().getName().startsWith("pipe-");
                                
                                if (isSysinAvailable || isPipedGogoThread) {
                                        line = reader.readLine();
                                }
                        } else
                                line = reader.readLine();

                        if (line == null) {
                                hasNoInput = true;
                                
                                boolean isPreviousLineNull = lastLine == null;
                                if(isPreviousLineNull)
                                        continue;
                                
                                switch (lastLine) {
                                case "":
                                case "true":
                                case "false":
                                        lines.remove(lines.size() - 1);
                                        break;
                                default:
                                        continue;
                                }
                                continue;
                        }
                        lines.add(line);
                        lastLine = line;
                }
                return lines;
        }
}
{code}

I expected a output like: 

{noformat}
0.8792454918763092
'consume' execution is catched by thread-name != 'pipe-...': 'main'
'consume' 0.15400105033134115
'consume | consume' pipe run in deadlock.
Exit bevor 'Never reached :(' line is written.
{noformat}



> Pipe commands like 'grep' run in System.in deadlock in pipeless mode. 
> ----------------------------------------------------------------------
>
>                 Key: FELIX-5286
>                 URL: https://issues.apache.org/jira/browse/FELIX-5286
>             Project: Felix
>          Issue Type: Bug
>          Components: Gogo Runtime
>    Affects Versions: gogo.runtime-0.16.4
>         Environment: macos
>            Reporter: Jan Winter
>
> {code}
> g! grep 'test'
> # DEADLOCK !!! Java process must be killed. 
> {code}
> *My 'produce | consume' sample*: 
> {code:java}
> package gogo.runtime.deadlock;
> import java.io.BufferedReader;
> import java.io.IOException;
> import java.io.InputStreamReader;
> import java.util.LinkedList;
> import java.util.List;
> import org.apache.felix.gogo.runtime.CommandProcessorImpl;
> import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
> import org.apache.felix.service.command.CommandSession;
> public class Main {
>       public static void main(String[] args) throws Exception {
>               ThreadIOImpl tio = new ThreadIOImpl();
>               tio.start();
>               
>               CommandProcessorImpl processor = new CommandProcessorImpl(tio);
>               DeadlockSample commands = new DeadlockSample();
>               
>               processor.addCommand("deadlock", commands, "produce");
>               processor.addCommand("deadlock", commands, "consume");
>               
>               CommandSession session = processor.createSession(System.in, 
> System.out, System.err);
>               
>               session.execute("produce"); // SUCC
>               session.execute("consume"); // SUCC
>               session.execute("produce | consume"); //SUCC
>               
>               Thread deadlockThread = new Thread(new Runnable() {
>                       
>                       @Override
>                       public void run() {
>                               System.out.println("'consume | consume' pipe 
> run in deadlock."); 
>                               try {
>                                       session.execute("consume | consume"); 
> // DEADLOCK
>                               } catch (Exception e) {
>                                       e.printStackTrace();
>                               }
>                               System.out.println("Never reached :("); 
>                       }
>               });
>               deadlockThread.start();
>               
>               Thread.sleep(1000);
>               System.out.println("Exit bevor 'Never reached :(' line is 
> written.");
>       }
>       public static class DeadlockSample{
>               public void produce(){
>                       System.out.println(Math.random());
>               }
>               
>               public void consume() throws IOException{
>                       List<String> lines = readSysin();
>                       
>                       if(lines.isEmpty()){
>                               System.out.println("'consume' execution is 
> catched by thread-name != 'pipe-...': '" + Thread.currentThread().getName() + 
> "'");
>                               return;
>                       }
>                       
>                       for (String line : lines) {
>                               System.out.println("'consume' " + line);
>                       }
>               }
>       }
>       
>       public static List<String> readSysin() throws IOException {
>               final List<String> lines = new LinkedList<String>();
>               BufferedReader reader = new BufferedReader(new 
> InputStreamReader(System.in));
>               String lastLine = null;
>               boolean isFirstLine = true;
>               boolean hasNoInput = false;
>               while (true) {
>                       if (hasNoInput) {
>                               break;
>                       }
>                       String line = null;
>                       if (isFirstLine) {
>                               isFirstLine = false;
>                               boolean isSysinAvailable = 
> System.in.available() != 0;
>                               boolean isPipedGogoThread = 
> Thread.currentThread().getName().startsWith("pipe-");
>                               
>                               if (isSysinAvailable || isPipedGogoThread) {
>                                       line = reader.readLine();
>                               }
>                       } else
>                               line = reader.readLine();
>                       if (line == null) {
>                               hasNoInput = true;
>                               
>                               boolean isPreviousLineNull = lastLine == null;
>                               if(isPreviousLineNull)
>                                       continue;
>                               
>                               switch (lastLine) {
>                               case "":
>                               case "true":
>                               case "false":
>                                       lines.remove(lines.size() - 1);
>                                       break;
>                               default:
>                                       continue;
>                               }
>                               continue;
>                       }
>                       lines.add(line);
>                       lastLine = line;
>               }
>               return lines;
>       }
> }
> {code}
> I expected a output like: 
> {noformat}
> 0.8792454918763092
> 'consume' execution is catched by thread-name != 'pipe-...': 'main'
> 'consume' 0.15400105033134115
> 'consume | consume' pipe run in deadlock.
> Exit bevor 'Never reached :(' line is written.
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to