Removed the old, nicely working, DiskDevice API support from the registrar. We're going to reimplement it in the kernel.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3430 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
32453e90e0
commit
0582df0213
@ -1,58 +0,0 @@
|
||||
//----------------------------------------------------------------------
|
||||
// This software is part of the OpenBeOS distribution and is covered
|
||||
// by the OpenBeOS license.
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
#ifndef DISK_DEVICE_MANAGER_H
|
||||
#define DISK_DEVICE_MANAGER_H
|
||||
|
||||
#include <Locker.h>
|
||||
#include <Looper.h>
|
||||
#include <OS.h>
|
||||
|
||||
#include "PriorityMessageQueue.h"
|
||||
#include "RDiskDeviceList.h"
|
||||
#include "RVolumeList.h"
|
||||
#include "WatchingService.h"
|
||||
|
||||
class EventQueue;
|
||||
class MessageEvent;
|
||||
|
||||
class DiskDeviceManager : public BLooper {
|
||||
public:
|
||||
DiskDeviceManager(EventQueue *eventQueue);
|
||||
virtual ~DiskDeviceManager();
|
||||
|
||||
virtual void MessageReceived(BMessage *message);
|
||||
|
||||
private:
|
||||
// requests
|
||||
void _NextDiskDeviceRequest(BMessage *request);
|
||||
void _GetDiskDeviceRequest(BMessage *request);
|
||||
void _UpdateDiskDeviceRequest(BMessage *request);
|
||||
void _StartWatchingRequest(BMessage *request);
|
||||
void _StopWatchingRequest(BMessage *request);
|
||||
|
||||
bool _PushMessage(BMessage *message, int32 priority);
|
||||
BMessage *_PopMessage();
|
||||
|
||||
static int32 _WorkerEntry(void *parameters);
|
||||
int32 _Worker();
|
||||
|
||||
private:
|
||||
class RescanEvent;
|
||||
|
||||
private:
|
||||
EventQueue *fEventQueue;
|
||||
MessageEvent *fRescanEvent;
|
||||
BLocker fDeviceListLock;
|
||||
WatchingService fWatchingService;
|
||||
RVolumeList fVolumeList;
|
||||
RDiskDeviceList fDeviceList;
|
||||
PriorityMessageQueue fMessageQueue;
|
||||
thread_id fWorker;
|
||||
sem_id fMessageCounter;
|
||||
bool fTerminating;
|
||||
};
|
||||
|
||||
#endif // DISK_DEVICE_MANAGER_H
|
@ -1,43 +0,0 @@
|
||||
//----------------------------------------------------------------------
|
||||
// This software is part of the OpenBeOS distribution and is covered
|
||||
// by the OpenBeOS license.
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
#ifndef CHANGE_COUNTER_H
|
||||
#define CHANGE_COUNTER_H
|
||||
|
||||
#include <ObjectLocker.h>
|
||||
|
||||
class RChangeCounter {
|
||||
public:
|
||||
RChangeCounter() : fCount(0), fLocked(0), fChanged(false) {}
|
||||
~RChangeCounter() {}
|
||||
|
||||
int32 Count() const { return fCount; }
|
||||
|
||||
bool Lock() { fLocked++; return true; }
|
||||
void Unlock() { if (fLocked > 0 && --fLocked == 0) fChanged = false; }
|
||||
bool IsLocked() const { return (fLocked > 0); }
|
||||
|
||||
bool Increment()
|
||||
{
|
||||
bool changed = false;
|
||||
if (IsLocked() && !fChanged) {
|
||||
fCount++;
|
||||
changed = fChanged = true;
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
void Reset() { fCount = 0; fLocked = 0; fChanged = false; }
|
||||
|
||||
public:
|
||||
typedef BPrivate::BObjectLocker<RChangeCounter> Locker;
|
||||
|
||||
private:
|
||||
int32 fCount;
|
||||
int32 fLocked;
|
||||
bool fChanged;
|
||||
};
|
||||
|
||||
#endif // CHANGE_COUNTER_H
|
@ -1,90 +0,0 @@
|
||||
//----------------------------------------------------------------------
|
||||
// This software is part of the OpenBeOS distribution and is covered
|
||||
// by the OpenBeOS license.
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
#ifndef DISK_DEVICE_H
|
||||
#define DISK_DEVICE_H
|
||||
|
||||
#include <Drivers.h>
|
||||
#include <ObjectList.h>
|
||||
#include <String.h>
|
||||
|
||||
#include "RChangeCounter.h"
|
||||
|
||||
struct session_info;
|
||||
|
||||
class RDiskDeviceList;
|
||||
class RPartition;
|
||||
class RSession;
|
||||
|
||||
#include "Debug.h"
|
||||
class RDiskDevice {
|
||||
public:
|
||||
RDiskDevice();
|
||||
~RDiskDevice();
|
||||
|
||||
status_t SetTo(const char *path, int fd, const device_geometry *geometry,
|
||||
status_t mediaStatus);
|
||||
void Unset();
|
||||
|
||||
void SetDeviceList(RDiskDeviceList *deviceList)
|
||||
{ fDeviceList = deviceList ;}
|
||||
RDiskDeviceList *DeviceList() const { return fDeviceList; }
|
||||
|
||||
status_t MediaChanged();
|
||||
status_t SessionLayoutChanged();
|
||||
|
||||
int32 ID() const { return fID; }
|
||||
int32 ChangeCounter() const { return fChangeCounter.Count(); }
|
||||
void Changed() { fChangeCounter.Increment(); }
|
||||
|
||||
void SetTouched(bool touched) { fTouched = touched; }
|
||||
bool Touched() const { return fTouched; }
|
||||
|
||||
int FD() const { return fFD; }
|
||||
off_t Size() const;
|
||||
int32 BlockSize() const { return fGeometry.bytes_per_sector; }
|
||||
bool IsReadOnly() { return fGeometry.read_only; }
|
||||
|
||||
const char *Path() const { return fPath.String(); }
|
||||
|
||||
status_t AddSession(const session_info *sessionInfo,
|
||||
uint32 cause/* = B_DEVICE_CAUSE_UNKNOWN*/);
|
||||
bool AddSession(RSession *session,
|
||||
uint32 cause/* = B_DEVICE_CAUSE_UNKNOWN*/);
|
||||
bool RemoveSession(int32 index,
|
||||
uint32 cause/* = B_DEVICE_CAUSE_UNKNOWN*/);
|
||||
bool RemoveSession(RSession *session,
|
||||
uint32 cause/* = B_DEVICE_CAUSE_UNKNOWN*/);
|
||||
int32 CountSessions() const { return fSessions.CountItems(); }
|
||||
RSession *SessionAt(int32 index) const { return fSessions.ItemAt(index); }
|
||||
int32 IndexOfSession(const RSession *session) const
|
||||
{ return fSessions.IndexOf(session); }
|
||||
|
||||
status_t Update();
|
||||
|
||||
status_t Archive(BMessage *archive) const;
|
||||
|
||||
void Dump() const;
|
||||
|
||||
private:
|
||||
status_t _RescanSessions(uint32 cause);
|
||||
|
||||
static int32 _NextID();
|
||||
|
||||
private:
|
||||
BObjectList<RSession> fSessions;
|
||||
RDiskDeviceList *fDeviceList;
|
||||
int32 fID;
|
||||
RChangeCounter fChangeCounter;
|
||||
bool fTouched;
|
||||
BString fPath;
|
||||
int fFD;
|
||||
device_geometry fGeometry;
|
||||
status_t fMediaStatus;
|
||||
|
||||
static vint32 fNextID;
|
||||
};
|
||||
|
||||
#endif // DISK_DEVICE_H
|
@ -1,112 +0,0 @@
|
||||
//----------------------------------------------------------------------
|
||||
// This software is part of the OpenBeOS distribution and is covered
|
||||
// by the OpenBeOS license.
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
#ifndef DISK_DEVICE_LIST_H
|
||||
#define DISK_DEVICE_LIST_H
|
||||
|
||||
#include <DiskDeviceRoster.h>
|
||||
#include <Messenger.h>
|
||||
#include <ObjectList.h>
|
||||
|
||||
#include "MessageHandler.h"
|
||||
#include "RVolumeList.h"
|
||||
|
||||
class BDirectory;
|
||||
class BEntry;
|
||||
class BLocker;
|
||||
|
||||
class RDiskDevice;
|
||||
class RPartition;
|
||||
class RSession;
|
||||
class WatchingService;
|
||||
|
||||
class RDiskDeviceList : public MessageHandler, public RVolumeListListener {
|
||||
public:
|
||||
RDiskDeviceList(BMessenger target, BLocker &lock, RVolumeList &volumeList,
|
||||
WatchingService *watchingService);
|
||||
~RDiskDeviceList();
|
||||
|
||||
virtual void HandleMessage(BMessage *message);
|
||||
|
||||
// external event hooks
|
||||
virtual void VolumeMounted(const RVolume *volume);
|
||||
virtual void VolumeUnmounted(const RVolume *volume);
|
||||
virtual void MountPointMoved(const RVolume *volume,
|
||||
const entry_ref *oldRoot,
|
||||
const entry_ref *newRoot);
|
||||
virtual void DeviceAppeared(const char *devicePath);
|
||||
virtual void DeviceDisappeared(const char *devicePath);
|
||||
|
||||
bool AddDevice(RDiskDevice *device);
|
||||
bool RemoveDevice(int32 index);
|
||||
bool RemoveDevice(RDiskDevice *device);
|
||||
int32 CountDevices() const { return fDevices.CountItems(); }
|
||||
RDiskDevice *DeviceAt(int32 index) const { return fDevices.ItemAt(index); }
|
||||
|
||||
int32 CountSessions() const { return fSessions.CountItems(); }
|
||||
RSession *SessionAt(int32 index) const { return fSessions.ItemAt(index); }
|
||||
|
||||
int32 CountPartitions() const { return fPartitions.CountItems(); }
|
||||
RPartition *PartitionAt(int32 index) const
|
||||
{ return fPartitions.ItemAt(index); }
|
||||
|
||||
RDiskDevice *DeviceWithID(int32 id, bool exact = true) const;
|
||||
RSession *SessionWithID(int32 id) const;
|
||||
RPartition *PartitionWithID(int32 id) const;
|
||||
|
||||
RDiskDevice *DeviceWithPath(const char *path) const;
|
||||
RPartition *PartitionWithPath(const char *path) const;
|
||||
|
||||
status_t Rescan();
|
||||
|
||||
bool Lock();
|
||||
void Unlock();
|
||||
|
||||
// internal event hooks
|
||||
void DeviceAdded(RDiskDevice *device,
|
||||
uint32 cause = B_DEVICE_CAUSE_UNKNOWN);
|
||||
void DeviceRemoved(RDiskDevice *device,
|
||||
uint32 cause = B_DEVICE_CAUSE_UNKNOWN);
|
||||
void MediaChanged(RDiskDevice *device,
|
||||
uint32 cause = B_DEVICE_CAUSE_UNKNOWN);
|
||||
void SessionAdded(RSession *session,
|
||||
uint32 cause = B_DEVICE_CAUSE_UNKNOWN);
|
||||
void SessionRemoved(RSession *session,
|
||||
uint32 cause = B_DEVICE_CAUSE_UNKNOWN);
|
||||
void PartitionAdded(RPartition *partition,
|
||||
uint32 cause = B_DEVICE_CAUSE_UNKNOWN);
|
||||
void PartitionRemoved(RPartition *partition,
|
||||
uint32 cause = B_DEVICE_CAUSE_UNKNOWN);
|
||||
void PartitionChanged(RPartition *partition,
|
||||
uint32 cause = B_DEVICE_CAUSE_UNKNOWN);
|
||||
|
||||
|
||||
void Dump() const;
|
||||
|
||||
private:
|
||||
status_t _Scan(BDirectory &dir);
|
||||
status_t _ScanDevice(const char *path);
|
||||
|
||||
status_t _InitNotificationMessage(BMessage *message, uint32 event,
|
||||
uint32 cause);
|
||||
status_t _InitNotificationMessage(BMessage *message, uint32 event,
|
||||
uint32 cause, const RDiskDevice *device);
|
||||
status_t _InitNotificationMessage(BMessage *message, uint32 event,
|
||||
uint32 cause, const RSession *session);
|
||||
status_t _InitNotificationMessage(BMessage *message, uint32 event,
|
||||
uint32 cause,
|
||||
const RPartition *partition);
|
||||
|
||||
private:
|
||||
mutable BLocker &fLock;
|
||||
BMessenger fTarget;
|
||||
RVolumeList &fVolumeList;
|
||||
WatchingService *fWatchingService;
|
||||
BObjectList<RDiskDevice> fDevices; // sorted by ID
|
||||
BObjectList<RSession> fSessions; //
|
||||
BObjectList<RPartition> fPartitions; //
|
||||
};
|
||||
|
||||
#endif // DISK_DEVICE_LIST_H
|
@ -1,69 +0,0 @@
|
||||
//----------------------------------------------------------------------
|
||||
// This software is part of the OpenBeOS distribution and is covered
|
||||
// by the OpenBeOS license.
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
#ifndef PARTITION_H
|
||||
#define PARTITION_H
|
||||
|
||||
#include <disk_scanner.h>
|
||||
#include <SupportDefs.h>
|
||||
|
||||
#include "RChangeCounter.h"
|
||||
|
||||
class BMessage;
|
||||
|
||||
class RDiskDevice;
|
||||
class RDiskDeviceList;
|
||||
class RSession;
|
||||
class RVolume;
|
||||
|
||||
class RPartition {
|
||||
public:
|
||||
RPartition();
|
||||
~RPartition();
|
||||
|
||||
status_t SetTo(int fd, const extended_partition_info *partitionInfo);
|
||||
void Unset();
|
||||
|
||||
void SetSession(RSession *session) { fSession = session; }
|
||||
RDiskDeviceList *DeviceList() const;
|
||||
RDiskDevice *Device() const;
|
||||
RSession *Session() const { return fSession; }
|
||||
|
||||
status_t PartitionChanged();
|
||||
|
||||
int32 ID() const { return fID; }
|
||||
int32 ChangeCounter() const { return fChangeCounter.Count(); }
|
||||
void Changed();
|
||||
|
||||
int32 Index() const;
|
||||
|
||||
const extended_partition_info *Info() const { return &fInfo; }
|
||||
void GetPath(char *path) const;
|
||||
off_t Offset() const { return fInfo.info.offset; }
|
||||
off_t Size() const { return fInfo.info.size; }
|
||||
|
||||
void SetVolume(const RVolume *volume) { fVolume = volume; }
|
||||
const RVolume *Volume() const { return fVolume; }
|
||||
|
||||
status_t Archive(BMessage *archive) const;
|
||||
|
||||
status_t Update(const extended_partition_info *partitionInfo);
|
||||
|
||||
void Dump() const;
|
||||
|
||||
private:
|
||||
static int32 _NextID();
|
||||
|
||||
private:
|
||||
RSession *fSession;
|
||||
int32 fID;
|
||||
RChangeCounter fChangeCounter;
|
||||
extended_partition_info fInfo;
|
||||
const RVolume *fVolume;
|
||||
|
||||
static vint32 fNextID;
|
||||
};
|
||||
|
||||
#endif // PARTITION_H
|
@ -1,75 +0,0 @@
|
||||
//----------------------------------------------------------------------
|
||||
// This software is part of the OpenBeOS distribution and is covered
|
||||
// by the OpenBeOS license.
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
#ifndef SESSION_H
|
||||
#define SESSION_H
|
||||
|
||||
#include <disk_scanner.h>
|
||||
#include <ObjectList.h>
|
||||
|
||||
#include "RChangeCounter.h"
|
||||
|
||||
class RDiskDevice;
|
||||
class RDiskDeviceList;
|
||||
class RPartition;
|
||||
|
||||
class RSession {
|
||||
public:
|
||||
RSession();
|
||||
~RSession();
|
||||
|
||||
status_t SetTo(int fd, const session_info *sessionInfo);
|
||||
void Unset();
|
||||
|
||||
void SetDevice(RDiskDevice *device) { fDevice = device; }
|
||||
RDiskDeviceList *DeviceList() const;
|
||||
RDiskDevice *Device() const { return fDevice; }
|
||||
|
||||
status_t PartitionLayoutChanged();
|
||||
|
||||
int32 ID() const { return fID; }
|
||||
int32 ChangeCounter() const { return fChangeCounter.Count(); }
|
||||
void Changed();
|
||||
|
||||
int32 Index() const;
|
||||
|
||||
status_t AddPartition(int fd, const extended_partition_info *partitionInfo,
|
||||
uint32 cause);
|
||||
bool AddPartition(RPartition *partition, uint32 cause);
|
||||
bool RemovePartition(int32 index, uint32 cause);
|
||||
bool RemovePartition(RPartition *partition, uint32 cause);
|
||||
int32 CountPartitions() const { return fPartitions.CountItems(); }
|
||||
RPartition *PartitionAt(int32 index) const
|
||||
{ return fPartitions.ItemAt(index); }
|
||||
int32 IndexOfPartition(const RPartition *partition) const
|
||||
{ return fPartitions.IndexOf(partition); }
|
||||
|
||||
const session_info *Info() const { return &fInfo; }
|
||||
off_t Offset() const { return fInfo.offset; }
|
||||
off_t Size() const { return fInfo.size; }
|
||||
|
||||
status_t Update(const session_info *sessionInfo);
|
||||
|
||||
status_t Archive(BMessage *archive) const;
|
||||
|
||||
void Dump() const;
|
||||
|
||||
private:
|
||||
|
||||
status_t _RescanPartitions(int fd, uint32 cause);
|
||||
static int32 _NextID();
|
||||
|
||||
private:
|
||||
BObjectList<RPartition> fPartitions;
|
||||
RDiskDevice *fDevice;
|
||||
int32 fID;
|
||||
RChangeCounter fChangeCounter;
|
||||
session_info fInfo;
|
||||
char fPartitioningSystem[B_FILE_NAME_LENGTH];
|
||||
|
||||
static vint32 fNextID;
|
||||
};
|
||||
|
||||
#endif // SESSION_H
|
@ -1,94 +0,0 @@
|
||||
//----------------------------------------------------------------------
|
||||
// This software is part of the OpenBeOS distribution and is covered
|
||||
// by the OpenBeOS license.
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
#ifndef VOLUME_LIST_H
|
||||
#define VOLUME_LIST_H
|
||||
|
||||
#include <Entry.h>
|
||||
#include <Messenger.h>
|
||||
#include <Node.h>
|
||||
#include <ObjectList.h>
|
||||
#include <VolumeRoster.h>
|
||||
|
||||
#include "MessageHandler.h"
|
||||
|
||||
class BLocker;
|
||||
|
||||
// RVolume
|
||||
class RVolume {
|
||||
public:
|
||||
RVolume();
|
||||
~RVolume() {}
|
||||
|
||||
status_t SetTo(dev_t id);
|
||||
void Unset();
|
||||
|
||||
dev_t ID() const { return fID; }
|
||||
ino_t RootNode() const { return fRootNode; }
|
||||
void GetRootDirNode(node_ref *ref) const
|
||||
{ ref->device = fID; ref->node = fRootNode; }
|
||||
void GetRootDirEntry(entry_ref *ref) const { *ref = fRootEntry; }
|
||||
const char *DevicePath() const { return fDevicePath; }
|
||||
|
||||
void SetRootDirEntry(const entry_ref *ref) { fRootEntry = *ref; }
|
||||
|
||||
status_t StartWatching(BMessenger target) const;
|
||||
status_t StopWatching(BMessenger target) const;
|
||||
|
||||
private:
|
||||
dev_t fID;
|
||||
ino_t fRootNode;
|
||||
entry_ref fRootEntry;
|
||||
char fDevicePath[B_FILE_NAME_LENGTH];
|
||||
};
|
||||
|
||||
// RVolumeListListener
|
||||
class RVolumeListListener {
|
||||
public:
|
||||
RVolumeListListener();
|
||||
virtual ~RVolumeListListener();
|
||||
|
||||
virtual void VolumeMounted(const RVolume *volume);
|
||||
virtual void VolumeUnmounted(const RVolume *volume);
|
||||
virtual void MountPointMoved(const RVolume *volume,
|
||||
const entry_ref *oldRoot,
|
||||
const entry_ref *newRoot);
|
||||
};
|
||||
|
||||
// RVolumeList
|
||||
class RVolumeList : public MessageHandler {
|
||||
public:
|
||||
RVolumeList(BMessenger target, BLocker &lock);
|
||||
virtual ~RVolumeList();
|
||||
|
||||
virtual void HandleMessage(BMessage *message);
|
||||
|
||||
status_t Rescan();
|
||||
|
||||
const RVolume *VolumeForDevicePath(const char *devicePath) const;
|
||||
|
||||
bool Lock();
|
||||
void Unlock();
|
||||
|
||||
void SetListener(RVolumeListListener *listener);
|
||||
|
||||
void Dump() const;
|
||||
|
||||
private:
|
||||
RVolume *_AddVolume(dev_t id);
|
||||
bool _RemoveVolumeAt(int32 index);
|
||||
void _DeviceMounted(BMessage *message);
|
||||
void _DeviceUnmounted(BMessage *message);
|
||||
void _MountPointMoved(BMessage *message);
|
||||
|
||||
private:
|
||||
mutable BLocker &fLock;
|
||||
BMessenger fTarget;
|
||||
BObjectList<RVolume> fVolumes;
|
||||
BVolumeRoster fRoster;
|
||||
RVolumeListListener *fListener;
|
||||
};
|
||||
|
||||
#endif // VOLUME_LIST_H
|
Loading…
Reference in New Issue
Block a user