This requires GLIBC 2.23+, plus either gcc 6+ or clang 14+.
- Provides build-time feature detection
- Use with (un)premultiply for ~10% perf gain on AVX CPUs
- Slightly increases binary size, so best to use sparingly
* Add `vips_semaphore_down_timeout` to public API
In preparation for the next commit.
* threadset: stop idle threads after a regular timeout
In line with the previous behaviour of GLib's threadpool.
* threadset: fix a small memory leak
* threadset: ensure idle threads are freed on exit
GLib threads are spawned with `ref_count == 2`, this reference is
decreased during thread exit and associated resources are freed
during `g_thread_join()`. However, idle threads that are stopped
after a regular timeout are not joined. To fix this, decrease the
reference count during `vips_threadset_add()` and increase it just
before joining the thread with `g_thread_join()`.
See:
2d5d990c6a/glib/gthread.c (L522)2d5d990c6a/glib/gthread-posix.c (L1287)
* Deprecate `vips_g_thread_join()` in favor of `g_thread_join()`
* nit: remove extra semicolon
* heifsave: make it possible to use a specific encoder
* argument label: switch to leading capital letter
Co-authored-by: Kleis Auke Wolthuizen <github@kleisauke.nl>
* add VipsForeignHeifEncoder enum
* correct type
* implement reviewer feedback
Co-authored-by: Kleis Auke Wolthuizen <github@kleisauke.nl>
* reimplement threadpool
just a set of threads that get recycled
"ninja test" passes and dzsave seems to work, though pytest fails for
some reason
* clean up threading code a bit
move base stuff into thread.c, so we have a simple
thread -> threadset -> threadpool
layering
* start trying to revert g_threadpool
based on the original commit
* working!
nice low systime again
still need to repply cnages to threadpool.c since 80e0cc3d1
* reapply fixes from master
so threadpool.c is now up to date
* rename VipsThread as VipsWorker
a bit less confusing
* use a semaphore to count workers in a pool
* tidy up
* formatting
* dynamic threadpool sizing
based on counting the number of blocked threads in each pool
it works, but the improvement is not great :(
* add "concurrency" metadata item
so operators can hint threadpool size (dzsave especially)
* don't use thinstrip for small images
* add RGB mode to openslide
since flatten was taking 20% of CPU time for dzsave
* fix up rgb mode
now actually works
* make the tile buffer per thread
in the new openslideload rgb mode
* fix dynamic pool downsize
* mild refactoring
* fix the buffer system
oops, turned it off by mistake
* all done!
* revise changelog
* Update libvips/iofuncs/threadset.c
Co-authored-by: Kleis Auke Wolthuizen <github@kleisauke.nl>
* Update libvips/iofuncs/threadset.c
Co-authored-by: Kleis Auke Wolthuizen <github@kleisauke.nl>
* LSan: add libMagickCore to suppression file
* Revert "Remove mutex lock for VipsThreadStartFn"
This reverts commit 41440491.
* add VIPS_MAX_THREADS
to set a hard limit on the threadset size
* Revert "Revert "Remove mutex lock for VipsThreadStartFn""
This reverts commit 77e8520966ba79194fff3b4e648bbd295cd5c260.
* remove sslock from sink.c
* move fixed threadpool build to init
not first use
* add some doc comments
* revert test suite threshold change
* add a test for MAX_THREADS
and move the test tmp/ area into the builddir
* limit VIPS_MAX_THREADS to sane values
* use tabs rather than spaces
Co-authored-by: Kleis Auke Wolthuizen <github@kleisauke.nl>
* move tiff decompress outside lock
Most time in TIFF read is spent in decompression. If we move this
outside the lock, we can get a useful speedup.
This commit adds the machinery to move the lock to before decompress, so
jp2k decompression is now threaded.
Before:
```
$ vips copy wtc.jpg x.tif[tile,compression=jp2k]
$ time vips avg x.tif
117.249845
real 0m15.085s
user 0m16.155s
sys 0m0.109s
```
After:
```
$ time vips avg x.tif
117.249845
real 0m1.207s
user 0m18.384s
sys 0m0.369s
```
* start moving jpg decode outside the lock
* move jpeg decompress outside the lock
seems to work
* add some more tile size checks
double-check jpeg tile size before decode
* fix tiffload demand hinting
We were not setting the hint correctly in header load, and we were not
hinting smalltile for tiled TIFFs.
* Remove `glib-mkenums` autotools templates and generated files
Meson uses the `enumtypes.c.in` and `enumtypes.h.in` in
`libvips/include/vips` and doesn't use the pre-generated
files.
* Remove man files for no longer existing tools
+ update the `meson.build`.
* Remove Autotools section in `.gitignore`
* Remove `po/messages` left-over
* Remove `g-ir-scanner` entry point
No longer needed by Meson.
* Remove `glib-genmarshal` generated files
Meson doesn't use these pre-generated files.
* Remove Autotools specific Git attributes
* Remove no longer existing tools in `.gitignore`
* Remove Make specific things in `.gitignore`
* Rename COPYING to LICENSE
* Remove no longer needed `.gitignore` sections
Meson only supports out-of-tree builds. This assumes that the
build directory is ignored.
* Remove no longer needed `.editorconfig` sections
* Avoid writing the full path in enumtypes.h
Helps reproducible builds, as build paths can vary between builds.
* Use g_intern_static_string() for enum/flags type names
We are emitting a static string, so use that shortcut function to
intern it, which will save one allocation.
* Use g_once_init_enter/leave to register enum/flags type names
This is the more modern way, and ensures thread-safety.
- Remove `HAVE_LCMS` definition in favor of `HAVE_LCMS2`.
- Remove `HAVE_WINDOWS_H` definition in favor of `G_OS_WIN32`.
- Remove stray `vips_text_get_type` in `conversion.c`.
- Remove duplicated `unistd.h` include.
- Remove redundant `strcasecmp` definition, we use `g_ascii_strcasecmp` everywhere.
- Remove unnecessary header checks in `configure.ac` and `meson.build`.
- Ensure `unistd.h` include is guarded with `HAVE_UNISTD_H`.
- Fail early when `-Dfontconfig=enabled` and `pangoft2` is not found.
* start adding dzsave to a target
made a thing for gsf to write to a target
* fix stray tabs in dzsave
* fix dzsave write to "."
Early versions of libgsf did not support writing to ".", so we had an ugly
workaround, but this should now be OK.
Fixing this ought to make write to target simple
* dzsave_target compiles
no idea if it works though
* seems to work now
creates stray 0 length files though, very odd
* fix stray files from dzsave
next: save to buffer is returning null
* fix buffer flush in dzsave
all tests pass!
* update changelog
* compiles, but untested
* works, but libtiff needs seek for write
next: add seek methods to target
* add target seek and read
seem to work
next: disc temps for disc output
* add libnsgif COPYING
oops, we were missing the COPYING file
see https://github.com/libvips/libvips/issues/2800
thanks mika-fischer
* tiffsave uses a disc temp if it can
* revise temp target rules
only make a disc temp if we are writing to a filesystem target
* add new target methods to targetcustom
since finish did not return an error code
also make sure we don't call target_end from inside _dispose, since that
can't signal error either
see https://github.com/libvips/libvips/issues/2801
* quick proposal
warn on startup if untrusted operations might run
use vips_block_untrusted_set() to block untrusted operations, set an env
var or make a file to stop the warning
* mark fits, nifti and svg as untrusted
* remove the annoying "untrusted" warning message
better to warn on the download page
leave vips_block_untrusted_set() since it's obviously useful
* separate UNTRUSTED and BLOCKED
* typos
* add VIPS_BLOCK_UNTRUSTED env var
* move BLOCK_UNTRUSTED after plugin load
obviously, ooops
* add a test, disable *magick
although *magick is fuzzed, it's probably safer to disable it in
untrusted environments
* mark some more operations as untrusted
Use GLib's i18n support instead of copying and pasting that
logic into its own header. This deprecates the vips/intl.h
header in favour of glib/gi18n.h.
* Meson: remove space before colon
Since key-value pairs in Python are usually delimited as
colon+space instead of space+colon+space.
* Meson: disable modules by default when building static libraries
Corresponds to autotools. See: #2323.
* Meson: make modules a feature option
Corresponds to autotools, where modules are built
automatically if enabled and supported.
* Meson: specify minimum required GLib version
* Meson: fix indentation
* Remove unused function checks
* Simplify GLib configure checks
* Meson: ensure modules doesn't include enumtypes sources
Since that would cause duplicate symbols.
(`soname_header` can also be safely removed here,
since that is already included in `libvips_headers_dep`)
* Ensure that double asterisk characters are only used for gtk-doc comments
This triggers warnings when parsing the files with the introspection scanner
and gtk-doc
* Enhance the introspection support by fixing annotations
Also refine the .metadata file
Co-authored-by: John Cupitt <jcupitt@gmail.com>
Instead of a simple fail/don't-fail boolean switch, add fail-on, an enum which sets the sensitivity of loaders to errors.
There's a new sensitivity level which tries to detect truncated images, but ignores other types of error.
tell buffer and target savers the file format
Currently, buffer and target savers are not told the format they should
write.
This is usually OK (the JPEG saver already knows it should write JPEG),
but some savers can write several formats, and these currently need an
extra parameter.
For example:
```ruby
buf = x.write_to_buffer ".bmp", format: "bmp"
```
The first ".bmp" gets libvips to pick magicksave, the second
`format:` param is necessary to tell magicksave to write BMP.
This patch adds stub subclasses so that the savers know the exact format. It also improves PPM save.
The filemode ifdefs had grown to 30 lines of code duplicated in four
source files. Move to a single copy in a private header (not part of the
public API).