blob: 35b950187fc8b3196f3aad33476c900f0d46d6d3 [file] [log] [blame]
// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CROS_DISKS_DEVICE_EVENT_QUEUE_H_
#define CROS_DISKS_DEVICE_EVENT_QUEUE_H_
#include <base/macros.h>
#include "cros-disks/device_event.h"
namespace cros_disks {
struct DeviceEvent;
// An event queue for keeping track of deferred device events.
class DeviceEventQueue {
public:
DeviceEventQueue() = default;
~DeviceEventQueue() = default;
// Removes a device event from the event queue in a FIFO manner.
// It is a no-op if the queue is empty.
void Remove();
// Adds a device event to the event queue in a FIFO manner.
//
// Due to its use for keeping track of deferred device events, the
// event queue does not simply accumulate events being passed to the
// Add method. Depending on the type of an event and its correlation
// with other events in the queue, the event may be discarded or cause
// other events in the queue to be discarded.
//
// The rules are:
// 1) Ignored and DeviceScanned events are always discarded as they
// do not carry any useful information to the prospective client.
// 2) If a DeviceRemoved event is seen after a DeviceAdded event with
// the same device path, both events are discarded as if the device
// has not been added.
// 3) If a DiskRemoved event is seen after a DiskAdded or DiskChanged
// event with the same device path, both events are discarded as if
// the device has not been added.
// 4) A DiskChanged event is discarded if a DiskAdded event is already
// in the queue. This is because both events are deferred and thus
// the DiskChanged event, which signals some property changes in the
// disk, can be absorbed into the DiskAdded event.
void Add(const DeviceEvent& event);
// Returns a pointer to the oldest device event at the head of event
// queue or NULL if the queue is empty. The pointer will become
// invalid upon the next Remove call.
const DeviceEvent* Head() const;
const DeviceEventList& events() const { return events_; }
private:
// A list of events in the event queue.
// The latest event is inserted at the beginning of the list.
DeviceEventList events_;
DISALLOW_COPY_AND_ASSIGN(DeviceEventQueue);
};
} // namespace cros_disks
#endif // CROS_DISKS_DEVICE_EVENT_QUEUE_H_