Made DPC module binary compatible with BeOS one.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23901 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Philippe Houdoin 2008-02-06 23:10:13 +00:00
parent 05b79eadff
commit 6198a9798e
4 changed files with 29 additions and 16 deletions

View File

@ -1,26 +1,28 @@
/* DPC module API /* DPC module API
* Copyright 2007, Haiku Inc. All Rights Reserved. * Copyright 2007-2008, Haiku Inc. All Rights Reserved.
* Distributed under the terms of the MIT License * Distributed under the terms of the MIT License
*/ */
#ifndef _DPC_MODULE_H_ #ifndef _DPC_MODULE_H_
#define _DPC_MODULE_H_ #define _DPC_MODULE_H_
#include <OS.h>
#include <module.h> #include <module.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#define B_DPC_MODULE_NAME "generic/dpc/haiku/v1" #define B_DPC_MODULE_NAME "generic/dpc/v1"
typedef void (*dpc_func) (void *arg); typedef void (*dpc_func) (void *arg);
typedef struct { typedef struct {
module_info info; module_info info;
void * (*new_dpc_queue)(const char *name, long priority, int queue_size);
status_t (*new_dpc_queue)(void **queue, const char *name, int32 priority);
status_t (*delete_dpc_queue)(void *queue); status_t (*delete_dpc_queue)(void *queue);
status_t (*queue_dpc)(void *queue, dpc_func dpc_name, void *arg); status_t (*queue_dpc)(void *queue, dpc_func func, void *arg);
} dpc_module_info; } dpc_module_info;
@ -28,4 +30,4 @@ typedef struct {
} }
#endif #endif
#endif #endif // _DPC_MODULE_H_

View File

@ -110,7 +110,10 @@ acpi_std_ops(int32 op,...)
} }
#endif #endif
gDPChandle = gDPC->new_dpc_queue("acpi_task", B_NORMAL_PRIORITY, 10); if (gDPC->new_dpc_queue(&gDPChandle, "acpi_task", B_NORMAL_PRIORITY) != B_OK) {
ERROR("AcpiInitializeSubsystem failed (new_dpc_queue() failed!)\n");
goto err;
}
#ifdef ACPI_DEBUG_OUTPUT #ifdef ACPI_DEBUG_OUTPUT
AcpiDbgLevel = ACPI_DEBUG_ALL | ACPI_LV_VERBOSE; AcpiDbgLevel = ACPI_DEBUG_ALL | ACPI_LV_VERBOSE;

View File

@ -764,7 +764,7 @@ fwohci_init(struct fwohci_softc *sc)
TASK_INIT(&sc->fwohci_task_busreset, 2, fwohci_task_busreset, sc); TASK_INIT(&sc->fwohci_task_busreset, 2, fwohci_task_busreset, sc);
TASK_INIT(&sc->fwohci_task_sid, 1, fwohci_task_sid, sc); TASK_INIT(&sc->fwohci_task_sid, 1, fwohci_task_sid, sc);
TASK_INIT(&sc->fwohci_task_dma, 0, fwohci_task_dma, sc);*/ TASK_INIT(&sc->fwohci_task_dma, 0, fwohci_task_dma, sc);*/
sc->fc.taskqueue = gDpc->new_dpc_queue("fw_taskq", FW_TASKQ_PRI, FW_TASKQ_SIZE); gDpc->new_dpc_queue(&sc->fc.taskqueue, "fw_taskq", FW_TASKQ_PRI);
fw_init(&sc->fc); fw_init(&sc->fc);
fwohci_reset(sc); fwohci_reset(sc);

View File

@ -35,6 +35,7 @@ typedef struct {
// size * slots follow // size * slots follow
} dpc_queue; } dpc_queue;
#define DPC_QUEUE_SIZE 64
static int32 static int32
dpc_thread(void *arg) dpc_thread(void *arg)
@ -74,18 +75,21 @@ dpc_thread(void *arg)
// ---- Public API // ---- Public API
static void * static status_t
new_dpc_queue(const char *name, long priority, int queue_size) new_dpc_queue(void **handle, const char *name, int32 priority)
{ {
char str[64]; char str[64];
dpc_queue *queue; dpc_queue *queue;
queue = malloc(sizeof(dpc_queue) + queue_size * sizeof(dpc_slot)); if (!handle)
return B_BAD_VALUE;
queue = malloc(sizeof(dpc_queue) + DPC_QUEUE_SIZE * sizeof(dpc_slot));
if (!queue) if (!queue)
return NULL; return B_NO_MEMORY;
queue->head = queue->tail = 0; queue->head = queue->tail = 0;
queue->size = queue_size; queue->size = DPC_QUEUE_SIZE;
queue->count = 0; queue->count = 0;
queue->lock = 0; // Init the spinlock queue->lock = 0; // Init the spinlock
@ -100,8 +104,9 @@ new_dpc_queue(const char *name, long priority, int queue_size)
queue->wakeup_sem = create_sem(0, str); queue->wakeup_sem = create_sem(0, str);
if (queue->wakeup_sem < B_OK) { if (queue->wakeup_sem < B_OK) {
status_t status = queue->wakeup_sem;
free(queue); free(queue);
return NULL; return status;
} }
set_sem_owner(queue->wakeup_sem, B_SYSTEM_TEAM); set_sem_owner(queue->wakeup_sem, B_SYSTEM_TEAM);
@ -109,13 +114,16 @@ new_dpc_queue(const char *name, long priority, int queue_size)
// the queued/deferred procedure calls // the queued/deferred procedure calls
queue->thread = spawn_kernel_thread(dpc_thread, name, priority, queue); queue->thread = spawn_kernel_thread(dpc_thread, name, priority, queue);
if (queue->thread < 0) { if (queue->thread < 0) {
status_t status = queue->thread;
delete_sem(queue->wakeup_sem); delete_sem(queue->wakeup_sem);
free(queue); free(queue);
return NULL; return status;
} }
resume_thread(queue->thread); resume_thread(queue->thread);
return queue; *handle = queue;
return B_OK;
} }