summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Vogelgesang <matthias.vogelgesang@gmail.com>2012-09-25 10:58:43 +0200
committerMatthias Vogelgesang <matthias.vogelgesang@gmail.com>2012-09-25 10:58:43 +0200
commit468641280f9bd6771b5a565b526f40f7fb8e8fad (patch)
tree23120df68b3101c412bde40ff1df123a0b9bfc54
parente5ff011119ac42e48f3f3521b789a18bdfdfb51e (diff)
downloaduca-468641280f9bd6771b5a565b526f40f7fb8e8fad.tar.gz
uca-468641280f9bd6771b5a565b526f40f7fb8e8fad.tar.bz2
uca-468641280f9bd6771b5a565b526f40f7fb8e8fad.tar.xz
uca-468641280f9bd6771b5a565b526f40f7fb8e8fad.zip
Fix #139: Lock API functions
-rw-r--r--src/uca-camera.c184
1 files changed, 111 insertions, 73 deletions
diff --git a/src/uca-camera.c b/src/uca-camera.c
index e34bf62..f973355 100644
--- a/src/uca-camera.c
+++ b/src/uca-camera.c
@@ -303,7 +303,8 @@ uca_camera_class_init(UcaCameraClass *klass)
g_type_class_add_private(klass, sizeof(UcaCameraPrivate));
}
-static void uca_camera_init(UcaCamera *camera)
+static void
+uca_camera_init(UcaCamera *camera)
{
camera->grab_func = NULL;
@@ -343,38 +344,47 @@ static void uca_camera_init(UcaCamera *camera)
* #UcaCameraGrabFunc callback is set, frames are automatically transfered to
* the client program, otherwise you must use uca_camera_grab().
*/
-void uca_camera_start_recording(UcaCamera *camera, GError **error)
+void
+uca_camera_start_recording (UcaCamera *camera, GError **error)
{
- g_return_if_fail(UCA_IS_CAMERA(camera));
+ UcaCameraClass *klass;
+ GError *tmp_error = NULL;
+ static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+
+ g_return_if_fail (UCA_IS_CAMERA (camera));
- UcaCameraClass *klass = UCA_CAMERA_GET_CLASS(camera);
+ klass = UCA_CAMERA_GET_CLASS (camera);
- g_return_if_fail(klass != NULL);
- g_return_if_fail(klass->start_recording != NULL);
+ g_return_if_fail (klass != NULL);
+ g_return_if_fail (klass->start_recording != NULL);
+
+ g_static_mutex_lock (&mutex);
if (camera->priv->is_recording) {
- g_set_error(error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_RECORDING,
+ g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_RECORDING,
"Camera is already recording");
- return;
+ goto start_recording_unlock;
}
if (camera->priv->transfer_async && (camera->grab_func == NULL)) {
- g_set_error(error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NO_GRAB_FUNC,
+ g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NO_GRAB_FUNC,
"No grab callback function set");
- return;
+ goto start_recording_unlock;
}
- GError *tmp_error = NULL;
(*klass->start_recording)(camera, &tmp_error);
if (tmp_error == NULL) {
camera->priv->is_readout = FALSE;
camera->priv->is_recording = TRUE;
/* TODO: we should depend on GLib 2.26 and use g_object_notify_by_pspec */
- g_object_notify(G_OBJECT(camera), "is-recording");
+ g_object_notify (G_OBJECT (camera), "is-recording");
}
else
- g_propagate_error(error, tmp_error);
+ g_propagate_error (error, tmp_error);
+
+start_recording_unlock:
+ g_static_mutex_unlock (&mutex);
}
/**
@@ -384,32 +394,41 @@ void uca_camera_start_recording(UcaCamera *camera, GError **error)
*
* Stop recording.
*/
-void uca_camera_stop_recording(UcaCamera *camera, GError **error)
+void
+uca_camera_stop_recording (UcaCamera *camera, GError **error)
{
- g_return_if_fail(UCA_IS_CAMERA(camera));
+ UcaCameraClass *klass;
+ static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
- UcaCameraClass *klass = UCA_CAMERA_GET_CLASS(camera);
+ g_return_if_fail (UCA_IS_CAMERA (camera));
- g_return_if_fail(klass != NULL);
- g_return_if_fail(klass->stop_recording != NULL);
+ klass = UCA_CAMERA_GET_CLASS (camera);
- if (!camera->priv->is_recording) {
- g_set_error(error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NOT_RECORDING,
- "Camera is not recording");
- return;
- }
+ g_return_if_fail (klass != NULL);
+ g_return_if_fail (klass->stop_recording != NULL);
- GError *tmp_error = NULL;
- (*klass->stop_recording)(camera, &tmp_error);
+ g_static_mutex_lock (&mutex);
- if (tmp_error == NULL) {
- camera->priv->is_readout = FALSE;
- camera->priv->is_recording = FALSE;
- /* TODO: we should depend on GLib 2.26 and use g_object_notify_by_pspec */
- g_object_notify(G_OBJECT(camera), "is-recording");
+ if (!camera->priv->is_recording) {
+ g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NOT_RECORDING,
+ "Camera is not recording");
}
- else
- g_propagate_error(error, tmp_error);
+ else {
+ GError *tmp_error = NULL;
+
+ (*klass->stop_recording)(camera, &tmp_error);
+
+ if (tmp_error == NULL) {
+ camera->priv->is_readout = FALSE;
+ camera->priv->is_recording = FALSE;
+ /* TODO: we should depend on GLib 2.26 and use g_object_notify_by_pspec */
+ g_object_notify (G_OBJECT (camera), "is-recording");
+ }
+ else
+ g_propagate_error (error, tmp_error);
+ }
+
+ g_static_mutex_unlock (&mutex);
}
/**
@@ -422,31 +441,40 @@ void uca_camera_stop_recording(UcaCamera *camera, GError **error)
* uca_camera_stop_recording(). Frames have to be picked up with
* ufo_camera_grab().
*/
-void uca_camera_start_readout(UcaCamera *camera, GError **error)
+void
+uca_camera_start_readout (UcaCamera *camera, GError **error)
{
- g_return_if_fail(UCA_IS_CAMERA(camera));
+ UcaCameraClass *klass;
+ static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
- UcaCameraClass *klass = UCA_CAMERA_GET_CLASS(camera);
+ g_return_if_fail (UCA_IS_CAMERA(camera));
- g_return_if_fail(klass != NULL);
- g_return_if_fail(klass->start_readout != NULL);
+ klass = UCA_CAMERA_GET_CLASS(camera);
- if (camera->priv->is_recording) {
- g_set_error(error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_RECORDING,
- "Camera is still recording");
- return;
- }
+ g_return_if_fail (klass != NULL);
+ g_return_if_fail (klass->start_readout != NULL);
- GError *tmp_error = NULL;
- (*klass->start_readout)(camera, &tmp_error);
+ g_static_mutex_lock (&mutex);
- if (tmp_error == NULL) {
- camera->priv->is_readout = TRUE;
- /* TODO: we should depend on GLib 2.26 and use g_object_notify_by_pspec */
- g_object_notify(G_OBJECT(camera), "is-readout");
+ if (camera->priv->is_recording) {
+ g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_RECORDING,
+ "Camera is still recording");
}
- else
- g_propagate_error(error, tmp_error);
+ else {
+ GError *tmp_error = NULL;
+
+ (*klass->start_readout) (camera, &tmp_error);
+
+ if (tmp_error == NULL) {
+ camera->priv->is_readout = TRUE;
+ /* TODO: we should depend on GLib 2.26 and use g_object_notify_by_pspec */
+ g_object_notify (G_OBJECT (camera), "is-readout");
+ }
+ else
+ g_propagate_error (error, tmp_error);
+ }
+
+ g_static_mutex_unlock (&mutex);
}
/**
@@ -473,22 +501,27 @@ void uca_camera_set_grab_func(UcaCamera *camera, UcaCameraGrabFunc func, gpointe
* You must have called uca_camera_start_recording() before, otherwise you will
* get a #UCA_CAMERA_ERROR_NOT_RECORDING error.
*/
-void uca_camera_trigger(UcaCamera *camera, GError **error)
+void
+uca_camera_trigger (UcaCamera *camera, GError **error)
{
- g_return_if_fail(UCA_IS_CAMERA(camera));
+ UcaCameraClass *klass;
+ static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
- UcaCameraClass *klass = UCA_CAMERA_GET_CLASS(camera);
+ g_return_if_fail (UCA_IS_CAMERA (camera));
- g_return_if_fail(klass != NULL);
- g_return_if_fail(klass->trigger != NULL);
+ klass = UCA_CAMERA_GET_CLASS (camera);
- if (!camera->priv->is_recording) {
- g_set_error(error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NOT_RECORDING,
- "Camera is not recording");
- return;
- }
+ g_return_if_fail (klass != NULL);
+ g_return_if_fail (klass->trigger != NULL);
+
+ g_static_mutex_lock (&mutex);
+
+ if (!camera->priv->is_recording)
+ g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NOT_RECORDING, "Camera is not recording");
+ else
+ (*klass->trigger) (camera, error);
- (*klass->trigger)(camera, error);
+ g_static_mutex_unlock (&mutex);
}
/**
@@ -505,22 +538,27 @@ void uca_camera_trigger(UcaCamera *camera, GError **error)
* You must have called uca_camera_start_recording() before, otherwise you will
* get a #UCA_CAMERA_ERROR_NOT_RECORDING error.
*/
-void uca_camera_grab(UcaCamera *camera, gpointer *data, GError **error)
+void
+uca_camera_grab (UcaCamera *camera, gpointer *data, GError **error)
{
- g_return_if_fail(UCA_IS_CAMERA(camera));
+ UcaCameraClass *klass;
+ static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
- UcaCameraClass *klass = UCA_CAMERA_GET_CLASS(camera);
+ g_return_if_fail (UCA_IS_CAMERA(camera));
- g_return_if_fail(klass != NULL);
- g_return_if_fail(klass->grab != NULL);
- g_return_if_fail(data != NULL);
+ klass = UCA_CAMERA_GET_CLASS (camera);
- if (!camera->priv->is_recording && !camera->priv->is_readout) {
- g_set_error(error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NOT_RECORDING,
- "Camera is neither recording nor in readout mode");
- return;
- }
+ g_return_if_fail (klass != NULL);
+ g_return_if_fail (klass->grab != NULL);
+ g_return_if_fail (data != NULL);
+
+ g_static_mutex_lock (&mutex);
+
+ if (!camera->priv->is_recording && !camera->priv->is_readout)
+ g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NOT_RECORDING, "Camera is neither recording nor in readout mode");
+ else
+ (*klass->grab) (camera, data, error);
- (*klass->grab)(camera, data, error);
+ g_static_mutex_unlock (&mutex);
}