Added and implemented job related syscalls.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4137 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2003-07-30 17:48:08 +00:00
parent c34b4f49f4
commit fe05b0ac95
2 changed files with 109 additions and 9 deletions

View File

@ -199,15 +199,17 @@ status_t _kern_create_child_partition(partition_id partitionID,
partition_id *childID);
status_t _kern_delete_partition(partition_id partitionID, int32 changeCounter);
#if 0
// jobs
status_t get_next_disk_device_job_info(user_disk_device_job_info *info,
int32 *cookie);
status_t get_disk_device_job_info(disk_job_id id,
user_disk_device_job_info *info);
status_t get_disk_device_job_status(disk_job_id id, uint32 *status,
float *progress);
status_t _kern_get_next_disk_device_job_info(int32 *cookie,
user_disk_device_job_info *info);
status_t _kern_get_disk_device_job_info(disk_job_id id,
user_disk_device_job_info *info);
status_t _kern_get_disk_device_job_progress_info(disk_job_id id,
disk_device_job_progress_info *info);
status_t _kern_pause_disk_device_job(disk_job_id id);
status_t _kern_cancel_disk_device_job(disk_job_id id, bool reverse);
#if 0
// watching
status_t start_disk_device_watching(port_id, int32 token, uint32 flags);

View File

@ -1,13 +1,15 @@
// ddm_userland_interface.cpp
#include <ddm_userland_interface.h>
#include <KDiskDevice.h>
#include <KDiskDeviceJob.h>
#include <KDiskDeviceJobQueue.h>
#include <KDiskDeviceManager.h>
#include <KDiskDeviceUtils.h>
#include <KDiskSystem.h>
#include <KFileDiskDevice.h>
#include <KShadowPartition.h>
#include "ddm_userland_interface.h"
#include "UserDataWriter.h"
// get_current_team
@ -1659,3 +1661,99 @@ _kern_delete_partition(partition_id partitionID, int32 changeCounter)
return B_OK;
}
// _kern_get_next_disk_device_job_info
status_t
_kern_get_next_disk_device_job_info(int32 *cookie,
user_disk_device_job_info *info)
{
if (!cookie || !info)
return B_BAD_VALUE;
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
if (ManagerLocker locker = manager) {
// get the next job and an info
while (KDiskDeviceJob *job = manager->NextJob(cookie)) {
// return info only on job scheduled or in progress
switch (job->Status()) {
case B_DISK_DEVICE_JOB_SCHEDULED:
case B_DISK_DEVICE_JOB_IN_PROGRESS:
return job->GetInfo(info);
case B_DISK_DEVICE_JOB_UNINITIALIZED:
case B_DISK_DEVICE_JOB_SUCCEEDED:
case B_DISK_DEVICE_JOB_FAILED:
case B_DISK_DEVICE_JOB_CANCELED:
break;
}
}
}
return B_ENTRY_NOT_FOUND;
}
// _kern_get_disk_device_job_info
status_t
_kern_get_disk_device_job_info(disk_job_id id, user_disk_device_job_info *info)
{
if (!info)
return B_BAD_VALUE;
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
if (ManagerLocker locker = manager) {
// find the job and get the info
if (KDiskDeviceJob *job = manager->FindJob(id))
return job->GetInfo(info);
}
return B_ENTRY_NOT_FOUND;
}
// _kern_get_disk_device_job_status
status_t
_kern_get_disk_device_job_progress_info(disk_job_id id,
disk_device_job_progress_info *info)
{
if (!info)
return B_BAD_VALUE;
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
if (ManagerLocker locker = manager) {
// find the job and get the info
if (KDiskDeviceJob *job = manager->FindJob(id))
return job->GetProgressInfo(info);
}
return B_ENTRY_NOT_FOUND;
}
// _kern_pause_disk_device_job
status_t
_kern_pause_disk_device_job(disk_job_id id)
{
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
if (ManagerLocker locker = manager) {
// get the job and the respective job queue
if (KDiskDeviceJob *job = manager->FindJob(id)) {
if (KDiskDeviceJobQueue *jobQueue = job->JobQueue()) {
// only the active job in progress can be paused
if (jobQueue->ActiveJob() != job)
return B_BAD_VALUE;
return jobQueue->Pause();
}
}
}
return B_ENTRY_NOT_FOUND;
}
// _kern_cancel_disk_device_job
status_t
_kern_cancel_disk_device_job(disk_job_id id, bool reverse)
{
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
if (ManagerLocker locker = manager) {
// get the job and the respective job queue
if (KDiskDeviceJob *job = manager->FindJob(id)) {
if (KDiskDeviceJobQueue *jobQueue = job->JobQueue()) {
// only the active job in progress can be canceled
if (jobQueue->ActiveJob() != job)
return B_BAD_VALUE;
return jobQueue->Cancel(reverse);
}
}
}
return B_ENTRY_NOT_FOUND;
}