Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Mar 2012 10:24:06 -0500
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-hackers@freebsd.org
Cc:        Sergey Matveychuk <sem@freebsd.org>
Subject:   Re: watching for a directory with kqueue
Message-ID:  <201203061024.06389.jhb@freebsd.org>
In-Reply-To: <4F550227.2010006@FreeBSD.org>
References:  <4F550227.2010006@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Monday, March 05, 2012 1:12:55 pm Sergey Matveychuk wrote:
> Hi.
> 
> I've met a problem with the subj. Could you help?
> 
> I'm watching for a directory:
>      EV_SET(kq_change_list, fd, EVFILT_VNODE,
>              EV_ADD | EV_ENABLE | EV_ONESHOT,
>              NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB,
>              0, 0);
> 
> When the directory changed, I read its contens with opendir, like that:
> struct kq_event kq_event[1000];
> ...
> while(1) {
>          n = kevent(kq, kq_change_list, chlist_used, kq_event, 1000, NULL);
> 	for(i = 0; i < n; i++) {
> 		if(kq_event[i].fflags & NOTE_EXTEND || kq_event[i].fflags & 
NOTE_WRITE) {
> 			opendir(.....)
> 
> It works when I create a few files (1-3), but when I create 10 files 
> with touch(1) I see only 3-6 files with opendir. I've got only one event 
> with kevent() (n=1). Looks like I should got a few events, but I did 
> not. Could you give an advice how to get all created files?

The problem is your kevent can fire after just one file is created, so you
can run opendir() before all 10 files are created.  If you want the keven to 
keep firing, you need to not use EV_ONESHOT.  Instead, you probably want to
use EV_CLEAR.  That would let you get multiple events for the directory, and 
by the last one, all 10 files should be present.

-- 
John Baldwin



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