bulk_userdata);
}
+/****************************************************************************
+*
+* user_service_free
+*
+***************************************************************************/
+static void
+user_service_free(void *userdata)
+{
+ kfree(userdata);
+}
+
/****************************************************************************
*
* vchiq_ioctl
service = vchiq_add_service_internal(
instance->state,
&args.params, srvstate,
- instance);
+ instance, user_service_free);
if (service != NULL) {
user_service->service = service;
service = NULL;
ret = (status == VCHIQ_RETRY) ?
-EINTR : -EIO;
- user_service->service = NULL;
- user_service->instance = NULL;
break;
}
}
sizeof(service->handle)) != 0) {
ret = -EFAULT;
vchiq_remove_service(service->handle);
- kfree(user_service);
}
service = NULL;
}
if (completion->reason ==
- VCHIQ_SERVICE_CLOSED) {
+ VCHIQ_SERVICE_CLOSED)
unlock_service(service);
- kfree(user_service);
- }
if (copy_to_user((void __user *)(
(size_t)args.buf +
spin_unlock(&msg_queue_spinlock);
unlock_service(service);
- kfree(user_service);
}
/* Release any closed services */
}
spin_unlock(&service_spinlock);
+ if (service && service->userdata_term)
+ service->userdata_term(service->base.userdata);
+
kfree(service);
}
VCHIQ_SERVICE_T *
vchiq_add_service_internal(VCHIQ_STATE_T *state,
const VCHIQ_SERVICE_PARAMS_T *params, int srvstate,
- VCHIQ_INSTANCE_T instance)
+ VCHIQ_INSTANCE_T instance, VCHIQ_USERDATA_TERM_T userdata_term)
{
VCHIQ_SERVICE_T *service;
service->handle = VCHIQ_SERVICE_HANDLE_INVALID;
service->ref_count = 1;
service->srvstate = VCHIQ_SRVSTATE_FREE;
+ service->userdata_term = userdata_term;
service->localport = VCHIQ_PORT_FREE;
service->remoteport = VCHIQ_PORT_FREE;
VCHIQ_BULK_RECEIVE
} VCHIQ_BULK_DIR_T;
+typedef void (*VCHIQ_USERDATA_TERM_T)(void *userdata);
+
typedef struct vchiq_bulk_struct {
short mode;
short dir;
VCHIQ_SERVICE_HANDLE_T handle;
unsigned int ref_count;
int srvstate;
+ VCHIQ_USERDATA_TERM_T userdata_term;
unsigned int localport;
unsigned int remoteport;
int public_fourcc;
extern VCHIQ_SERVICE_T *
vchiq_add_service_internal(VCHIQ_STATE_T *state,
const VCHIQ_SERVICE_PARAMS_T *params, int srvstate,
- VCHIQ_INSTANCE_T instance);
+ VCHIQ_INSTANCE_T instance, VCHIQ_USERDATA_TERM_T userdata_term);
extern VCHIQ_STATUS_T
vchiq_open_service_internal(VCHIQ_SERVICE_T *service, int client_id);
state,
params,
srvstate,
- instance);
+ instance,
+ NULL);
if (service) {
*phandle = service->handle;
service = vchiq_add_service_internal(state,
params,
VCHIQ_SRVSTATE_OPENING,
- instance);
+ instance,
+ NULL);
if (service) {
status = vchiq_open_service_internal(service, current->pid);