[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-bugs-dist
Subject: [Bug 123315] kwrite/kate crashes randomly after save
From: Dirk Mueller <mueller () kde ! org>
Date: 2006-06-27 7:04:40
Message-ID: 20060627070440.25019.qmail () ktown ! kde ! org
[Download RAW message or body]
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
http://bugs.kde.org/show_bug.cgi?id=123315
mueller kde org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |RESOLVED
Resolution| |FIXED
------- Additional Comments From mueller kde org 2006-06-27 09:04 -------
SVN commit 555364 by mueller:
Inotify looks nice at the first glance, but gets really really
ugly if you try to keep it behaviour-compatible with stat() code ;(
BUG:123315
M +47 -22 kdirwatch.cpp
--- branches/KDE/3.5/kdelibs/kio/kio/kdirwatch.cpp #555363:555364
@ -407,9 +407,6 @
if ( event->len )
path = QFile::decodeName( QCString( event->name, event->len ) );
- if ( event->mask & IN_IGNORED )
- continue;
-
if ( path.length() && isNoisyFile( path.latin1() ) )
continue;
@ -428,12 +425,15 @
if( event->mask & IN_DELETE_SELF) {
kdDebug(7001) << "-->got deleteself signal for " << e->path << endl;
e->m_status = NonExistent;
- //(void) inotify_rm_watch( m_inotify_fd, e->wd );
- addEntry(0, QDir::cleanDirPath(e->path+"/.."), e, true);
+ if (e->isDir)
+ addEntry(0, QDir::cleanDirPath(e->path+"/.."), e, true);
+ else
+ addEntry(0, QFileInfo(e->path).dirPath(true), e, true);
}
+ if ( event->mask & IN_IGNORED ) {
+ e->wd = 0;
+ }
if ( event->mask & (IN_CREATE|IN_MOVED_TO) ) {
- kdDebug(7001) << "-->got new subfile " << path << " in " << e->path << endl;
-
Entry *sub_entry = e->m_entries.first();
for(;sub_entry; sub_entry = e->m_entries.next())
if (sub_entry->path == e->path + "/" + path) break;
@ -727,7 +727,10 @
return true;
if ( e->m_status == NonExistent ) {
- addEntry(0, QDir::cleanDirPath(e->path+"/.."), e, true);
+ if (e->isDir)
+ addEntry(0, QDir::cleanDirPath(e->path+"/.."), e, true);
+ else
+ addEntry(0, QFileInfo(e->path).dirPath(true), e, true);
return true;
}
@ -782,6 +785,7 @
(*it).m_entries.append(sub_entry);
kdDebug(7001) << "Added already watched Entry " << path
<< " (for " << sub_entry->path << ")" << endl;
+
#ifdef HAVE_DNOTIFY
Entry* e = &(*it);
if( (e->m_mode == DNotifyMode) && (e->dn_fd > 0) ) {
@ -798,6 +802,21 @
}
}
#endif
+
+#ifdef HAVE_INOTIFY
+ Entry* e = &(*it);
+ if( (e->m_mode == INotifyMode) && (e->wd > 0) ) {
+ int mask = IN_DELETE|IN_DELETE_SELF|IN_CREATE|IN_MOVE|IN_MOVE_SELF|IN_DONT_FOLLOW;
+ if(!e->isDir)
+ mask |= IN_MODIFY|IN_ATTRIB;
+ else
+ mask |= IN_ONLYDIR;
+
+ inotify_rm_watch (m_inotify_fd, e->wd);
+ e->wd = inotify_add_watch( m_inotify_fd, QFile::encodeName( e->path ), mask);
+ }
+#endif
+
}
else {
(*it).addClient(instance);
@ -928,8 +947,12 @
m_inotify_fd << ", " << e->wd <<
") for " << e->path << endl;
}
- else
- removeEntry( 0, QDir::cleanDirPath( e->path+"/.." ), e );
+ else {
+ if (e->isDir)
+ removeEntry(0, QDir::cleanDirPath(e->path+"/.."), e);
+ else
+ removeEntry(0, QFileInfo(e->path).dirPath(true), e);
+ }
}
#endif
@ -1167,15 +1190,6 @
return Changed;
}
-#ifdef HAVE_INOTIFY
- // for inotify we delay the initial stating till the first event in it
- if ( e->m_status == Normal && e->m_ctime == invalid_ctime )
- {
- e->m_ctime = stat_buf.st_ctime;
- e->m_nlink = stat_buf.st_nlink;
- }
-#endif
-
return NoChange;
}
@ -1278,7 +1292,7 @
// removeDir(), when called in slotDirty(), can cause a crash otherwise
delayRemove = true;
-#ifdef HAVE_DNOTIFY
+#if defined(HAVE_DNOTIFY) || defined(HAVE_INOTIFY)
QPtrList<Entry> dList, cList;
#endif
@ -1306,6 +1320,16 @
int ev = scanEntry( &(*it) );
+
+#ifdef HAVE_INOTIFY
+ if ((*it).m_mode == INotifyMode && ev == Created && (*it).wd == 0) {
+ cList.append( &(*it) );
+ if (! useINotify( &(*it) )) {
+ useStat( &(*it) );
+ }
+ }
+#endif
+
#ifdef HAVE_DNOTIFY
if ((*it).m_mode == DNotifyMode) {
if ((*it).isDir && (ev == Deleted)) {
@ -1337,7 +1361,7 @
}
-#ifdef HAVE_DNOTIFY
+#if defined(HAVE_DNOTIFY) || defined(HAVE_INOTIFY)
// Scan parent of deleted directories for new creation
Entry* e;
for(e=dList.first();e;e=dList.next())
@ -1542,7 +1566,8 @
kdDebug(7001) << " dependent entries:" << endl;
Entry* d = e->m_entries.first();
for(;d; d = e->m_entries.next()) {
- kdDebug(7001) << " " << d->path << endl;
+ kdDebug(7001) << " " << d << endl;
+ kdDebug(7001) << " " << d->path << " (" << d << ") " << endl;
}
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic