本文整理汇总了C++中PTHREAD_MUTEX_UNLOCK函数的典型用法代码示例。如果您正苦于以下问题:C++ PTHREAD_MUTEX_UNLOCK函数的具体用法?C++ PTHREAD_MUTEX_UNLOCK怎么用?C++ PTHREAD_MUTEX_UNLOCK使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了PTHREAD_MUTEX_UNLOCK函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: _starpu_data_wait_until_available
/* If sequential consistency mode is enabled, this function blocks until the
* handle is available in the requested access mode. */
int _starpu_data_wait_until_available(starpu_data_handle handle, starpu_access_mode mode)
{
/* If sequential consistency is enabled, wait until data is available */
PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex);
int sequential_consistency = handle->sequential_consistency;
if (sequential_consistency)
{
struct starpu_task *sync_task;
sync_task = starpu_task_create();
sync_task->destroy = 1;
/* It is not really a RW access, but we want to make sure that
* all previous accesses are done */
_starpu_detect_implicit_data_deps_with_handle(sync_task, sync_task, handle, mode);
PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex);
/* TODO detect if this is superflous */
starpu_event event;
int ret = starpu_task_submit(sync_task, &event);
STARPU_ASSERT(!ret);
starpu_event_wait(event);
starpu_event_release(event);
}
else {
PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex);
}
return 0;
}
示例2: fr_logfile_close
/** Close the log file. Really just return it to the pool.
*
* When multithreaded, the FD is locked via a mutex. This way we're
* sure that no other thread is writing to the file. This function
* will unlock the mutex, so that other threads can write to the file.
*
* @param lf The logfile context returned from fr_logfile_init()
* @param fd the FD to close (i.e. return to the pool)
* @return 0 on success, or -1 on error
*/
int fr_logfile_close(fr_logfile_t *lf, int fd)
{
int i;
for (i = 0; i < lf->max_entries; i++) {
if (!lf->entries[i].filename) continue;
/*
* Unlock the bytes that we had previously locked.
*/
if (lf->entries[i].dup == fd) {
(void) rad_unlockfd(lf->entries[i].dup, 0);
close(lf->entries[i].dup); /* releases the fcntl lock */
lf->entries[i].dup = -1;
PTHREAD_MUTEX_UNLOCK(&(lf->mutex));
return 0;
}
}
PTHREAD_MUTEX_UNLOCK(&(lf->mutex));
fr_strerror_printf("Attempt to unlock file which does not exist");
return -1;
}
示例3: proxy_tls_send
int proxy_tls_send(rad_listen_t *listener, REQUEST *request)
{
int rcode;
listen_socket_t *sock = listener->data;
/*
* Normal proxying calls us with the data already
* encoded. The "ping home server" code does not. So,
* if there's no packet, encode it here.
*/
if (!request->proxy->data) {
request->proxy_listener->encode(request->proxy_listener,
request);
}
DEBUG3("Proxy is writing %u bytes to SSL",
(unsigned int) request->proxy->data_len);
PTHREAD_MUTEX_LOCK(&sock->mutex);
while ((rcode = SSL_write(sock->ssn->ssl, request->proxy->data,
request->proxy->data_len)) < 0) {
int err;
while ((err = ERR_get_error())) {
DEBUG("proxy SSL_write says %s",
ERR_error_string(err, NULL));
}
PTHREAD_MUTEX_UNLOCK(&sock->mutex);
tls_socket_close(listener);
return 0;
}
PTHREAD_MUTEX_UNLOCK(&sock->mutex);
return 1;
}
示例4: _handle_pending_node_data_requests
static void _handle_pending_node_data_requests(uint32_t src_node, unsigned force)
{
// _STARPU_DEBUG("_starpu_handle_pending_node_data_requests ...\n");
PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[src_node]);
/* for all entries of the list */
starpu_data_request_list_t local_list = data_requests_pending[src_node];
data_requests_pending[src_node] = starpu_data_request_list_new();
PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[src_node]);
while (!starpu_data_request_list_empty(local_list))
{
starpu_data_request_t r;
r = starpu_data_request_list_pop_back(local_list);
if (r->src_handle != r->dst_handle) {
_starpu_spin_lock(&r->src_handle->header_lock);
_starpu_spin_lock(&r->dst_handle->header_lock);
}
else
_starpu_spin_lock(&r->src_handle->header_lock);
_starpu_spin_lock(&r->lock);
/* wait until the transfer is terminated */
if (force)
{
_starpu_driver_wait_request_completion(r, src_node);
starpu_handle_data_request_completion(r);
}
else {
if (_starpu_driver_test_request_completion(r, src_node))
{
starpu_handle_data_request_completion(r);
}
else {
_starpu_spin_unlock(&r->lock);
if (r->src_handle != r->dst_handle) {
_starpu_spin_unlock(&r->src_handle->header_lock);
_starpu_spin_unlock(&r->dst_handle->header_lock);
}
else
_starpu_spin_unlock(&r->src_handle->header_lock);
/* wake the requesting worker up */
PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[src_node]);
starpu_data_request_list_push_front(data_requests_pending[src_node], r);
PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[src_node]);
}
}
}
starpu_data_request_list_delete(local_list);
}
示例5: _starpu_bind_thread_on_cpu
void *_starpu_gordon_worker(void *arg)
{
struct starpu_worker_set_s *gordon_set_arg = arg;
_starpu_bind_thread_on_cpu(gordon_set_arg->config, gordon_set_arg->workers[0].bindid);
/* TODO set_local_memory_node per SPU */
gordon_init(gordon_set_arg->nworkers);
/* NB: On SPUs, the worker_key is set to NULL since there is no point
* in associating the PPU thread with a specific SPU (worker) while
* it's handling multiple processing units. */
_starpu_set_local_worker_key(NULL);
/* TODO set workers' name field */
unsigned spu;
for (spu = 0; spu < gordon_set_arg->nworkers; spu++)
{
struct starpu_worker_s *worker = &gordon_set_arg->workers[spu];
snprintf(worker->name, 32, "SPU %d", worker->id);
}
/*
* To take advantage of PPE being hyperthreaded, we should have 2 threads
* for the gordon driver : one injects works, the other makes sure that
* gordon is progressing (and performs the callbacks).
*/
/* launch the progression thread */
PTHREAD_MUTEX_INIT(&progress_mutex, NULL);
PTHREAD_COND_INIT(&progress_cond, NULL);
pthread_create(&progress_thread, NULL, gordon_worker_progress, gordon_set_arg);
/* wait for the progression thread to be ready */
PTHREAD_MUTEX_LOCK(&progress_mutex);
while (!progress_thread_is_inited)
PTHREAD_COND_WAIT(&progress_cond, &progress_mutex);
PTHREAD_MUTEX_UNLOCK(&progress_mutex);
_STARPU_DEBUG("progress thread is running ... \n");
/* tell the core that gordon is ready */
PTHREAD_MUTEX_LOCK(&gordon_set_arg->mutex);
gordon_set_arg->set_is_initialized = 1;
PTHREAD_COND_SIGNAL(&gordon_set_arg->ready_cond);
PTHREAD_MUTEX_UNLOCK(&gordon_set_arg->mutex);
gordon_worker_inject(gordon_set_arg);
_STARPU_DEBUG("gordon deinit...\n");
gordon_deinit();
_STARPU_DEBUG("gordon was deinited\n");
pthread_exit((void *)0x42);
}
示例6: ddc_receive_frame
static int ddc_receive_frame(void* data, int streamId, unsigned char* buffer, unsigned int bufferSize)
{
DVDecodeStreamConnect* connect = (DVDecodeStreamConnect*)data;
int status;
int result = 1;
if (connect->sourceStreamId != streamId)
{
ml_log_error("Received frame for unknown source stream %d in copy connect\n", streamId);
return 0;
}
/* signal to ddc_sync at later time that we have received a frame to decode and send */
connect->frameWasReceived = 1;
if (!connect->useWorkerThread)
{
result = decode_and_send(connect);
}
else
{
/* check that the worker isn't busy */
PTHREAD_MUTEX_LOCK(&connect->workerMutex);
if (connect->workerIsBusy)
{
ml_log_error("DV connect worker thread is still busy, and therefore cannot receive a new frame\n");
result = 0;
}
PTHREAD_MUTEX_UNLOCK(&connect->workerMutex);
if (result != 1)
{
return result;
}
/* signal worker that a new frame is ready */
PTHREAD_MUTEX_LOCK(&connect->workerMutex);
connect->frameIsReady = 1;
status = pthread_cond_signal(&connect->frameIsReadyCond);
if (status != 0)
{
ml_log_error("DV connect worker thread failed to send frame is ready condition signal\n");
result = 0;
}
PTHREAD_MUTEX_UNLOCK(&connect->workerMutex);
}
return result;
}
示例7: starpu_data_acquire_cb
/* The data must be released by calling starpu_data_release later on */
int starpu_data_acquire_cb(starpu_data_handle handle,
starpu_access_mode mode, void (*callback)(void *), void *arg)
{
STARPU_ASSERT(handle);
struct user_interaction_wrapper *wrapper = malloc(sizeof(struct user_interaction_wrapper));
STARPU_ASSERT(wrapper);
wrapper->handle = handle;
wrapper->mode = mode;
wrapper->callback = callback;
wrapper->callback_arg = arg;
PTHREAD_COND_INIT(&wrapper->cond, NULL);
PTHREAD_MUTEX_INIT(&wrapper->lock, NULL);
wrapper->finished = 0;
//TODO: instead of having the is_prefetch argument, _starpu_fetch_data shoud consider two flags: async and detached
_starpu_spin_lock(&handle->header_lock);
handle->per_node[0].refcnt++;
_starpu_spin_unlock(&handle->header_lock);
PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex);
int sequential_consistency = handle->sequential_consistency;
if (sequential_consistency)
{
wrapper->pre_sync_task = starpu_task_create();
wrapper->pre_sync_task->callback_func = starpu_data_acquire_cb_pre_sync_callback;
wrapper->pre_sync_task->callback_arg = wrapper;
wrapper->post_sync_task = starpu_task_create();
#ifdef STARPU_USE_FXT
starpu_job_t job = _starpu_get_job_associated_to_task(wrapper->pre_sync_task);
job->model_name = "acquire_cb_pre";
job = _starpu_get_job_associated_to_task(wrapper->post_sync_task);
job->model_name = "acquire_cb_post";
#endif
_starpu_detect_implicit_data_deps_with_handle(wrapper->pre_sync_task, wrapper->post_sync_task, handle, mode);
PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex);
/* TODO detect if this is superflous */
int ret = starpu_task_submit(wrapper->pre_sync_task, NULL);
STARPU_ASSERT(!ret);
}
else {
PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex);
starpu_data_acquire_cb_pre_sync_callback(wrapper);
}
return 0;
}
示例8: vpe_hardware_open_subdev
/* vpe_hardware_open_subdev:
*
* opens the vpe subdev and updates instance info.
* updates the hardware status.
* currently only one vpe subdevice is supported.
**/
int32_t vpe_hardware_open_subdev(vpe_hardware_t *vpehw)
{
int fd, rc=0;
char dev_name[SUBDEV_NAME_SIZE_MAX];
if(!vpehw) {
CDBG_ERROR("%s:%d: failed\n", __func__, __LINE__);
return -EINVAL;
}
/* make sure all code-paths unlock this mutex */
PTHREAD_MUTEX_LOCK(&(vpehw->mutex));
if (vpehw->subdev_opened == TRUE) {
CDBG_HIGH("%s:%d: subdev already open\n", __func__, __LINE__);
rc = -EFAULT;
goto error_mutex;
}
snprintf(dev_name, sizeof(dev_name), "/dev/v4l-subdev%d",
vpehw->subdev_ids[0]);
fd = open(dev_name, O_RDWR | O_NONBLOCK);
if (fd < 0) {
CDBG_ERROR("%s:%d: error: cannot open vpe subdev: %s\n",
__func__, __LINE__, dev_name);
rc = -EIO;
goto error_mutex;
}
vpehw->subdev_fd = fd;
vpehw->subdev_opened = TRUE;
/* get the instance info */
struct msm_camera_v4l2_ioctl_t v4l2_ioctl;
struct msm_vpe_frame_info_t inst_info;
memset(&inst_info, 0x00, sizeof(struct msm_vpe_frame_info_t));
v4l2_ioctl.ioctl_ptr = &inst_info;
v4l2_ioctl.len = sizeof(inst_info);
rc = ioctl(vpehw->subdev_fd, VIDIOC_MSM_VPE_GET_INST_INFO, &v4l2_ioctl);
if (rc < 0) {
CDBG_ERROR("%s:%d: v4l2 ioctl() failed, rc=%d\n", __func__, __LINE__, rc);
rc = -EIO;
goto error_open;
}
vpehw->inst_id = inst_info.inst_id;
/* update hw state */
vpehw->status = VPE_HW_STATUS_READY;
CDBG("%s:%d, vpe subdev opened, subdev_fd=%d, status=%d",
__func__, __LINE__, vpehw->subdev_fd, vpehw->status);
PTHREAD_MUTEX_UNLOCK(&(vpehw->mutex));
return 0;
error_open:
close(fd);
error_mutex:
PTHREAD_MUTEX_UNLOCK(&(vpehw->mutex));
return rc;
}
示例9: proxy_tls_send
int proxy_tls_send(rad_listen_t *listener, REQUEST *request)
{
int rcode;
listen_socket_t *sock = listener->data;
VERIFY_REQUEST(request);
if ((listener->status != RAD_LISTEN_STATUS_INIT) &&
(listener->status != RAD_LISTEN_STATUS_KNOWN)) return 0;
/*
* Normal proxying calls us with the data already
* encoded. The "ping home server" code does not. So,
* if there's no packet, encode it here.
*/
if (!request->proxy->data) {
request->proxy_listener->encode(request->proxy_listener,
request);
}
DEBUG3("Proxy is writing %u bytes to SSL",
(unsigned int) request->proxy->data_len);
PTHREAD_MUTEX_LOCK(&sock->mutex);
rcode = SSL_write(sock->tls_session->ssl, request->proxy->data,
request->proxy->data_len);
if (rcode < 0) {
int err;
err = ERR_get_error();
switch (err) {
case SSL_ERROR_NONE:
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE:
break; /* let someone else retry */
default:
DEBUG("proxy SSL_write says %s",
ERR_error_string(err, NULL));
DEBUG("Closing TLS socket to home server");
tls_socket_close(listener);
PTHREAD_MUTEX_UNLOCK(&sock->mutex);
return 0;
}
}
PTHREAD_MUTEX_UNLOCK(&sock->mutex);
return 1;
}
示例10: rbtree_walk
/*
* walk the entire tree. The compare function CANNOT modify
* the tree.
*
* The compare function should return 0 to continue walking.
* Any other value stops the walk, and is returned.
*/
int rbtree_walk(rbtree_t *tree, rb_order_t order, rb_walker_t compare, void *context)
{
int rcode;
if (tree->root == NIL) return 0;
PTHREAD_MUTEX_LOCK(tree);
switch (order) {
case RBTREE_PRE_ORDER:
rcode = walk_node_pre_order(tree->root, compare, context);
break;
case RBTREE_IN_ORDER:
rcode = walk_node_in_order(tree->root, compare, context);
break;
case RBTREE_POST_ORDER:
rcode = walk_node_post_order(tree->root, compare, context);
break;
case RBTREE_DELETE_ORDER:
rcode = walk_delete_order(tree, compare, context);
break;
default:
rcode = -1;
break;
}
PTHREAD_MUTEX_UNLOCK(tree);
return rcode;
}
示例11: _starpu_stack_pop_task
starpu_job_t _starpu_stack_pop_task(struct starpu_stack_jobq_s *stack_queue, pthread_mutex_t *sched_mutex)
{
starpu_job_t j = NULL;
if (stack_queue->njobs == 0)
return NULL;
if (stack_queue->njobs > 0)
{
/* there is a task */
j = starpu_job_list_pop_back(stack_queue->jobq);
STARPU_ASSERT(j);
stack_queue->njobs--;
STARPU_TRACE_JOB_POP(j, 0);
/* we are sure that we got it now, so at worst, some people thought
* there remained some work and will soon discover it is not true */
PTHREAD_MUTEX_LOCK(sched_mutex);
total_number_of_jobs--;
PTHREAD_MUTEX_UNLOCK(sched_mutex);
}
return j;
}
示例12: _STARPU_DEBUG
void *gordon_worker_progress(void *arg)
{
_STARPU_DEBUG("gordon_worker_progress\n");
/* fix the thread on the correct cpu */
struct starpu_worker_set_s *gordon_set_arg = arg;
unsigned prog_thread_bind_id =
(gordon_set_arg->workers[0].bindid + 1)%(gordon_set_arg->config->nhwcores);
_starpu_bind_thread_on_cpu(gordon_set_arg->config, prog_thread_bind_id);
PTHREAD_MUTEX_LOCK(&progress_mutex);
progress_thread_is_inited = 1;
PTHREAD_COND_SIGNAL(&progress_cond);
PTHREAD_MUTEX_UNLOCK(&progress_mutex);
while (1) {
/* the Gordon runtime needs to make sure that we poll it
* so that we handle jobs that are done */
/* wait for one task termination */
int ret = gordon_wait(0);
if (ret)
{
/* possibly wake the thread that injects work */
starpu_wake_all_blocked_workers();
}
}
return NULL;
}
示例13: talloc
/** Inserts a backtrace marker into the provided context
*
* Allows for maximum laziness and will initialise a circular buffer if one has not already been created.
*
* Code augmentation should look something like:
@verbatim
// Create a static cbuffer pointer, the first call to backtrace_attach will initialise it
static fr_cbuff *my_obj_bt;
my_obj_t *alloc_my_obj(TALLOC_CTX *ctx) {
my_obj_t *this;
this = talloc(ctx, my_obj_t);
// Attach backtrace marker to object
backtrace_attach(&my_obj_bt, this);
return this;
}
@endverbatim
*
* Then, later when a double free occurs:
@verbatim
(gdb) call backtrace_print(&my_obj_bt, <pointer to double freed memory>)
@endverbatim
*
* which should print a limited backtrace to stderr. Note, this backtrace will not include any argument
* values, but should at least show the code path taken.
*
* @param cbuff this should be a pointer to a static *fr_cbuff.
* @param obj we want to generate a backtrace for.
*/
fr_bt_marker_t *fr_backtrace_attach(fr_cbuff_t **cbuff, TALLOC_CTX *obj)
{
fr_bt_marker_t *marker;
if (*cbuff == NULL) {
PTHREAD_MUTEX_LOCK(&fr_debug_init);
/* Check again now we hold the mutex - eww*/
if (*cbuff == NULL) {
TALLOC_CTX *ctx;
ctx = fr_autofree_ctx();
*cbuff = fr_cbuff_alloc(ctx, MAX_BT_CBUFF, true);
}
PTHREAD_MUTEX_UNLOCK(&fr_debug_init);
}
marker = talloc(obj, fr_bt_marker_t);
if (!marker) {
return NULL;
}
marker->obj = (void *) obj;
marker->cbuff = *cbuff;
talloc_set_destructor(marker, _fr_do_bt);
return marker;
}
示例14: x11c_clear
void x11c_clear(X11Common* x11Common)
{
x11Common->stopped = 1;
join_thread(&x11Common->processEventThreadId, NULL, NULL);
PTHREAD_MUTEX_LOCK(&x11Common->eventMutex) /* don't allow events to be processed */
kic_free_keyboard_connect(&x11Common->keyboardConnect);
pic_free_progress_bar_connect(&x11Common->progressBarConnect);
mic_free_mouse_connect(&x11Common->mouseConnect);
if (x11Common->createdWindowInfo)
{
x11c_close_window(&x11Common->windowInfo);
x11Common->createdWindowInfo = 0;
}
SAFE_FREE(&x11Common->windowName);
x11Common->osd = NULL;
PTHREAD_MUTEX_UNLOCK(&x11Common->eventMutex)
destroy_mutex(&x11Common->eventMutex);
memset(x11Common, 0, sizeof(x11Common));
}
示例15: eap_handler_free
void eap_handler_free(rlm_eap_t *inst, eap_handler_t *handler)
{
if (!handler)
return;
if (handler->identity) {
talloc_free(handler->identity);
handler->identity = NULL;
}
if (handler->prev_eapds) eap_ds_free(&(handler->prev_eapds));
if (handler->eap_ds) eap_ds_free(&(handler->eap_ds));
if ((handler->opaque) && (handler->free_opaque)) {
handler->free_opaque(handler->opaque);
handler->opaque = NULL;
}
handler->opaque = NULL;
handler->free_opaque = NULL;
if (handler->certs) pairfree(&handler->certs);
PTHREAD_MUTEX_LOCK(&(inst->handler_mutex));
if (inst->handler_tree) {
rbtree_deletebydata(inst->handler_tree, handler);
}
talloc_free(handler);
PTHREAD_MUTEX_UNLOCK(&(inst->handler_mutex));
}