<feed xmlns='http://www.w3.org/2005/Atom'>
<title>change, branch master</title>
<subtitle>Transparent fs change tracking based on function interposition</subtitle>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/'/>
<entry>
<title>Use a more robust way of determining if fallback is required</title>
<updated>2016-03-04T12:45:41+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-03-04T12:45:41+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=c7357934d8dc4c6a6deb68b7bc8bcd733b81601d'/>
<id>c7357934d8dc4c6a6deb68b7bc8bcd733b81601d</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Match relevant sections of _nvim_ filter to _vim_ filter</title>
<updated>2016-03-04T12:45:11+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-03-04T12:45:11+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=afe443e20fc9197e4a21d8d8d92ad67852f0ef36'/>
<id>afe443e20fc9197e4a21d8d8d92ad67852f0ef36</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Implement support for automatic editor determination</title>
<updated>2016-03-03T21:08:50+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-03-03T21:08:50+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=5faa18fd97f4706e6eb47177dc1877a47febdfb1'/>
<id>5faa18fd97f4706e6eb47177dc1877a47febdfb1</id>
<content type='text'>
If the first argument is not an executable `change` tries to open the provided arguments as files in the default text editor. This adds `mimedb` as a new dependency.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
If the first argument is not an executable `change` tries to open the provided arguments as files in the default text editor. This adds `mimedb` as a new dependency.
</pre>
</div>
</content>
</entry>
<entry>
<title>Expand _vim_ filter definition</title>
<updated>2016-03-03T20:44:18+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-03-03T20:44:18+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=32f634e02a6ead1b69b608f95643e46bbdb37029'/>
<id>32f634e02a6ead1b69b608f95643e46bbdb37029</id>
<content type='text'>
It now catches creation test files prefixed by a path as well as all fallback swap file extensions.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
It now catches creation test files prefixed by a path as well as all fallback swap file extensions.
</pre>
</div>
</content>
</entry>
<entry>
<title>Verify existence of log file, set appropriate return code</title>
<updated>2016-03-03T20:21:17+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-03-03T20:21:17+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=e1dabdef0969abbed1c3f13290079506ae52444e'/>
<id>e1dabdef0969abbed1c3f13290079506ae52444e</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Rename `PathMatcher::isMatching` to `PathMatcher::is_matching`</title>
<updated>2016-02-22T19:46:27+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-22T19:46:27+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=f357d79176ffbde8947a8c9b039729273f7411cd'/>
<id>f357d79176ffbde8947a8c9b039729273f7411cd</id>
<content type='text'>
Purely cosmetic change to match the overall naming scheme.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Purely cosmetic change to match the overall naming scheme.
</pre>
</div>
</content>
</entry>
<entry>
<title>Link `ld.so` via the build system instead of raw compiler flags</title>
<updated>2016-02-22T19:45:46+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-22T19:45:46+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=c67bd1d54e518bb9f4ecef97962100eb41dbac42'/>
<id>c67bd1d54e518bb9f4ecef97962100eb41dbac42</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Release source under the terms of the MIT license</title>
<updated>2016-02-22T19:45:27+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-22T19:45:27+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=cb4aaed7d4c6ff35428e527cd95ab7d9b76430f6'/>
<id>cb4aaed7d4c6ff35428e527cd95ab7d9b76430f6</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Interpose `open` library function</title>
<updated>2016-02-20T21:30:11+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-20T21:30:11+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=b3ef0fc8daa41e433f1919a4933a1cc047f59341'/>
<id>b3ef0fc8daa41e433f1919a4933a1cc047f59341</id>
<content type='text'>
`open` is not as side effect free as I had imagined - i.e. if the flag `O_TRUNC` is passed it truncates the file contents alongside opening the file descriptor. In practice this is done by _emacs_ prior to writing the new file content and as such needs to be intercepted so we can start tracking the file before it is changed.

Interposing `open` required some changes to make the library work without including `fcntl.h`. This header not only defines some of the flags we require to check if a library call actually is able to change files but also defines the `open` library function.

While implementing this change I noticed that the function interpositions implemented in C++ actually need to be declared as `external "C"` so their names do not get wrangled during compilation. I suspect that this was previously implicitly done for e.g. `mmap` and `write` by the included C standard library headers. However this did not work for `open` which is why all function interpositions are now explicitly declared external.

End result: _emacs_ file changes are now tracked correctly.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
`open` is not as side effect free as I had imagined - i.e. if the flag `O_TRUNC` is passed it truncates the file contents alongside opening the file descriptor. In practice this is done by _emacs_ prior to writing the new file content and as such needs to be intercepted so we can start tracking the file before it is changed.

Interposing `open` required some changes to make the library work without including `fcntl.h`. This header not only defines some of the flags we require to check if a library call actually is able to change files but also defines the `open` library function.

While implementing this change I noticed that the function interpositions implemented in C++ actually need to be declared as `external "C"` so their names do not get wrangled during compilation. I suspect that this was previously implicitly done for e.g. `mmap` and `write` by the included C standard library headers. However this did not work for `open` which is why all function interpositions are now explicitly declared external.

End result: _emacs_ file changes are now tracked correctly.
</pre>
</div>
</content>
</entry>
<entry>
<title>Add filter definition for _neovim_</title>
<updated>2016-02-19T19:43:34+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-19T19:43:34+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=ee51dc19c859e718280bebae1c089be058737b1c'/>
<id>ee51dc19c859e718280bebae1c089be058737b1c</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Create alias of _vim_ filter definition for _gvim_</title>
<updated>2016-02-19T19:42:52+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-19T19:42:52+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=03a1e390527a0d1b4d171a0a099e97b3bfef90ae'/>
<id>03a1e390527a0d1b4d171a0a099e97b3bfef90ae</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add filter definition for _vim_</title>
<updated>2016-02-19T18:15:04+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-19T18:15:04+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=4502d5f0a023b7776c6c8eb4f4c9c7006ce529ee'/>
<id>4502d5f0a023b7776c6c8eb4f4c9c7006ce529ee</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add support for global application specific filter definitions</title>
<updated>2016-02-19T18:14:45+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-19T18:14:45+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=e71905763d0c1856fe245a4c27be9fc694cd92ee'/>
<id>e71905763d0c1856fe245a4c27be9fc694cd92ee</id>
<content type='text'>
i.e. `change` now tries to read a filter definition file matching the current process' name from `/usr/local/share/libChangeLog/filter`.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
i.e. `change` now tries to read a filter definition file matching the current process' name from `/usr/local/share/libChangeLog/filter`.
</pre>
</div>
</content>
</entry>
<entry>
<title>Rename some functions to match overall naming scheme</title>
<updated>2016-02-19T18:11:33+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-19T18:11:33+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=5021c97e31ef8bb7cf40471e3fa98b451097451b'/>
<id>5021c97e31ef8bb7cf40471e3fa98b451097451b</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Move io utilities into separate compilation unit</title>
<updated>2016-02-17T21:06:36+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-17T21:06:36+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=50f2ef4ba33b540fa5a8e324996fa639500765f4'/>
<id>50f2ef4ba33b540fa5a8e324996fa639500765f4</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Separate static allocator from payload function interpositions</title>
<updated>2016-02-17T20:58:38+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-17T20:58:38+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=3294bfe789ff354ca372f7c32275316bf4491ca5'/>
<id>3294bfe789ff354ca372f7c32275316bf4491ca5</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Implement static allocator for initialization</title>
<updated>2016-02-17T14:02:48+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-17T14:02:48+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=af756d78ac042a2eed2417c5250d4b675d43bf93'/>
<id>af756d78ac042a2eed2417c5250d4b675d43bf93</id>
<content type='text'>
The previous interposition logic based on plain usage of `dlsym` analogously to various online examples led to a deadlock during _neovim_ startup. This deadlock was caused by _neovim_'s custom memory allocation library _jemalloc_ because it calls `mmap` during its initialization phase. The problem with calling `mmap` during initialization is that this already leads to executing `libChangeLog`'s `mmap` version whoes static `actual_mmap` function pointer is not initialized at this point in time. This is detected and leads to a call to `dlsym` to remedy this situation. Sadly `dlsym` in turn requires memory allocation using `calloc` which leads us back to initializing _jemalloc_ and as such to a deadlock.

I first saw this as a bug in _jemalloc_ which seemed to be confirmed by a short search in my search engine of choice. This prompted me to create an appropriate [bug report](https://github.com/jemalloc/jemalloc/issues/329) which was dismissed as a problem in the way `mmap` was interposed and not as a bug in the library. Thus it seems to be accepted practice that it is not the responsibility of a custom memory allocator to cater to the initialization needs of other libraries relying on function interposition. This is of course a valid position as the whole issue is a kind of _chicken and egg_ problem where both sides can be argued.

To cut to the chase I was left with the only option of working around this deadlock by adapting `libChangeLog` to call `dlsym` without relying on the wrapped application's memory allocator of choice. The most straight forward way to do this is to provide another custom memory allocator alongside the _payload_ function interpositions of `mmap` and friends.

`init/alloc.cc` implements such a selectively transparent memory allocator that offers a small static buffer for usage in the context of executing `dlsym`.The choice between forwarding memory allocation requests to the wrapped application's allocator and using the static buffer is governed by `init::dlsymContext`. This tiny helper class maintains an `dlsym_level` counter by posing as a scope guard.

The end result of this extension to `libChangeLog` is that it now also works with applications using _jemalloc_ such as _neovim_ and should overall be much more robust during its initialization phase.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The previous interposition logic based on plain usage of `dlsym` analogously to various online examples led to a deadlock during _neovim_ startup. This deadlock was caused by _neovim_'s custom memory allocation library _jemalloc_ because it calls `mmap` during its initialization phase. The problem with calling `mmap` during initialization is that this already leads to executing `libChangeLog`'s `mmap` version whoes static `actual_mmap` function pointer is not initialized at this point in time. This is detected and leads to a call to `dlsym` to remedy this situation. Sadly `dlsym` in turn requires memory allocation using `calloc` which leads us back to initializing _jemalloc_ and as such to a deadlock.

I first saw this as a bug in _jemalloc_ which seemed to be confirmed by a short search in my search engine of choice. This prompted me to create an appropriate [bug report](https://github.com/jemalloc/jemalloc/issues/329) which was dismissed as a problem in the way `mmap` was interposed and not as a bug in the library. Thus it seems to be accepted practice that it is not the responsibility of a custom memory allocator to cater to the initialization needs of other libraries relying on function interposition. This is of course a valid position as the whole issue is a kind of _chicken and egg_ problem where both sides can be argued.

To cut to the chase I was left with the only option of working around this deadlock by adapting `libChangeLog` to call `dlsym` without relying on the wrapped application's memory allocator of choice. The most straight forward way to do this is to provide another custom memory allocator alongside the _payload_ function interpositions of `mmap` and friends.

`init/alloc.cc` implements such a selectively transparent memory allocator that offers a small static buffer for usage in the context of executing `dlsym`.The choice between forwarding memory allocation requests to the wrapped application's allocator and using the static buffer is governed by `init::dlsymContext`. This tiny helper class maintains an `dlsym_level` counter by posing as a scope guard.

The end result of this extension to `libChangeLog` is that it now also works with applications using _jemalloc_ such as _neovim_ and should overall be much more robust during its initialization phase.
</pre>
</div>
</content>
</entry>
<entry>
<title>Move actual function pointers to function local static variables</title>
<updated>2016-02-16T22:55:40+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-16T22:55:40+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=98f68dd9bb0318acfaaf7f2e7ad571a19729a8bb'/>
<id>98f68dd9bb0318acfaaf7f2e7ad571a19729a8bb</id>
<content type='text'>
The previous approach of storing them in static variables of the `actual` namespace and initializing them statically did not work out as it is not guaranteed that they are initialized before any interposed function is called.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The previous approach of storing them in static variables of the `actual` namespace and initializing them statically did not work out as it is not guaranteed that they are initialized before any interposed function is called.
</pre>
</div>
</content>
</entry>
<entry>
<title>Adapt `get_actual_function` template to accept newly introduced `function_ptr`</title>
<updated>2016-02-16T22:54:18+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-16T22:37:39+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=e0b000a61f54db41286ededcc795318c79715d6e'/>
<id>e0b000a61f54db41286ededcc795318c79715d6e</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Replace `std::function` with raw function pointer</title>
<updated>2016-02-16T22:30:16+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-16T22:30:16+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=f4353423207c451244ce9118b54ef3dcb28c7f89'/>
<id>f4353423207c451244ce9118b54ef3dcb28c7f89</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Update `README.md` to explain the filtering capabilities</title>
<updated>2016-02-15T19:27:59+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-15T19:27:59+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=6fd2e1dea2625a975347ada0a23fb172aeeb28c7'/>
<id>6fd2e1dea2625a975347ada0a23fb172aeeb28c7</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add support for commenting ignore patterns file</title>
<updated>2016-02-15T17:01:39+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-15T17:01:39+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=0e6a00561cc7997ebb382f96d296bc84725ed91d'/>
<id>0e6a00561cc7997ebb382f96d296bc84725ed91d</id>
<content type='text'>
All lines starting with `#` are interpreted as comments
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
All lines starting with `#` are interpreted as comments
</pre>
</div>
</content>
</entry>
<entry>
<title>Implement support for excluding arbitrary paths from tracking</title>
<updated>2016-02-14T19:52:29+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-14T19:52:29+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=1ffaf37388cd691e88196b6e00455eda0e652cf0'/>
<id>1ffaf37388cd691e88196b6e00455eda0e652cf0</id>
<content type='text'>
The library may be provided with a new-line separated list of regular expressions via the newly introduced `CHANGE_LOG_IGNORE_PATTERN_PATH`.

Any proposed tracking path that is matched by any of the provided patterns is excluded from change reporting. This functionality uses the Standard's regular expression parsing functionality and as such doesn't introduce any new dependencies. If no file path is provided or the provided file path is unreadable all paths will be tracked.

`change` was adapted to set `CHANGE_LOG_IGNORE_PATTERN_PATH` to `.change_log_ignore` which means that it will by default exclude any patterns provided via this file in the current working directory.

An example for such a file customized for hiding _vim_'s internal write
logic may look as follows:

	[0-9]+
	[^~]*~
	[.*\.viminfo
	.*\.swp

Note that this is implemented in a fashion where it is not guaranteed that the full _canonical_ path is checked against the patterns. It remains to be decided if this is enough for all common use cases of this new functionality.

`tracking::PathMatcher` lacks any explicit thread synchronization - according to my current knowledge this should not be necessary as we are only ever reading the private `std::vector&lt;std::regex&gt;` instance.
If invalid regular expressions are provided they are silently ignored.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The library may be provided with a new-line separated list of regular expressions via the newly introduced `CHANGE_LOG_IGNORE_PATTERN_PATH`.

Any proposed tracking path that is matched by any of the provided patterns is excluded from change reporting. This functionality uses the Standard's regular expression parsing functionality and as such doesn't introduce any new dependencies. If no file path is provided or the provided file path is unreadable all paths will be tracked.

`change` was adapted to set `CHANGE_LOG_IGNORE_PATTERN_PATH` to `.change_log_ignore` which means that it will by default exclude any patterns provided via this file in the current working directory.

An example for such a file customized for hiding _vim_'s internal write
logic may look as follows:

	[0-9]+
	[^~]*~
	[.*\.viminfo
	.*\.swp

Note that this is implemented in a fashion where it is not guaranteed that the full _canonical_ path is checked against the patterns. It remains to be decided if this is enough for all common use cases of this new functionality.

`tracking::PathMatcher` lacks any explicit thread synchronization - according to my current knowledge this should not be necessary as we are only ever reading the private `std::vector&lt;std::regex&gt;` instance.
If invalid regular expressions are provided they are silently ignored.
</pre>
</div>
</content>
</entry>
<entry>
<title>Reduce `ChangeTracker` public _interface_ to `track`</title>
<updated>2016-02-14T12:31:59+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-14T12:31:59+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=f8eecef184c8684a3ed27712ccf8f7f866d47c40'/>
<id>f8eecef184c8684a3ed27712ccf8f7f866d47c40</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add `README.md`</title>
<updated>2016-02-13T20:47:10+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-13T20:47:10+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=055bd52fd88f49b8aef4da4b7b7c6b38cb1f7e3e'/>
<id>055bd52fd88f49b8aef4da4b7b7c6b38cb1f7e3e</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add filesystem exception handling where required</title>
<updated>2016-02-13T19:56:05+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-13T19:56:05+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=23b56fad3873b03a4b1f04e299104a7b52c62391'/>
<id>23b56fad3873b03a4b1f04e299104a7b52c62391</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Reimplement locking in `Logger::append`</title>
<updated>2016-02-13T15:30:08+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-13T15:30:08+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=0ba583aa35bccf268e30dd03a6d423df5f98b40e'/>
<id>0ba583aa35bccf268e30dd03a6d423df5f98b40e</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Delay tracking activation</title>
<updated>2016-02-11T17:43:27+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-11T17:43:27+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=7582ab165b4c57d2325561b59d99a6665af28cc3'/>
<id>7582ab165b4c57d2325561b59d99a6665af28cc3</id>
<content type='text'>
Introduce global static `enabled` variable used to signal the interposed functions to either start tracking or perform plain forwarding without any additional logic.
This is required as e.g. `nvim` crashed when wrapped in `libChangeLog` because it called interposed functions during library initialization.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Introduce global static `enabled` variable used to signal the interposed functions to either start tracking or perform plain forwarding without any additional logic.
This is required as e.g. `nvim` crashed when wrapped in `libChangeLog` because it called interposed functions during library initialization.
</pre>
</div>
</content>
</entry>
<entry>
<title>Extract file descriptor filter logic</title>
<updated>2016-02-11T13:05:00+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-11T13:05:00+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=b9f79c106295f2f2589b92b17f60711a43bfbbce'/>
<id>b9f79c106295f2f2589b92b17f60711a43bfbbce</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Extract child emplacement into thread safe member</title>
<updated>2016-02-11T12:57:27+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-11T12:57:27+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=5ea3620b2fb39ee9408d93fd6cd214d557d42a7f'/>
<id>5ea3620b2fb39ee9408d93fd6cd214d557d42a7f</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Replace macro argument expansion with more idiomatic recursive template</title>
<updated>2016-02-10T20:38:10+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-10T20:38:10+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=801ddda073b04c9751bc9e4f935bd102d7741c7b'/>
<id>801ddda073b04c9751bc9e4f935bd102d7741c7b</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Increase log message generation readability</title>
<updated>2016-02-07T21:18:10+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-07T21:18:10+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=77ca603e933af25088057dc5e26cfda84bde7147'/>
<id>77ca603e933af25088057dc5e26cfda84bde7147</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Prevent deleted files from being displayed using `diff`</title>
<updated>2016-02-06T22:33:47+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-06T22:33:47+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=bfa7c9e7ea1f818482a4205a500e87fb9d8a8ec3'/>
<id>bfa7c9e7ea1f818482a4205a500e87fb9d8a8ec3</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Track `writev` system call</title>
<updated>2016-02-06T21:27:55+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-06T21:27:55+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=8923cf4f88ae6e665b0571ac435c72f62461efb3'/>
<id>8923cf4f88ae6e665b0571ac435c72f62461efb3</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Preserve pre-change file content as tracking state</title>
<updated>2016-02-06T21:20:46+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2016-02-06T21:20:46+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=f08930c9c9ce91007c2f576c25d3f874abb96a00'/>
<id>f08930c9c9ce91007c2f576c25d3f874abb96a00</id>
<content type='text'>
Relying on `diff` for storing the pre-change content did not work out as it opens the file descriptors to soon and only reads the first block of pre-change file content until the remaining content is actually required. This obviously led to problems when tracking actually changing files.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Relying on `diff` for storing the pre-change content did not work out as it opens the file descriptors to soon and only reads the first block of pre-change file content until the remaining content is actually required. This obviously led to problems when tracking actually changing files.
</pre>
</div>
</content>
</entry>
<entry>
<title>Introduce thread synchronization for tracking init and logging</title>
<updated>2015-12-27T09:07:24+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-27T09:07:24+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=0f083843bc31bf985991728125ef74efca6ef7b7'/>
<id>0f083843bc31bf985991728125ef74efca6ef7b7</id>
<content type='text'>
This obviously leads to synchronizing syscalls that would otherwise happen in parallel. Luckily the goal of this library is to monitor file changes performed by single, user facing applications and as such it doesn't matter if some operations are slightly slower.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This obviously leads to synchronizing syscalls that would otherwise happen in parallel. Luckily the goal of this library is to monitor file changes performed by single, user facing applications and as such it doesn't matter if some operations are slightly slower.
</pre>
</div>
</content>
</entry>
<entry>
<title>Explicitly set log file permissions</title>
<updated>2015-12-27T08:45:56+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-27T08:45:56+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=0f1b6aea1fc7a2753cfde98a74c1ab74e258576e'/>
<id>0f1b6aea1fc7a2753cfde98a74c1ab74e258576e</id>
<content type='text'>
This ensures that the log file is actually accessable - there was a problem where e.g. `change rm test` did not create the log file correctly.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This ensures that the log file is actually accessable - there was a problem where e.g. `change rm test` did not create the log file correctly.
</pre>
</div>
</content>
</entry>
<entry>
<title>Evaluate all `change` arguments sans the first one</title>
<updated>2015-12-24T13:30:25+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-24T13:30:25+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=9975a920820cd85e5b1d276bd1eae0dacf6b56a0'/>
<id>9975a920820cd85e5b1d276bd1eae0dacf6b56a0</id>
<content type='text'>
i.e. enable writing `change vim test` instead of `change "vim test"`.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
i.e. enable writing `change vim test` instead of `change "vim test"`.
</pre>
</div>
</content>
</entry>
<entry>
<title>Add installation rules to `CMakeLists.txt`</title>
<updated>2015-12-24T13:20:39+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-24T13:20:39+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=b94b106f3de718893e0c1ce7a1c9a081c189aefb'/>
<id>b94b106f3de718893e0c1ce7a1c9a081c189aefb</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Implement basic library usage helper</title>
<updated>2015-12-24T13:08:37+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-24T13:08:37+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=a8db66ab7c34199222c520e6cad63d8de3d04190'/>
<id>a8db66ab7c34199222c520e6cad63d8de3d04190</id>
<content type='text'>
`change` calls the given command wrapped in `libChangeLog` and prints the recorded change log afterwards.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
`change` calls the given command wrapped in `libChangeLog` and prints the recorded change log afterwards.
</pre>
</div>
</content>
</entry>
<entry>
<title>Prevent the libraries own log writes from being tracked</title>
<updated>2015-12-24T13:04:21+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-24T13:04:21+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=c2af553b1c2de9fb158a70c5858d9c7fa527f9ee'/>
<id>c2af553b1c2de9fb158a70c5858d9c7fa527f9ee</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add path label for the file provided via standard input</title>
<updated>2015-12-24T09:38:42+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-24T09:38:42+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=a8157a2acf5ac23e58aa18fe3ddf855341790d5f'/>
<id>a8157a2acf5ac23e58aa18fe3ddf855341790d5f</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Use full path for change tracking</title>
<updated>2015-12-24T09:28:20+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-24T09:28:20+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=50e1bb1a194c06ed0110bd13b5cca769a38c4157'/>
<id>50e1bb1a194c06ed0110bd13b5cca769a38c4157</id>
<content type='text'>
Prevents the same file being tracked multiple times due to relative input paths.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Prevents the same file being tracked multiple times due to relative input paths.
</pre>
</div>
</content>
</entry>
<entry>
<title>Add support for changing the `diff` command via an environment variable</title>
<updated>2015-12-23T23:37:32+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-23T23:37:32+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=ce1460dd98185f80db479c7dc7ca19026149a255'/>
<id>ce1460dd98185f80db479c7dc7ca19026149a255</id>
<content type='text'>
While the file arguments remain fixed the actual `diff` application and its output style can be changed using the `CHANGE_LOG_DIFF_CMD` environment variable.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
While the file arguments remain fixed the actual `diff` application and its output style can be changed using the `CHANGE_LOG_DIFF_CMD` environment variable.
</pre>
</div>
</content>
</entry>
<entry>
<title>Remove unnecessary headers</title>
<updated>2015-12-23T23:16:35+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-23T23:16:35+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=f47dc6ba1a17052ad4dde1d685772b83f23a8477'/>
<id>f47dc6ba1a17052ad4dde1d685772b83f23a8477</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Remove `exit` logging and interposition</title>
<updated>2015-12-23T23:13:07+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-23T23:13:07+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=cea586ab0d9007e11bbd4bcef216445c3f58f34d'/>
<id>cea586ab0d9007e11bbd4bcef216445c3f58f34d</id>
<content type='text'>
The library is designed to track the file changes performed by a single process, i.e. there is no need for explicitly stating when the process has exited. Furthermore this reduces the set of function interpositions to the ones handled by the `get_actual_function` method template.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The library is designed to track the file changes performed by a single process, i.e. there is no need for explicitly stating when the process has exited. Furthermore this reduces the set of function interpositions to the ones handled by the `get_actual_function` method template.
</pre>
</div>
</content>
</entry>
<entry>
<title>Match namespace and directory structure</title>
<updated>2015-12-23T23:11:06+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-23T23:11:06+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=baf30b7b83822b7d6efd0c16761b8e42a1e96101'/>
<id>baf30b7b83822b7d6efd0c16761b8e42a1e96101</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Implement file change tracking using `diff`</title>
<updated>2015-12-23T20:43:51+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-23T20:43:51+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=cce63aca270c51fb3ce9790438e3c23864de0a87'/>
<id>cce63aca270c51fb3ce9790438e3c23864de0a87</id>
<content type='text'>
The newly introduced `ChangeTracker` class is now keeping track of all tracked file in addition to spawning and managing a corresponding `diff` instance that enables printing pretty _patch-style_ change summaries to the logging target.

This commit introduces `boost-process` and `diff` as dependencies of this library.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The newly introduced `ChangeTracker` class is now keeping track of all tracked file in addition to spawning and managing a corresponding `diff` instance that enables printing pretty _patch-style_ change summaries to the logging target.

This commit introduces `boost-process` and `diff` as dependencies of this library.
</pre>
</div>
</content>
</entry>
<entry>
<title>Add file mode check in `unlink`</title>
<updated>2015-12-21T11:18:46+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-12-21T11:18:46+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=b02091f847b94e94db465469e723fcf2aee81a01'/>
<id>b02091f847b94e94db465469e723fcf2aee81a01</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Extract actual function acquisition</title>
<updated>2015-11-30T11:07:33+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2015-11-30T11:07:33+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/change/commit/?id=30d28c558015afe22822647cc3943e2afb14afde'/>
<id>30d28c558015afe22822647cc3943e2afb14afde</id>
<content type='text'>
The pointers to the actual function implementations are now fetched inside the `actual` namespace declared in the `actual_function.h` header.

Fixed source of _noreturn_ related warning during compilation by adding the appropriate flag. Sadly this means that we can not use `std::function` in this context as it doesn't seem to carry these _c-like_ flags.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The pointers to the actual function implementations are now fetched inside the `actual` namespace declared in the `actual_function.h` header.

Fixed source of _noreturn_ related warning during compilation by adding the appropriate flag. Sadly this means that we can not use `std::function` in this context as it doesn't seem to carry these _c-like_ flags.
</pre>
</div>
</content>
</entry>
</feed>
