fix up operation invalidate
cache drop next
This commit is contained in:
parent
a8d04a7dd1
commit
66425bec8e
@ -396,19 +396,22 @@ static void
|
|||||||
vips_argument_instance_detach( VipsArgumentInstance *argument_instance )
|
vips_argument_instance_detach( VipsArgumentInstance *argument_instance )
|
||||||
{
|
{
|
||||||
VipsObject *object = argument_instance->object;
|
VipsObject *object = argument_instance->object;
|
||||||
|
VipsArgumentClass *argument_class = argument_instance->argument_class;
|
||||||
|
GObject *member = G_STRUCT_MEMBER( GObject *, object,
|
||||||
|
argument_class->offset );
|
||||||
|
|
||||||
if( argument_instance->close_id ) {
|
if( argument_instance->close_id ) {
|
||||||
if( g_signal_handler_is_connected( object,
|
if( g_signal_handler_is_connected( member,
|
||||||
argument_instance->close_id ) )
|
argument_instance->close_id ) )
|
||||||
g_signal_handler_disconnect( object,
|
g_signal_handler_disconnect( member,
|
||||||
argument_instance->close_id );
|
argument_instance->close_id );
|
||||||
argument_instance->close_id = 0;
|
argument_instance->close_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( argument_instance->invalidate_id ) {
|
if( argument_instance->invalidate_id ) {
|
||||||
if( g_signal_handler_is_connected( object,
|
if( g_signal_handler_is_connected( member,
|
||||||
argument_instance->invalidate_id ) )
|
argument_instance->invalidate_id ) )
|
||||||
g_signal_handler_disconnect( object,
|
g_signal_handler_disconnect( member,
|
||||||
argument_instance->invalidate_id );
|
argument_instance->invalidate_id );
|
||||||
argument_instance->invalidate_id = 0;
|
argument_instance->invalidate_id = 0;
|
||||||
}
|
}
|
||||||
@ -739,14 +742,12 @@ vips_object_get_argument_priority( VipsObject *object, const char *name )
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
vips_object_clear_member( VipsObject *object, GParamSpec *pspec,
|
vips_object_clear_member( VipsArgumentInstance *argument_instance )
|
||||||
GObject **member )
|
|
||||||
{
|
{
|
||||||
VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( object );
|
VipsObject *object = argument_instance->object;
|
||||||
VipsArgumentClass *argument_class = (VipsArgumentClass *)
|
VipsArgumentClass *argument_class = argument_instance->argument_class;
|
||||||
vips__argument_table_lookup( class->argument_table, pspec );
|
GObject **member = &G_STRUCT_MEMBER( GObject *, object,
|
||||||
VipsArgumentInstance *argument_instance =
|
argument_class->offset );
|
||||||
vips__argument_get_instance( argument_class, object );
|
|
||||||
|
|
||||||
vips_argument_instance_detach( argument_instance );
|
vips_argument_instance_detach( argument_instance );
|
||||||
|
|
||||||
@ -933,7 +934,12 @@ static void
|
|||||||
vips_object_arg_invalidate( GObject *argument,
|
vips_object_arg_invalidate( GObject *argument,
|
||||||
VipsArgumentInstance *argument_instance )
|
VipsArgumentInstance *argument_instance )
|
||||||
{
|
{
|
||||||
vips_operation_invalidate( VIPS_OPERATION( argument ) );
|
/* Image @argument has signalled "invalidate" ... resignal on our
|
||||||
|
* operation.
|
||||||
|
*/
|
||||||
|
if( VIPS_IS_OPERATION( argument_instance->object ) )
|
||||||
|
vips_operation_invalidate(
|
||||||
|
VIPS_OPERATION( argument_instance->object ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -963,10 +969,11 @@ vips__object_set_member( VipsObject *object, GParamSpec *pspec,
|
|||||||
vips__argument_table_lookup( class->argument_table, pspec );
|
vips__argument_table_lookup( class->argument_table, pspec );
|
||||||
VipsArgumentInstance *argument_instance =
|
VipsArgumentInstance *argument_instance =
|
||||||
vips__argument_get_instance( argument_class, object );
|
vips__argument_get_instance( argument_class, object );
|
||||||
|
GType otype = G_PARAM_SPEC_VALUE_TYPE( pspec );
|
||||||
|
|
||||||
g_assert( argument_instance );
|
g_assert( argument_instance );
|
||||||
|
|
||||||
vips_object_clear_member( object, pspec, member );
|
vips_object_clear_member( argument_instance );
|
||||||
|
|
||||||
g_assert( !*member );
|
g_assert( !*member );
|
||||||
*member = argument;
|
*member = argument;
|
||||||
@ -974,7 +981,7 @@ vips__object_set_member( VipsObject *object, GParamSpec *pspec,
|
|||||||
if( *member ) {
|
if( *member ) {
|
||||||
if( argument_class->flags & VIPS_ARGUMENT_INPUT ) {
|
if( argument_class->flags & VIPS_ARGUMENT_INPUT ) {
|
||||||
#ifdef DEBUG_REF
|
#ifdef DEBUG_REF
|
||||||
printf( "vips_object_set_member: vips object: " );
|
printf( "vips__object_set_member: vips object: " );
|
||||||
vips_object_print_name( object );
|
vips_object_print_name( object );
|
||||||
printf( " refers to gobject %s (%p)\n",
|
printf( " refers to gobject %s (%p)\n",
|
||||||
G_OBJECT_TYPE_NAME( *member ), *member );
|
G_OBJECT_TYPE_NAME( *member ), *member );
|
||||||
@ -985,17 +992,10 @@ vips__object_set_member( VipsObject *object, GParamSpec *pspec,
|
|||||||
/* Ref the argument.
|
/* Ref the argument.
|
||||||
*/
|
*/
|
||||||
g_object_ref( *member );
|
g_object_ref( *member );
|
||||||
|
|
||||||
g_assert( !argument_instance->invalidate_id );
|
|
||||||
argument_instance->invalidate_id =
|
|
||||||
g_signal_connect( *member, "invalidate",
|
|
||||||
G_CALLBACK(
|
|
||||||
vips_object_arg_invalidate ),
|
|
||||||
argument_instance );
|
|
||||||
}
|
}
|
||||||
else if( argument_class->flags & VIPS_ARGUMENT_OUTPUT ) {
|
else if( argument_class->flags & VIPS_ARGUMENT_OUTPUT ) {
|
||||||
#ifdef DEBUG_REF
|
#ifdef DEBUG_REF
|
||||||
printf( "vips_object_set_member: gobject %s (%p)\n",
|
printf( "vips__object_set_member: gobject %s (%p)\n",
|
||||||
G_OBJECT_TYPE_NAME( *member ), *member );
|
G_OBJECT_TYPE_NAME( *member ), *member );
|
||||||
printf( " refers to vips object: " );
|
printf( " refers to vips object: " );
|
||||||
vips_object_print_name( object );
|
vips_object_print_name( object );
|
||||||
@ -1006,10 +1006,23 @@ vips__object_set_member( VipsObject *object, GParamSpec *pspec,
|
|||||||
/* The argument reffs us.
|
/* The argument reffs us.
|
||||||
*/
|
*/
|
||||||
g_object_ref( object );
|
g_object_ref( object );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME ... could use a NULLing weakref
|
if( *member &&
|
||||||
*/
|
g_type_is_a( otype, VIPS_TYPE_IMAGE ) ) {
|
||||||
|
if( argument_class->flags & VIPS_ARGUMENT_INPUT ) {
|
||||||
|
g_assert( !argument_instance->invalidate_id );
|
||||||
|
|
||||||
|
argument_instance->invalidate_id =
|
||||||
|
g_signal_connect( *member, "invalidate",
|
||||||
|
G_CALLBACK(
|
||||||
|
vips_object_arg_invalidate ),
|
||||||
|
argument_instance );
|
||||||
|
}
|
||||||
|
else if( argument_class->flags & VIPS_ARGUMENT_OUTPUT ) {
|
||||||
g_assert( !argument_instance->close_id );
|
g_assert( !argument_instance->close_id );
|
||||||
|
|
||||||
argument_instance->close_id =
|
argument_instance->close_id =
|
||||||
g_signal_connect( *member, "close",
|
g_signal_connect( *member, "close",
|
||||||
G_CALLBACK( vips_object_arg_close ),
|
G_CALLBACK( vips_object_arg_close ),
|
||||||
@ -1122,7 +1135,7 @@ vips_object_set_property( GObject *gobject,
|
|||||||
GObject **member = &G_STRUCT_MEMBER( GObject *, object,
|
GObject **member = &G_STRUCT_MEMBER( GObject *, object,
|
||||||
argument_class->offset );
|
argument_class->offset );
|
||||||
|
|
||||||
vips__object_set_member( object, pspec, member,
|
vips__object_set_member( object, pspec, member,
|
||||||
g_value_get_object( value ) );
|
g_value_get_object( value ) );
|
||||||
}
|
}
|
||||||
else if( G_IS_PARAM_SPEC_INT( pspec ) ) {
|
else if( G_IS_PARAM_SPEC_INT( pspec ) ) {
|
||||||
|
Loading…
Reference in New Issue
Block a user