You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Jan Winter (JIRA)" <ji...@apache.org> on 2016/06/27 13:41:52 UTC

[jira] [Updated] (FELIX-5286) Pipe commands run in System.in deadlock on single call.

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

Jan Winter updated FELIX-5286:
------------------------------
    Description: 
{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."); // FAILED
				try {
					session.execute("consume | consume");
				} catch (Exception e) {
					e.printStackTrace();
				}
				System.out.println("Never reached :("); // DEADLOCK
			}
		});
		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}

  was:

{code:DeadlockSample.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 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;
	}

	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."); // FAILED
				try {
					session.execute("consume | consume");
				} catch (Exception e) {
					e.printStackTrace();
				}
				System.out.println("Never reached :("); // DEADLOCK
			}
		});
		deadlockThread.start();
		
		Thread.sleep(1000);
		System.out.println("Exit bevor 'Never reached :(' line is written.");
	}
}
{code}


> Pipe commands run in System.in deadlock on single call. 
> --------------------------------------------------------
>
>                 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: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."); // FAILED
> 				try {
> 					session.execute("consume | consume");
> 				} catch (Exception e) {
> 					e.printStackTrace();
> 				}
> 				System.out.println("Never reached :("); // DEADLOCK
> 			}
> 		});
> 		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}



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