Made input_device pointers non-volatile. Since we return pointers to them

in response to input_device_add(), ensure that the pointers don't change
after subsequent adds.
This commit is contained in:
Aaron Giles 2010-03-30 13:50:38 +00:00
parent 32066d6cd7
commit d81beae782

View File

@ -98,7 +98,7 @@ struct _input_device
typedef struct _input_device_list input_device_list; typedef struct _input_device_list input_device_list;
struct _input_device_list struct _input_device_list
{ {
input_device * list; /* the array */ input_device ** list; /* the array */
int count; /* elements in the array */ int count; /* elements in the array */
UINT8 enabled; /* is this class enabled? */ UINT8 enabled; /* is this class enabled? */
UINT8 multi; /* are multiple instances of this class allowed? */ UINT8 multi; /* are multiple instances of this class allowed? */
@ -453,7 +453,7 @@ INLINE input_device *input_code_device(running_machine *machine, input_code code
/* ...and the index is valid for that class, return a pointer to the device */ /* ...and the index is valid for that class, return a pointer to the device */
int devindex = INPUT_CODE_DEVINDEX(code); int devindex = INPUT_CODE_DEVINDEX(code);
if (devindex < device_list[devclass].count) if (devindex < device_list[devclass].count)
return &device_list[devclass].list[devindex]; return device_list[devclass].list[devindex];
} }
/* otherwise, return NULL */ /* otherwise, return NULL */
@ -508,7 +508,7 @@ INLINE void input_item_update_value(running_machine *machine, input_device_item
{ {
input_device_list *device_list = machine->input_data->device_list; input_device_list *device_list = machine->input_data->device_list;
item->current = (*item->getstate)(device_list[item->devclass].list[item->devindex].internal, item->internal); item->current = (*item->getstate)(device_list[item->devclass].list[item->devindex]->internal, item->internal);
} }
@ -677,7 +677,7 @@ int input_device_set_joystick_map(running_machine *machine, int devindex, const
/* iterate over joysticks and set the map */ /* iterate over joysticks and set the map */
for (joynum = startindex; joynum <= stopindex; joynum++) for (joynum = startindex; joynum <= stopindex; joynum++)
device_list[DEVICE_CLASS_JOYSTICK].list[joynum].joymap = map; device_list[DEVICE_CLASS_JOYSTICK].list[joynum]->joymap = map;
return TRUE; return TRUE;
} }
@ -700,7 +700,7 @@ static void input_frame(running_machine *machine)
/* iterate over keyboards */ /* iterate over keyboards */
for (devnum = 0; devnum < device_list[DEVICE_CLASS_KEYBOARD].count; devnum++) for (devnum = 0; devnum < device_list[DEVICE_CLASS_KEYBOARD].count; devnum++)
{ {
input_device *device = &device_list[DEVICE_CLASS_KEYBOARD].list[devnum]; input_device *device = device_list[DEVICE_CLASS_KEYBOARD].list[devnum];
input_item_id itemid; input_item_id itemid;
int changed = FALSE; int changed = FALSE;
@ -751,19 +751,19 @@ input_device *input_device_add(running_machine *machine, input_device_class devc
{ {
input_private *state = machine->input_data; input_private *state = machine->input_data;
input_device_list *devlist = &state->device_list[devclass]; input_device_list *devlist = &state->device_list[devclass];
input_device *device;
assert_always(mame_get_phase(machine) == MAME_PHASE_INIT, "Can only call input_device_add at init time!"); assert_always(mame_get_phase(machine) == MAME_PHASE_INIT, "Can only call input_device_add at init time!");
assert(name != NULL); assert(name != NULL);
assert(devclass != DEVICE_CLASS_INVALID && devclass < DEVICE_CLASS_MAXIMUM); assert(devclass != DEVICE_CLASS_INVALID && devclass < DEVICE_CLASS_MAXIMUM);
/* allocate a new device */ /* allocate a new device */
input_device *newlist = auto_alloc_array_clear(machine, input_device, devlist->count + 1); input_device *device = auto_alloc_clear(machine, input_device);
input_device **newlist = auto_alloc_array(machine, input_device *, devlist->count + 1);
for (int devnum = 0; devnum < devlist->count; devnum++) for (int devnum = 0; devnum < devlist->count; devnum++)
newlist[devnum] = devlist->list[devnum]; newlist[devnum] = devlist->list[devnum];
auto_free(machine, devlist->list); auto_free(machine, devlist->list);
devlist->list = newlist; devlist->list = newlist;
device = &devlist->list[devlist->count++]; devlist->list[devlist->count++] = device;
/* fill in the data */ /* fill in the data */
device->machine = machine; device->machine = machine;
@ -986,7 +986,7 @@ input_code input_code_from_input_item_id(running_machine *machine, input_item_id
/* iterate over devices within each class */ /* iterate over devices within each class */
for (devnum = 0; devnum < devlist->count; devnum++) for (devnum = 0; devnum < devlist->count; devnum++)
{ {
input_device *device = &devlist->list[devnum]; input_device *device = devlist->list[devnum];
if (device->item[itemid] != NULL) if (device->item[itemid] != NULL)
return device_item_to_code(device, itemid); return device_item_to_code(device, itemid);
} }
@ -1020,7 +1020,7 @@ input_code input_code_poll_switches(running_machine *machine, int reset)
/* iterate over devices within each class */ /* iterate over devices within each class */
for (devnum = 0; devnum < devlist->count; devnum++) for (devnum = 0; devnum < devlist->count; devnum++)
{ {
input_device *device = &devlist->list[devnum]; input_device *device = devlist->list[devnum];
input_item_id itemid; input_item_id itemid;
/* iterate over items within each device */ /* iterate over items within each device */
@ -1106,7 +1106,7 @@ input_code input_code_poll_keyboard_switches(running_machine *machine, int reset
/* iterate over devices within each class */ /* iterate over devices within each class */
for (devnum = 0; devnum < devlist->count; devnum++) for (devnum = 0; devnum < devlist->count; devnum++)
{ {
input_device *device = &devlist->list[devnum]; input_device *device = devlist->list[devnum];
input_item_id itemid; input_item_id itemid;
/* iterate over items within each device */ /* iterate over items within each device */
@ -1191,7 +1191,7 @@ static void input_code_reset_axes(running_machine *machine)
/* iterate over devices within each class */ /* iterate over devices within each class */
for (devnum = 0; devnum < devlist->count; devnum++) for (devnum = 0; devnum < devlist->count; devnum++)
{ {
input_device *device = &devlist->list[devnum]; input_device *device = devlist->list[devnum];
input_item_id itemid; input_item_id itemid;
/* iterate over items within each device */ /* iterate over items within each device */
@ -1237,7 +1237,7 @@ input_code input_code_poll_axes(running_machine *machine, int reset)
/* iterate over devices within each class */ /* iterate over devices within each class */
for (devnum = 0; devnum < devlist->count; devnum++) for (devnum = 0; devnum < devlist->count; devnum++)
{ {
input_device *device = &devlist->list[devnum]; input_device *device = devlist->list[devnum];
input_item_id itemid; input_item_id itemid;
/* iterate over items within each device */ /* iterate over items within each device */
@ -1444,7 +1444,7 @@ input_code input_code_from_token(running_machine *machine, const char *_token)
/* if this is an invalid device, we have nothing to look up */ /* if this is an invalid device, we have nothing to look up */
if (device_list == NULL || devindex >= device_list[devclass].count) if (device_list == NULL || devindex >= device_list[devclass].count)
goto exit; goto exit;
device = &device_list[devclass].list[devindex]; device = device_list[devclass].list[devindex];
/* if not a standard code, look it up in the device specific codes */ /* if not a standard code, look it up in the device specific codes */
for (itemid = ITEM_ID_FIRST_VALID; itemid <= device->maxitem; itemid++) for (itemid = ITEM_ID_FIRST_VALID; itemid <= device->maxitem; itemid++)
@ -1570,7 +1570,7 @@ static INT32 convert_absolute_value(running_machine *machine, input_code code, i
/* if we're doing a lightgun reload hack, override the value */ /* if we're doing a lightgun reload hack, override the value */
if (state->lightgun_reload_button && item->devclass == DEVICE_CLASS_LIGHTGUN) if (state->lightgun_reload_button && item->devclass == DEVICE_CLASS_LIGHTGUN)
{ {
input_device_item *button2_item = state->device_list[item->devclass].list[item->devindex].item[ITEM_ID_BUTTON2]; input_device_item *button2_item = state->device_list[item->devclass].list[item->devindex]->item[ITEM_ID_BUTTON2];
if (button2_item != NULL) if (button2_item != NULL)
{ {
/* if it is pressed, return (min,max) */ /* if it is pressed, return (min,max) */
@ -1599,7 +1599,7 @@ static INT32 convert_absolute_value(running_machine *machine, input_code code, i
/* left/right/up/down: if this is a joystick, fetch the paired X/Y axis values and convert */ /* left/right/up/down: if this is a joystick, fetch the paired X/Y axis values and convert */
if (modifier >= ITEM_MODIFIER_LEFT && modifier <= ITEM_MODIFIER_DOWN && item->devclass == DEVICE_CLASS_JOYSTICK) if (modifier >= ITEM_MODIFIER_LEFT && modifier <= ITEM_MODIFIER_DOWN && item->devclass == DEVICE_CLASS_JOYSTICK)
{ {
input_device *device = &state->device_list[item->devclass].list[item->devindex]; input_device *device = state->device_list[item->devclass].list[item->devindex];
input_device_item *xaxis_item = device->item[ITEM_ID_XAXIS]; input_device_item *xaxis_item = device->item[ITEM_ID_XAXIS];
input_device_item *yaxis_item = device->item[ITEM_ID_YAXIS]; input_device_item *yaxis_item = device->item[ITEM_ID_YAXIS];
if (xaxis_item != NULL && yaxis_item != NULL) if (xaxis_item != NULL && yaxis_item != NULL)
@ -1687,7 +1687,7 @@ static INT32 convert_switch_value(running_machine *machine, input_code code, inp
/* button 1 is pressed if either button 1 or 2 are active */ /* button 1 is pressed if either button 1 or 2 are active */
if (INPUT_CODE_ITEMID(code) == ITEM_ID_BUTTON1) if (INPUT_CODE_ITEMID(code) == ITEM_ID_BUTTON1)
{ {
input_device_item *button2_item = state->device_list[item->devclass].list[item->devindex].item[ITEM_ID_BUTTON2]; input_device_item *button2_item = state->device_list[item->devclass].list[item->devindex]->item[ITEM_ID_BUTTON2];
if (button2_item != NULL) if (button2_item != NULL)
{ {
input_item_update_value(machine, button2_item); input_item_update_value(machine, button2_item);