connected service thread's loose ends
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15976 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
|
|
||||||
struct packet_buffer;
|
struct packet_buffer;
|
||||||
|
typedef struct packet_buffer packet_buffer;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|||||||
@@ -9,26 +9,54 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ps2_service.h"
|
#include "ps2_service.h"
|
||||||
|
#include "packet_buffer.h"
|
||||||
|
|
||||||
static sem_id sServiceSem;
|
static sem_id sServiceSem;
|
||||||
static thread_id sServiceThread;
|
static thread_id sServiceThread;
|
||||||
static volatile bool sServiceTerminate;
|
static volatile bool sServiceTerminate;
|
||||||
|
static packet_buffer * sServiceCmdBuffer;
|
||||||
|
|
||||||
#define PS2_SERVICE_INTERVAL 200000
|
#define PS2_SERVICE_INTERVAL 200000
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32 id;
|
||||||
|
ps2_dev * dev;
|
||||||
|
} ps2_service_cmd;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
PS2_SERVICE_HANDLE_DEVICE_ADDED = 1,
|
||||||
|
PS2_SERVICE_HANDLE_DEVICE_REMOVED,
|
||||||
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
ps2_service_handle_device_added(ps2_dev *dev)
|
ps2_service_handle_device_added(ps2_dev *dev)
|
||||||
{
|
{
|
||||||
|
ps2_service_cmd cmd;
|
||||||
|
|
||||||
TRACE(("ps2_service_handle_device_added %s\n", dev->name));
|
TRACE(("ps2_service_handle_device_added %s\n", dev->name));
|
||||||
|
|
||||||
|
cmd.id = PS2_SERVICE_HANDLE_DEVICE_ADDED;
|
||||||
|
cmd.dev = dev;
|
||||||
|
|
||||||
|
packet_buffer_write(sServiceCmdBuffer, (const uint8 *)&cmd, sizeof(cmd));
|
||||||
|
release_sem_etc(sServiceSem, 0, B_DO_NOT_RESCHEDULE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ps2_service_handle_device_removed(ps2_dev *dev)
|
ps2_service_handle_device_removed(ps2_dev *dev)
|
||||||
{
|
{
|
||||||
|
ps2_service_cmd cmd;
|
||||||
|
|
||||||
TRACE(("ps2_service_handle_device_removed %s\n", dev->name));
|
TRACE(("ps2_service_handle_device_removed %s\n", dev->name));
|
||||||
|
|
||||||
|
cmd.id = PS2_SERVICE_HANDLE_DEVICE_REMOVED;
|
||||||
|
cmd.dev = dev;
|
||||||
|
|
||||||
|
packet_buffer_write(sServiceCmdBuffer, (const uint8 *)&cmd, sizeof(cmd));
|
||||||
|
release_sem_etc(sServiceSem, 0, B_DO_NOT_RESCHEDULE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -72,6 +100,26 @@ ps2_service_thread(void *arg)
|
|||||||
if (status == B_OK) {
|
if (status == B_OK) {
|
||||||
// process service commands
|
// process service commands
|
||||||
|
|
||||||
|
ps2_service_cmd cmd;
|
||||||
|
|
||||||
|
packet_buffer_read(sServiceCmdBuffer, (uint8 *)&cmd, sizeof(cmd));
|
||||||
|
switch (cmd.id) {
|
||||||
|
case PS2_SERVICE_HANDLE_DEVICE_ADDED:
|
||||||
|
TRACE(("PS2_SERVICE_HANDLE_DEVICE_ADDED %s\n", cmd.dev->name));
|
||||||
|
if (ps2_service_probe_device(cmd.dev) == B_OK)
|
||||||
|
ps2_dev_publish(cmd.dev);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PS2_SERVICE_HANDLE_DEVICE_REMOVED:
|
||||||
|
TRACE(("PS2_SERVICE_HANDLE_DEVICE_REMOVED %s\n", cmd.dev->name));
|
||||||
|
ps2_dev_unpublish(cmd.dev);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
TRACE(("PS2_SERVICE: unknown id %lu\n", cmd.id));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (status == B_TIMED_OUT) {
|
} else if (status == B_TIMED_OUT) {
|
||||||
// do periodic processing
|
// do periodic processing
|
||||||
|
|
||||||
@@ -87,18 +135,23 @@ ps2_service_thread(void *arg)
|
|||||||
status_t
|
status_t
|
||||||
ps2_service_init(void)
|
ps2_service_init(void)
|
||||||
{
|
{
|
||||||
|
sServiceCmdBuffer = create_packet_buffer(sizeof(ps2_service_cmd) * 50);
|
||||||
|
if (sServiceCmdBuffer == NULL)
|
||||||
|
goto err1;
|
||||||
sServiceSem = create_sem(0, "ps2 service");
|
sServiceSem = create_sem(0, "ps2 service");
|
||||||
if (sServiceSem < B_OK)
|
if (sServiceSem < B_OK)
|
||||||
goto err1;
|
goto err2;
|
||||||
sServiceThread = spawn_kernel_thread(ps2_service_thread, "ps2 service", 20, NULL);
|
sServiceThread = spawn_kernel_thread(ps2_service_thread, "ps2 service", 20, NULL);
|
||||||
if (sServiceThread < B_OK)
|
if (sServiceThread < B_OK)
|
||||||
goto err2;
|
goto err3;
|
||||||
sServiceTerminate = false;
|
sServiceTerminate = false;
|
||||||
resume_thread(sServiceThread);
|
resume_thread(sServiceThread);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
err2:
|
err3:
|
||||||
delete_sem(sServiceSem);
|
delete_sem(sServiceSem);
|
||||||
|
err2:
|
||||||
|
delete_packet_buffer(sServiceCmdBuffer);
|
||||||
err1:
|
err1:
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
@@ -111,4 +164,5 @@ ps2_service_exit(void)
|
|||||||
release_sem(sServiceSem);
|
release_sem(sServiceSem);
|
||||||
wait_for_thread(sServiceThread, NULL);
|
wait_for_thread(sServiceThread, NULL);
|
||||||
delete_sem(sServiceSem);
|
delete_sem(sServiceSem);
|
||||||
|
delete_packet_buffer(sServiceCmdBuffer);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user