[logback-dev] [JIRA] Commented: (LBCLASSIC-35) Deadlock when running on multiple core processors
Ralph Goers
ralph.goers at dslextreme.com
Fri Oct 17 18:44:15 CEST 2008
Sure. Unfortunately I am in meetings today. I'm also in California so I
imagine a phone call would be a little pricey. I can try to chat on irc
but I might be a bit distracted.
Ralph
Ceki Gulcu (JIRA) wrote:
> [ http://jira.qos.ch/browse/LBCLASSIC-35?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=10779#action_10779 ]
>
> Ceki Gulcu commented on LBCLASSIC-35:
> -------------------------------------
>
> I think we should talk over your patch over the phone or via IRC.
>
>
>> Deadlock when running on multiple core processors
>> -------------------------------------------------
>>
>> Key: LBCLASSIC-35
>> URL: http://jira.qos.ch/browse/LBCLASSIC-35
>> Project: logback-classic
>> Issue Type: Bug
>> Components: Other
>> Affects Versions: unspecified
>> Environment: Operating System: Windows
>> Platform: PC
>> Reporter: Toni Heimala
>> Assignee: Ceki Gulcu
>> Priority: Blocker
>> Attachments: patch.txt, patch2.txt
>>
>>
>> When you run logging into same file from many threads on a system that has more than one physical processor (Dual Core for example), a deadlock will occur after a while. This can not be reproduced on HyperThreading processors. Here's an example program that will demonstrate the behavior:
>> -----------------------------
>> Main.java
>> -----------------------------
>> import java.util.Date;
>> import java.util.concurrent.ScheduledThreadPoolExecutor;
>> import java.util.concurrent.TimeUnit;
>> import org.slf4j.Logger;
>> import org.slf4j.LoggerFactory;
>> import ch.qos.logback.classic.LoggerContext;
>> import ch.qos.logback.classic.joran.JoranConfigurator;
>> import ch.qos.logback.core.joran.spi.JoranException;
>> public class Main extends Thread
>> {
>> private final static String LOGGER_CONFIGURATION_FILE = "logger.xml";
>> private final Logger logger = LoggerFactory.getLogger(Main.class);
>>
>> private final long start;
>>
>> public Main()
>> throws JoranException
>> {
>> start = new Date().getTime();
>> LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
>> JoranConfigurator configurator = new JoranConfigurator();
>> lc.shutdownAndReset();
>> configurator.setContext(lc);
>> configurator.doConfigure(LOGGER_CONFIGURATION_FILE);
>> }
>>
>> public void start()
>> {
>> ScheduledThreadPoolExecutor ex1 = new ScheduledThreadPoolExecutor(1);
>> ScheduledThreadPoolExecutor ex2 = new ScheduledThreadPoolExecutor(1);
>> ScheduledThreadPoolExecutor ex3 = new ScheduledThreadPoolExecutor(1);
>> ScheduledThreadPoolExecutor ex4 = new ScheduledThreadPoolExecutor(1);
>> ScheduledThreadPoolExecutor ex5 = new ScheduledThreadPoolExecutor(1);
>> ex1.scheduleAtFixedRate(new Task("EX1"), 10, 10, TimeUnit.MICROSECONDS);
>> ex2.scheduleAtFixedRate(new Task("EX2"), 10, 10, TimeUnit.MICROSECONDS);
>> ex3.scheduleAtFixedRate(new Task("EX3"), 10, 10, TimeUnit.MICROSECONDS);
>> ex4.scheduleAtFixedRate(new Task("EX4"), 10, 10, TimeUnit.MICROSECONDS);
>> ex5.scheduleAtFixedRate(new Task("EX5"), 10, 10, TimeUnit.MICROSECONDS);
>>
>> super.start();
>> }
>>
>> public void run()
>> {
>> try
>> {
>> while(true)
>> {
>> logger.debug("[MAIN] {}", new Date().getTime() - start);
>> Thread.sleep(10);
>> }
>> }
>> catch (InterruptedException e)
>> {
>> logger.info("[MAIN]: Interrupted: {}", e.getMessage());
>> }
>> }
>>
>> public static void main(String[] args)
>> {
>> try
>> {
>> Main main = new Main();
>> main.start();
>> }
>> catch (JoranException e)
>> {
>> System.out.println("Failed to load application: " + e.getMessage());
>> }
>> }
>> }
>> -------------------------------
>> Task.java
>> -------------------------------
>> import java.util.Date;
>> import org.slf4j.Logger;
>> import org.slf4j.LoggerFactory;
>> public class Task implements Runnable
>> {
>> private final Logger logger = LoggerFactory.getLogger(Task.class);
>> private final Logger logger_main = LoggerFactory.getLogger(Main.class);
>> private final String name;
>> private final long start;
>>
>> public Task(final String name)
>> {
>> this.name = name;
>> start = new Date().getTime();
>> }
>> public void run()
>> {
>> logger.debug("[{}] {}", name, new Date().getTime() - start);
>> logger_main.debug("[MAIN] - [{}] {}", name, new Date().getTime() - start);
>> }
>> }
>>
>
>
More information about the logback-dev
mailing list