本文整理汇总了C++中G_LOCK函数的典型用法代码示例。如果您正苦于以下问题:C++ G_LOCK函数的具体用法?C++ G_LOCK怎么用?C++ G_LOCK使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了G_LOCK函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: g_cancellable_connect
/**
* g_cancellable_connect:
* @cancellable: A #GCancellable.
* @callback: The #GCallback to connect.
* @data: Data to pass to @callback.
* @data_destroy_func: Free function for @data or %NULL.
*
* Convenience function to connect to the #GCancellable::cancelled
* signal. Also handles the race condition that may happen
* if the cancellable is cancelled right before connecting.
*
* @callback is called at most once, either directly at the
* time of the connect if @cancellable is already cancelled,
* or when @cancellable is cancelled in some thread.
*
* @data_destroy_func will be called when the handler is
* disconnected, or immediately if the cancellable is already
* cancelled.
*
* See #GCancellable::cancelled for details on how to use this.
*
* Returns: The id of the signal handler or 0 if @cancellable has already
* been cancelled.
*
* Since: 2.22
*/
gulong
g_cancellable_connect (GCancellable *cancellable,
GCallback callback,
gpointer data,
GDestroyNotify data_destroy_func)
{
gulong id;
g_return_val_if_fail (G_IS_CANCELLABLE (cancellable), 0);
G_LOCK (cancellable);
if (cancellable->priv->cancelled)
{
void (*_callback) (GCancellable *cancellable,
gpointer user_data);
_callback = (void *)callback;
id = 0;
_callback (cancellable, data);
if (data_destroy_func)
data_destroy_func (data);
}
else
{
id = g_signal_connect_data (cancellable, "cancelled",
callback, data,
(GClosureNotify) data_destroy_func,
0);
}
G_UNLOCK (cancellable);
return id;
}
示例2: g_slist_free
void
g_slist_free (GSList *list)
{
if (list)
{
GSList *last_node = list;
#ifdef ENABLE_GC_FRIENDLY
while (last_node->next)
{
last_node->data = NULL;
last_node = last_node->next;
}
last_node->data = NULL;
#else /* !ENABLE_GC_FRIENDLY */
list->data = list->next;
#endif /* ENABLE_GC_FRIENDLY */
G_LOCK (current_allocator);
last_node->next = current_allocator->free_lists;
current_allocator->free_lists = list;
G_UNLOCK (current_allocator);
}
}
示例3: g_hash_node_destroy
static void
g_hash_node_destroy (GHashNode *hash_node,
GDestroyNotify key_destroy_func,
GDestroyNotify value_destroy_func)
{
if (key_destroy_func)
key_destroy_func (hash_node->key);
if (value_destroy_func)
value_destroy_func (hash_node->value);
#ifdef ENABLE_GC_FRIENDLY
hash_node->key = NULL;
hash_node->value = NULL;
#endif /* ENABLE_GC_FRIENDLY */
#ifdef DISABLE_MEM_POOLS
g_free (hash_node);
#else
G_LOCK (g_hash_global);
hash_node->next = node_free_list;
node_free_list = hash_node;
G_UNLOCK (g_hash_global);
#endif
}
示例4: balde_app_add_url_rule
BALDE_API void
balde_app_add_url_rule(balde_app_t *app, const gchar *endpoint, const gchar *rule,
const balde_http_method_t method, balde_view_func_t view_func)
{
BALDE_APP_READ_ONLY(app);
GError *tmp_error = NULL;
balde_view_t *view = g_new(balde_view_t, 1);
view->url_rule = g_new(balde_url_rule_t, 1);
view->url_rule->endpoint = endpoint;
view->url_rule->rule = rule;
view->url_rule->match = balde_parse_url_rule(view->url_rule->rule, &tmp_error);
if (tmp_error != NULL) {
g_propagate_error(&(app->error), tmp_error);
balde_app_free_views(view);
return;
}
view->url_rule->method = method | BALDE_HTTP_OPTIONS;
if (view->url_rule->method & BALDE_HTTP_GET)
view->url_rule->method |= BALDE_HTTP_HEAD;
view->view_func = view_func;
G_LOCK(views);
app->priv->views = g_slist_append(app->priv->views, view);
G_UNLOCK(views);
}
示例5: g_io_scheduler_cancel_all_jobs
/**
* g_io_scheduler_cancel_all_jobs:
*
* Cancels all cancellable I/O jobs.
*
* A job is cancellable if a #GCancellable was passed into
* g_io_scheduler_push_job().
**/
void
g_io_scheduler_cancel_all_jobs (void)
{
GSList *cancellable_list, *l;
G_LOCK (active_jobs);
cancellable_list = NULL;
for (l = active_jobs; l != NULL; l = l->next)
{
GIOSchedulerJob *job = l->data;
if (job->cancellable)
cancellable_list = g_slist_prepend (cancellable_list,
g_object_ref (job->cancellable));
}
G_UNLOCK (active_jobs);
for (l = cancellable_list; l != NULL; l = l->next)
{
GCancellable *c = l->data;
g_cancellable_cancel (c);
g_object_unref (c);
}
g_slist_free (cancellable_list);
}
示例6: g_io_scheduler_push_job
/**
* g_io_scheduler_push_job:
* @job_func: a #GIOSchedulerJobFunc.
* @user_data: data to pass to @job_func
* @notify: (allow-none): a #GDestroyNotify for @user_data, or %NULL
* @io_priority: the [I/O priority][io-priority]
* of the request.
* @cancellable: optional #GCancellable object, %NULL to ignore.
*
* Schedules the I/O job to run in another thread.
*
* @notify will be called on @user_data after @job_func has returned,
* regardless whether the job was cancelled or has run to completion.
*
* If @cancellable is not %NULL, it can be used to cancel the I/O job
* by calling g_cancellable_cancel() or by calling
* g_io_scheduler_cancel_all_jobs().
*
* Deprecated: use #GThreadPool or g_task_run_in_thread()
**/
void
g_io_scheduler_push_job (GIOSchedulerJobFunc job_func,
gpointer user_data,
GDestroyNotify notify,
gint io_priority,
GCancellable *cancellable)
{
GIOSchedulerJob *job;
GTask *task;
g_return_if_fail (job_func != NULL);
job = g_slice_new0 (GIOSchedulerJob);
job->job_func = job_func;
job->data = user_data;
job->destroy_notify = notify;
if (cancellable)
job->cancellable = g_object_ref (cancellable);
job->context = g_main_context_ref_thread_default ();
G_LOCK (active_jobs);
active_jobs = g_list_prepend (active_jobs, job);
job->active_link = active_jobs;
G_UNLOCK (active_jobs);
task = g_task_new (NULL, cancellable, NULL, NULL);
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
g_task_set_source_tag (task, g_io_scheduler_push_job);
G_GNUC_END_IGNORE_DEPRECATIONS
g_task_set_task_data (task, job, (GDestroyNotify)g_io_job_free);
g_task_set_priority (task, io_priority);
g_task_run_in_thread (task, io_job_thread);
g_object_unref (task);
}
示例7: gst_object_set_name_default
static gboolean
gst_object_set_name_default (GstObject * object)
{
const gchar *type_name;
gint count;
gchar *name, *tmp;
gboolean result;
GQuark q;
/* to ensure guaranteed uniqueness across threads, only one thread
* may ever assign a name */
G_LOCK (object_name_mutex);
if (!object_name_counts) {
g_datalist_init (&object_name_counts);
}
q = g_type_qname (G_OBJECT_TYPE (object));
count = GPOINTER_TO_INT (g_datalist_id_get_data (&object_name_counts, q));
g_datalist_id_set_data (&object_name_counts, q, GINT_TO_POINTER (count + 1));
G_UNLOCK (object_name_mutex);
/* GstFooSink -> foosinkN */
type_name = g_quark_to_string (q);
if (strncmp (type_name, "Gst", 3) == 0)
type_name += 3;
tmp = g_strdup_printf ("%s%d", type_name, count);
name = g_ascii_strdown (tmp, -1);
g_free (tmp);
result = gst_object_set_name (object, name);
g_free (name);
return result;
}
示例8: context_rule_removed
static void
context_rule_removed (ERuleContext *ctx,
EFilterRule *rule)
{
gpointer key, folder = NULL;
d(printf("rule removed; %s\n", rule->name));
/* TODO: remove from folder info cache? */
G_LOCK (vfolder);
if (g_hash_table_lookup_extended (vfolder_hash, rule->name, &key, &folder)) {
g_hash_table_remove (vfolder_hash, key);
g_free (key);
}
G_UNLOCK (vfolder);
/* FIXME Not passing a GCancellable or GError. */
camel_store_delete_folder_sync (
vfolder_store, rule->name, NULL, NULL);
/* this must be unref'd after its deleted */
if (folder)
g_object_unref ((CamelFolder *) folder);
}
示例9: sendrecv_answerer_fakesink_hand_off
static void
sendrecv_answerer_fakesink_hand_off (GstElement * fakesink, GstBuffer * buf,
GstPad * pad, gpointer data)
{
HandOffData *hod = (HandOffData *) data;
GstElement *pipeline;
check_caps (pad, hod);
pipeline = GST_ELEMENT (gst_element_get_parent (fakesink));
G_LOCK (check_receive_lock);
if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (pipeline),
OFFERER_RECEIVES_AUDIO))) {
g_object_set (G_OBJECT (fakesink), "signal-handoffs", FALSE, NULL);
g_idle_add (quit_main_loop_idle, hod->loop);
} else {
g_object_set_data (G_OBJECT (pipeline), ANSWERER_RECEIVES_AUDIO,
GINT_TO_POINTER (TRUE));
}
G_UNLOCK (check_receive_lock);
g_object_unref (pipeline);
}
示例10: g_datalist_id_set_data_full
/**
* g_datalist_remove_data:
* @dl: a datalist.
* @k: the string identifying the data element.
*
* Removes an element using its string identifier. The data element's
* destroy function is called if it has been set.
**/
void
g_datalist_id_set_data_full (GData **datalist,
GQuark key_id,
gpointer data,
GDestroyNotify destroy_func)
{
g_return_if_fail (datalist != NULL);
if (!data)
g_return_if_fail (destroy_func == NULL);
if (!key_id)
{
if (data)
g_return_if_fail (key_id > 0);
else
return;
}
G_LOCK (g_dataset_global);
if (!g_dataset_location_ht)
g_data_initialize ();
g_data_set_internal (datalist, key_id, data, destroy_func, NULL);
G_UNLOCK (g_dataset_global);
}
示例11: fen_init
/**
* fen_init:
*
* FEN subsystem initializing.
*/
gboolean
fen_init ()
{
static gboolean initialized = FALSE;
static gboolean result = FALSE;
G_LOCK (fen_lock);
if (initialized) {
G_UNLOCK (fen_lock);
return result;
}
result = node_class_init();
if (!result) {
G_UNLOCK (fen_lock);
return result;
}
initialized = TRUE;
G_UNLOCK (fen_lock);
return result;
}
示例12: remove_client
static void
remove_client (Client * client)
{
g_print ("Removing connection %s\n", client->name);
g_free (client->name);
if (client->isource) {
g_source_destroy (client->isource);
g_source_unref (client->isource);
}
if (client->tosource) {
g_source_destroy (client->tosource);
g_source_unref (client->tosource);
}
g_object_unref (client->connection);
g_byte_array_unref (client->current_message);
G_LOCK (clients);
clients = g_list_remove (clients, client);
G_UNLOCK (clients);
g_slice_free (Client, client);
}
示例13: pka_manager_find_plugin
/**
* pka_manager_find_plugin:
* @context: A #PkaContext.
* @plugin_id: The plugin identifier.
* @plugin: A location for a #PkaPlugin.
* @error: A location for a #GError, or %NULL.
*
* Finds the plugin matching the requested @plugin_id. If the context
* does not have permissions, this operation will fail.
*
* If successful, the plugin instance is stored in @plugin. The caller
* owns a reference to this plugin and should free it with g_object_unref().
*
* Returns: %TRUE if successful; otherwise %FALSE.
* Side effects: None.
*/
gboolean
pka_manager_find_plugin (PkaContext *context, /* IN */
const gchar *plugin_id, /* IN */
PkaPlugin **plugin, /* OUT */
GError **error) /* OUT */
{
PkaPlugin *iter;
gint i;
g_return_val_if_fail(context != NULL, FALSE);
g_return_val_if_fail(plugin != NULL, FALSE);
ENTRY;
*plugin = NULL;
if (!plugin_id) {
GOTO(failed);
}
G_LOCK(plugins);
for (i = 0; i < manager.plugins->len; i++) {
iter = g_ptr_array_index(manager.plugins, i);
if (g_str_equal(pka_plugin_get_id(iter), plugin_id)) {
/*
* TODO: Verify permissions.
*/
*plugin = g_object_ref(iter);
BREAK;
}
}
G_UNLOCK(plugins);
failed:
if (!*plugin) {
g_set_error(error, PKA_PLUGIN_ERROR, PKA_PLUGIN_ERROR_INVALID_TYPE,
"The specified plugin could not be found.");
}
RETURN(*plugin != NULL);
}
示例14: pad_added_cb
static void
pad_added_cb (GstElement * element, GstPad * pad, gpointer data)
{
GstElement *pipeline = GST_ELEMENT (data);
GstElement *wavenc, *sink;
GstPadLinkReturn ret;
GstPad *sinkpad;
gchar *msg;
if (gst_pad_get_direction (pad) != GST_PAD_SRC)
return;
wavenc = gst_element_factory_make ("wavenc", NULL);
#ifdef MANUAL_CHECK
{
gchar *filename;
G_LOCK (mutex);
filename = g_strdup_printf ("file_%u.wv", id++);
GST_DEBUG ("Creating file %s", filename);
G_UNLOCK (mutex);
sink = gst_element_factory_make ("filesink", NULL);
g_object_set (G_OBJECT (sink), "location", filename, NULL);
g_free (filename);
}
#else
{
sink = gst_element_factory_make ("fakesink", NULL);
}
#endif
g_object_set (G_OBJECT (sink), "sync", FALSE, "async", FALSE, NULL);
gst_bin_add_many (GST_BIN (pipeline), wavenc, sink, NULL);
sinkpad = gst_element_get_static_pad (wavenc, "sink");
if ((ret = gst_pad_link (pad, sinkpad)) != GST_PAD_LINK_OK) {
msg = g_strdup_printf ("Can not link pads (%d)", ret);
gst_object_unref (sinkpad);
goto failed;
}
gst_object_unref (sinkpad);
if (!gst_element_link (wavenc, sink)) {
msg = g_strdup_printf ("Can not link elements");
goto failed;
}
sinkpad = gst_element_get_static_pad (sink, "sink");
gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_BUFFER, buffer_probe_cb, NULL,
NULL);
gst_object_unref (sinkpad);
gst_element_sync_state_with_parent (wavenc);
gst_element_sync_state_with_parent (sink);
G_LOCK (hash_mutex);
g_hash_table_insert (hash, GST_OBJECT_NAME (pad), wavenc);
G_UNLOCK (hash_mutex);
return;
failed:
gst_element_set_state (wavenc, GST_STATE_NULL);
gst_element_set_state (sink, GST_STATE_NULL);
gst_bin_remove_many (GST_BIN (pipeline), wavenc, sink, NULL);
GST_ERROR ("Error %s", msg);
fail (msg);
g_free (msg);
g_idle_add ((GSourceFunc) quit_main_loop, NULL);
}
示例15: g_data_set_internal
/* HOLDS: g_dataset_global_lock */
static inline gpointer
g_data_set_internal (GData **datalist,
GQuark key_id,
gpointer data,
GDestroyNotify destroy_func,
GDataset *dataset)
{
register GData *list;
list = G_DATALIST_GET_POINTER (datalist);
if (!data)
{
register GData *prev;
prev = NULL;
while (list)
{
if (list->id == key_id)
{
gpointer ret_data = NULL;
if (prev)
prev->next = list->next;
else
{
G_DATALIST_SET_POINTER (datalist, list->next);
/* the dataset destruction *must* be done
* prior to invocation of the data destroy function
*/
if (!list->next && dataset)
g_dataset_destroy_internal (dataset);
}
/* the GData struct *must* already be unlinked
* when invoking the destroy function.
* we use (data==NULL && destroy_func!=NULL) as
* a special hint combination to "steal"
* data without destroy notification
*/
if (list->destroy_func && !destroy_func)
{
G_UNLOCK (g_dataset_global);
list->destroy_func (list->data);
G_LOCK (g_dataset_global);
}
else
ret_data = list->data;
g_slice_free (GData, list);
return ret_data;
}
prev = list;
list = list->next;
}
}
else
{
while (list)
{
if (list->id == key_id)
{
if (!list->destroy_func)
{
list->data = data;
list->destroy_func = destroy_func;
}
else
{
register GDestroyNotify dfunc;
register gpointer ddata;
dfunc = list->destroy_func;
ddata = list->data;
list->data = data;
list->destroy_func = destroy_func;
/* we need to have updated all structures prior to
* invocation of the destroy function
*/
G_UNLOCK (g_dataset_global);
dfunc (ddata);
G_LOCK (g_dataset_global);
}
return NULL;
}
list = list->next;
}
list = g_slice_new (GData);
list->next = G_DATALIST_GET_POINTER (datalist);
list->id = key_id;
list->data = data;
list->destroy_func = destroy_func;
G_DATALIST_SET_POINTER (datalist, list);
//.........这里部分代码省略.........