Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 29 Mar 2008 10:13:28 +0100
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        freebsd-arch@freebsd.org
Cc:        arch@freebsd.org
Subject:   Re: timeout/callout small step forward
Message-ID:  <200803291013.28797.hselasky@c2i.net>
In-Reply-To: <20080328202602.N72156@desktop>
References:  <10004.1205307334@critter.freebsd.dk> <20080312152744.I29518@fledge.watson.org> <20080328202602.N72156@desktop>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,

How does this patch handle when multiple callouts use the same mutex ? Imagine 
that two threads are about to lock the same mutex, then the second thread 
will get nowhere while waiting for the first thread to execute the callback.

I think the solution is that callbacks are put in a tree. Giant locked 
callbacks go all into the same tree. Else the user of callouts is responsible 
for making up the tree.

struct callout {
	struct thread *exec_td;
	struct callout *parent;
};

struct callout *c;

while (c->parent != NULL) {
	c = c->parent;
}

if (c->exec_td != NULL) {
	callout should go into the same thread;
} else {
	pick the next free thread and set "c->exec_td"
}

Callouts that belong to the same tree are run from the same thread. This does 
not only apply for callouts, but also multithreaded node systems ...

Yours
  --HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803291013.28797.hselasky>