return FRSH_ERR_BAD_ARGUMENT;
csect->op_kind = FRSH_CSOK_UNCHECKED;
- csect->obj_handle = obj_handle;
+ strncpy(csect->obj_label,
+ obj_handle->label,
+ sizeof(obj_handle->label));
csect->wcet = wcet;
csect->blocking = wcet;
csect->op = NULL;
csect->areas.size = 0;
- csect->storage.size = 0;
return 0;
}
if (!obj_handle || !csect)
return FRSH_ERR_BAD_ARGUMENT;
- *obj_handle = csect->obj_handle;
+ *obj_handle = fres_sharedobj_get_label(csect->obj_label);
return 0;
}
frsh_csect_op_t op,
const frsh_memory_areas_t *areas)
{
- int i, j;
+ int i;
if (!csect || !op)
return FRSH_ERR_BAD_ARGUMENT;
* critical section not to be UNPROTECTED;
*/
- csect->storage.size = areas->size;
csect->areas.size = areas->size;
csect->op_kind = FRSH_CSOK_WRITE;
csect->op = op;
- for (i = 0; i< areas->size; i++) {
- csect->areas.memory_areas[i] =
- areas->memory_areas[i];
-
- csect->storage.memory_areas[i].size =
- areas->memory_areas[i].size;
-
- /*
- * TODO:
- * Who is going to free() these mallocs? Maybe something
- * like frsh_csect_destroy is needed and missing?
- */
- csect->storage.memory_areas[i].area =
- malloc(areas->memory_areas[i].size);
- if (!csect->storage.memory_areas[i].area)
- goto free_err;
- }
+ for (i = 0; i< areas->size; i++)
+ csect->areas.memory_areas[i] = areas->memory_areas[i];
/* Account for protection and rollback overheads: NOT IMPLEMENTED! */
/* csect->blocking = fosa_rel_time_add(csect->wcet, ); */
csect->blocking = csect->wcet;
return 0;
-free_err:
- for (j = i; j >= 0; j--)
- free(csect->storage.memory_areas[j].area);
-
- return FOSA_ENOMEM;
}
int frsh_csect_invoke
void *output_arg)
{
int i, jumped, ret = 0;
- fosa_signal_t signal;
- fosa_signal_info_t siginfo;
- fosa_clock_id_t clockid;
+ frsh_memory_areas_t storage = { .size = 0 };
frsh_sharedobj_handle_t obj_handle;
fosa_mutex_t *obj_mutex;
+ fosa_clock_id_t clockid;
+ fosa_signal_t signal;
+ fosa_signal_info_t siginfo;
if (!csect) {
ret = FRSH_ERR_BAD_ARGUMENT;
goto out;
}
- obj_handle = csect->obj_handle;
-
+ obj_handle = fres_sharedobj_get_label(csect->obj_label);
+ if (!obj_handle) {
+ ret = errno;
+ goto out;
+ }
ret = frsh_sharedobj_get_mutex(obj_handle, &obj_mutex);
if (ret) goto out;
ret = fosa_mutex_lock(obj_mutex);
/* Backup memory areas. */
if (csect->op_kind == FRSH_CSOK_WRITE) {
- for (i = 0; i < csect->areas.size; i++)
- if (!memcpy(csect->storage.memory_areas[i].area,
+ for (i = 0; i < csect->areas.size; i++) {
+ storage.memory_areas[i].size =
+ csect->areas.memory_areas[i].size;
+ storage.memory_areas[i].area =
+ malloc(csect->areas.memory_areas[i].size);
+ if (!storage.memory_areas[i].area) {
+ ret = errno;
+ goto out_disarm;
+ }
+ if (!memcpy(storage.memory_areas[i].area,
csect->areas.memory_areas[i].area,
csect->areas.memory_areas[i].size)) {
ret = errno;
goto out_disarm;
}
+ storage.size++;
+ }
}
ret = fosa_long_jump_save_context(&obj_handle->context);
if (csect->op_kind == FRSH_CSOK_WRITE) {
for (i = 0; i < csect->areas.size; i++)
if (!memcpy(csect->areas.memory_areas[i].area,
- csect->storage.memory_areas[i].area,
+ storage.memory_areas[i].area,
csect->areas.memory_areas[i].size)) {
ret = errno;
goto out_unlock;
out_disarm:
fosa_timer_disarm(obj_handle->wcet_timer, NULL);
fosa_timer_delete(obj_handle->wcet_timer);
+
+ for (i = 0; i < storage.size; i++)
+ if (storage.memory_areas[i].area) /* Uneeded ? */
+ free(storage.memory_areas[i].area);
+
out_unlock:
fosa_mutex_unlock(obj_mutex);
out: