support resource limits

This commit is contained in:
Gleb Pomykalov 2021-04-10 12:36:40 +03:00
parent 9422825322
commit a14b44974d
3 changed files with 42 additions and 2 deletions

View file

@ -37,6 +37,23 @@ wand_common!(
MagickGetException
);
/// Resource type to use with [set_resource_limit](MagickWand::set_resource_limit)
#[derive(Debug, Clone, Copy)]
pub enum ResourceType {
Undefined = bindings::ResourceType_UndefinedResource as isize,
Area = bindings::ResourceType_AreaResource as isize,
Disk = bindings::ResourceType_DiskResource as isize,
File = bindings::ResourceType_FileResource as isize,
Height = bindings::ResourceType_HeightResource as isize,
Map = bindings::ResourceType_MapResource as isize,
Memory = bindings::ResourceType_MemoryResource as isize,
Thread = bindings::ResourceType_ThreadResource as isize,
Throttle = bindings::ResourceType_ThrottleResource as isize,
Time = bindings::ResourceType_TimeResource as isize,
Width = bindings::ResourceType_WidthResource as isize,
ListLength = bindings::ResourceType_ListLengthResource as isize,
}
/// MagickWand is a Rustic wrapper to the Rust bindings to ImageMagick.
///
/// Instantiating a `MagickWand` will construct an ImageMagick "wand"
@ -56,6 +73,19 @@ impl MagickWand {
}
}
pub fn set_resource_limit(resource: ResourceType, limit: u64) -> Result<(), &'static str> {
let result = unsafe {
bindings::SetMagickResourceLimit(
resource as bindings::ResourceType,
limit as bindings::MagickSizeType,
)
};
match result {
bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to set resource limit"),
}
}
pub fn set_option(&mut self, key: &str, value: &str) -> Result<(), &'static str> {
let c_key = CString::new(key).unwrap();
let c_value = CString::new(value).unwrap();

View file

@ -20,5 +20,5 @@ mod magick;
mod pixel;
pub use self::drawing::DrawingWand;
pub use self::magick::MagickWand;
pub use self::magick::{MagickWand, ResourceType};
pub use self::pixel::{PixelWand, HSL};

View file

@ -16,7 +16,7 @@
extern crate magick_rust;
use magick_rust::{bindings, magick_wand_genesis, MagickWand, PixelWand};
use magick_rust::{bindings, magick_wand_genesis, MagickWand, PixelWand, ResourceType};
use magick_rust::ToMagick;
use std::error::Error;
@ -361,3 +361,13 @@ fn test_negate_image() {
pixel_color.get_color_as_string().unwrap()
);
}
#[test]
fn test_resource_limits() {
START.call_once(|| {
magick_wand_genesis();
});
MagickWand::set_resource_limit(ResourceType::Thread, 1).unwrap();
let wand = MagickWand::new();
assert!(wand.read_image("tests/data/rust.png").is_ok());
}