Am 11.06.2012 15:21, schrieb Anthony Liguori:
> On 06/11/2012 03:25 AM, Kevin Wolf wrote:
>> Am 10.06.2012 19:38, schrieb Andreas Färber:
>>> Am 10.06.2012 17:49, schrieb Paolo Bonzini:
>>>> Il 08/06/2012 03:19, Anthony Liguori ha scritto:
>>>>>>
>>>>>> +typedef enum ObjectState {
>>>>>> +    OBJECT_STATE_INITIALIZED = 1,
>>>>>> +    OBJECT_STATE_REALIZED,
>>>>>> +} ObjectState;
>>>>>
>>>>> I think using a bool would be better since it reduces the temptation to
>>>>> add additional states.
>>>>
>>>> In fact someone already discussed having a third state for block
>>>> devices... :)
>>>
>>> I would expect that file_opened state to remain internal to the block
>>> layer. Thought we discussed that on IRC?
>>
>> I think I still don't understand well enough what 'realized' is really
>> supposed to mean.
> 
> realized is essentially the Vcc pin for the device.

My BlockDriverState doesn't have a Vcc pin, and neither has my Error
object. I thought realize() did exist in Object and not only in Device?
If so, it must have a more generic meaning.

>> Does some magic happen when an object gets realised? From outside,
>> what's the difference between an INITIALIZED and a REALIZED object? Is
>> it more or less an implementation detail of the base class or is it
>> something that affects the object model itself?
> 
> On the rising edge of realized, you typically will validate any parameters 
> and 
> do any actions necessary based on the parameters.  As long as the guest isn't 
> running, we want the ability to make changes to the devices that we normally 
> couldn't change while the guest is running (like updating the CharDriverState 
> pointer).

Okay, that matches my understanding.

Are all of the checks and the status change of properties (modifiable ->
const) done by the specific subclass or is it done by QOM to some degree?

>> I think the file_opened state should have more or less the same status
>> as the realisation of an object. They are quite similar, so they should
>> both be an implementation detail of their respective class, or they
>> should both be baked into the object model.
> 
> I think we need to think about what realized means to a non-Device.  Does 
> file_opened have the same logical semantics as the above?

Yes, I think it's quite similar, just at an intermediate stage of the
object creation. As I imagine it, you would:

1. Create a BlockDriveState

2. Modify the filename property (you can really modify any property if
   you want for some reason)

3. Call file_open, which opens the image file and may derive some
   default property values from the image file (flags in the header or
   whatever). Typical example: The backing file path. I think this would
   roughly correspond to an extended .bdrv_probe.

4. Modify more properties, overriding any defaults of the image.
   file_open has made some properties read-only (like the filename),
   which cannot be modified any more.

5. Call realize. This is the actual .bdrv_open call that makes the
   BlockDriverState ready to be used. This makes some more properties
   read-only, like the backing file and format.

>> A comment in this patch says it means that an object is fully
>> constructed.
> 
> That's not really the best wording.  See above.

For non-Devices it's still the best explanation I have found.

Kevin

Reply via email to