evdev+hal => Too many input devices.
Brian Rogers
brian at xyzw.org
Thu Jul 23 06:05:24 PDT 2009
Brian Rogers wrote:
> Gabor Gombas wrote:
>
>> Hi,
>>
>> On Wed, Jul 22, 2009 at 02:45:32PM -0700, Brian Rogers wrote:
>>
>>
>>
>>> @@ -118,14 +113,16 @@ static void del_conn(struct work_struct *work)
>>> if (!device_is_registered(&conn->dev))
>>> return;
>>>
>>> + /* wait for child devices to go away first */
>>> while (1) {
>>> struct device *dev;
>>>
>>> - dev = device_find_child(&conn->dev, NULL, __match_tty);
>>> + dev = device_find_child(&conn->dev, NULL, __match_any);
>>> if (!dev)
>>> break;
>>> - device_move(dev, NULL, DPM_ORDER_DEV_LAST);
>>> put_device(dev);
>>> +
>>> + msleep(100);
>>> }
>>>
>>> device_del(&conn->dev);
>>>
>>>
>> Won't this cause problems for rfcomm devices (again)? This code was added
>> for the reason in the comment you've deleted: the rfcomm device can
>> remain alive long after the connection is done, and it won't go away
>> until you find & manually kill the process that holds the device open.
>>
>
> The device_move action looked obsolete to me since the comment lead me
> to believe that device_move was moving the device to the root of /sys. I
> saw the input devices, which weren't being touched there, wind up in the
> root on their own when the connection was deleted so I assumed that had
> since become automatic. But now that I look at the device_move function,
> it looks like moving to null actually deletes the device.
>
> In that case, it's probably best to just delete everything right there
> and not wait for anything to close on its own. If that doesn't create
> any problems, that's what I'll do. Thanks for bringing this up.
>
OK, that didn't work. Calling device_move with a null new_parent works
the way I initially thought it did. I don't like the idea of these
things moving right before they are deleted, and neither does HAL since
it still doesn't remove the input devices properly in this case. I think
I'll go with the original strategy to ensure everything gets removed
from the same place it was first added. And I might make it work without
polling.
The rfcomm and connection objects sticking around until some process
exits shouldn't harm anything since I believe a new connection will be
given a unique name to avoid a conflict. I'll be sure to check this.
What went wrong if the rfcomm was still inside the connection when the
connection was deleted?
Brian
More information about the xorg
mailing list