found out the problem with the endless loop, or at least, worked around it: get_device_hid() was screwing the tree enumeration in some way, so I commented it out for the time being. Some snprintf -> strlcpy changes, reduced debug output

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28491 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stefano Ceccherini 2008-11-04 14:22:55 +00:00
parent 3ece3174bf
commit d0406f388a

View File

@ -6,8 +6,8 @@
#include <Drivers.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include "acpi_priv.h"
@ -51,19 +51,12 @@ make_space(acpi_ns_device_info *device, size_t space)
return true;
bool released = false;
do {
/*if (!released) {
released = true;
if (release_sem(device->read_sem) != B_OK) {
panic("can't release sem");
return false;
}
}*/
device->buffer->Unlock();
if (!released) {
dprintf("try to release\n");
//dprintf("try to release\n");
if (release_sem_etc(device->read_sem, 1, B_RELEASE_IF_WAITING_ONLY) == B_OK) {
dprintf("released\n");
//dprintf("released\n");
released = true;
}
}
@ -92,28 +85,18 @@ dump_acpi_namespace(acpi_ns_device_info *device, char *root, int indenting)
size_t written = 0;
hid[8] = '\0';
tabs[0] = '\0';
for (i = 0; i < indenting; i++) {
sprintf(tabs, "%s| ", tabs);
}
sprintf(tabs, "%s|--- ", tabs);
for (i = 0; i < indenting; i++)
strlcat(tabs, "| ", sizeof(tabs));
strlcat(tabs, "|--- ", sizeof(tabs));
int depth = sizeof(char) * 5 * indenting + sizeof(char); // index into result where the device name will be.
if (atomic_add(&sNumCount, 1) >= 200) {
dprintf("above 200");
// TODO: Without this, the function never finishes
// to dump the acpi tree, so there seems to be something
// weird with the acpi code
exit_thread(B_ERROR);
}
void *counter = NULL;
while (device->acpi->get_next_entry(ACPI_TYPE_ANY, root, result, 255, &counter) == B_OK) {
uint32 type = device->acpi->get_object_type(result);
sprintf(output, "%s%s", tabs, result + depth);
snprintf(output, sizeof(output), "%s%s", tabs, result + depth);
switch(type) {
case ACPI_TYPE_ANY:
default:
break;
case ACPI_TYPE_INTEGER:
snprintf(output, sizeof(output), "%s INTEGER", output);
break;
@ -130,7 +113,8 @@ dump_acpi_namespace(acpi_ns_device_info *device, char *root, int indenting)
snprintf(output, sizeof(output), "%s FIELD UNIT", output);
break;
case ACPI_TYPE_DEVICE:
device->acpi->get_device_hid(result, hid);
// TODO: Commented out for the time being, since it screws the outpu
//device->acpi->get_device_hid(result, hid);
snprintf(output, sizeof(output), "%s DEVICE (%s)", output, hid);
break;
case ACPI_TYPE_EVENT:
@ -157,8 +141,10 @@ dump_acpi_namespace(acpi_ns_device_info *device, char *root, int indenting)
case ACPI_TYPE_BUFFER_FIELD:
snprintf(output, sizeof(output), "%s BUFFER_FIELD", output);
break;
case ACPI_TYPE_ANY:
default:
break;
}
//strcat(output, "\n");
written = 0;
RingBuffer &ringBuffer = *device->buffer;
size_t toWrite = strlen(output);
@ -183,10 +169,7 @@ dump_acpi_namespace(acpi_ns_device_info *device, char *root, int indenting)
dump_acpi_namespace(device, result, indenting + 1);
}
}
//dprintf("Reached end of devices, root %s, counter %p\n", root, counter);
//panic("reached end of device!!!");
}
@ -232,17 +215,25 @@ acpi_namespace_open(void *_cookie, const char* path, int flags, void** cookie)
return B_NO_MEMORY;
device->read_sem = create_sem(0, "read_sem");
if (device->read_sem < B_OK) {
delete ringBuffer;
return device->read_sem;
}
device->thread = spawn_kernel_thread(acpi_namespace_dump, "acpi dumper",
B_NORMAL_PRIORITY, device);
if (device->thread < 0) {
delete ringBuffer;
delete_sem(device->read_sem);
return device->thread;
}
device->buffer = ringBuffer;
sNumCount = 0;
resume_thread(device->thread);
return B_OK;
}
@ -331,9 +322,9 @@ acpi_namespace_control(void* cookie, uint32 op, void* arg, size_t len)
static status_t
acpi_namespace_close(void* cookie)
{
status_t status;
acpi_ns_device_info *device = (acpi_ns_device_info *)cookie;
dprintf("acpi_ns_dump: device_close\n");
if (device->read_sem >= 0)
delete_sem(device->read_sem);