Exemplo n.º 1
0
/*
 * release clearance
 */
int
_nscd_release_clearance(sema_t *sema) {
	int	which;

	(void) thr_getspecific(lookup_state_key, (void**)&which);
	if (which == 0) /* from common pool */ {
		(void) sema_post(&common_sema);
		return (0);
	}

	(void) sema_post(sema);
	return (1);
}
Exemplo n.º 2
0
static void
free_pagelist(PAGELIST_T *pagelist, int actual)
{
	vm_page_t *pages;
	unsigned int num_pages, i;

	vcos_log_trace("free_pagelist - %x, %d", (unsigned int)pagelist, actual);

	num_pages =
		 (pagelist->length + pagelist->offset + PAGE_SIZE - 1) / PAGE_SIZE;

	pages = (vm_page_t *)(pagelist->addrs + num_pages);

	/* Deal with any partial cache lines (fragments) */
	if (pagelist->type >= PAGELIST_READ_WITH_FRAGMENTS) {
		FRAGMENTS_T *fragments =
			 g_fragments_base + (pagelist->type -
					PAGELIST_READ_WITH_FRAGMENTS);
		int head_bytes, tail_bytes;

		if (actual >= 0)
		{
			/* XXXBSD: might be inefficient */
			void *page_address = pmap_mapdev(VM_PAGE_TO_PHYS(pages[0]), PAGE_SIZE*num_pages);
			if ((head_bytes = (CACHE_LINE_SIZE - pagelist->offset) & (CACHE_LINE_SIZE - 1)) != 0) {
				if (head_bytes > actual)
					head_bytes = actual;

				memcpy((char *)page_address +
						 pagelist->offset, fragments->headbuf,
						 head_bytes);
			}
			if ((head_bytes < actual) &&
				(tail_bytes =
				(pagelist->offset + actual) & (CACHE_LINE_SIZE -
										1)) != 0) {
				memcpy((char *)page_address + PAGE_SIZE*(num_pages - 1) +
						 ((pagelist->offset + actual) & (PAGE_SIZE -
									1) & ~(CACHE_LINE_SIZE - 1)),
						 fragments->tailbuf, tail_bytes);
			}
			pmap_qremove((vm_offset_t)page_address, PAGE_SIZE*num_pages);
		}

		mtx_lock(&g_free_fragments_mutex);
		*(FRAGMENTS_T **) fragments = g_free_fragments;
		g_free_fragments = fragments;
		mtx_unlock(&g_free_fragments_mutex);
		sema_post(&g_free_fragments_sema);
	}

	for (i = 0; i < num_pages; i++) {
		if (pagelist->type != PAGELIST_WRITE)
			vm_page_dirty(pages[i]);
	}

	vm_page_unhold_pages(pages, num_pages);

	free(pagelist, M_VCPAGELIST);
}
Exemplo n.º 3
0
Arquivo: mttest.c Projeto: dhaley/dcp
void
resolve_symbols()
{
	void *foo;
	global_cond_flag = TRUE;
#ifdef SOLARIS
	mutex_lock(&queue_lock);
	mutex_trylock(&queue_lock);
	mutex_unlock(&queue_lock);
	foo = (void *)&cond_signal;
	foo = (void *)&cond_wait;
	foo = (void *)&cond_timedwait;
	sema_post(&global_sema_lock);
	sema_wait(&global_sema_lock); 
	rw_rdlock(&global_rw_lock);
	rw_unlock(&global_rw_lock);
	rw_wrlock(&global_rw_lock);
	rw_unlock(&global_rw_lock);
#endif
#ifdef POSIX
	pthread_mutex_lock(&queue_lock);
	pthread_mutex_trylock(&queue_lock);
	pthread_mutex_unlock(&queue_lock);
	foo = (void *)&pthread_cond_signal;
	foo = (void *)&pthread_cond_wait;
	foo = (void *)&pthread_cond_timedwait;
	sem_post(&global_sema_lock);
	sem_wait(&global_sema_lock); 
#endif
}
Exemplo n.º 4
0
int
barrier_wait(barrier_t *bar)
{
	pthread_mutex_lock(&bar->bar_lock);

	if (++bar->bar_numin < bar->bar_nthr) {
		pthread_mutex_unlock(&bar->bar_lock);
#if defined(sun)
		sema_wait(&bar->bar_sem);
#else
		sem_wait(&bar->bar_sem);
#endif

		return (0);

	} else {
		int i;

		/* reset for next use */
		bar->bar_numin = 0;
		for (i = 1; i < bar->bar_nthr; i++)
#if defined(sun)
			sema_post(&bar->bar_sem);
#else
			sem_post(&bar->bar_sem);
#endif
		pthread_mutex_unlock(&bar->bar_lock);

		return (1);
	}
}
Exemplo n.º 5
0
Arquivo: mttest.c Projeto: dhaley/dcp
/* sema_global: use a global semaphore to process array's data */
void
sema_global(Workblk *array, struct scripttab *k)
{
#ifdef SOLARIS
	sema_wait(&global_sema_lock); 
#endif
#ifdef POSIX
	sem_wait(&global_sema_lock); 
#endif

	array->ready = gethrtime();
	array->vready = gethrvtime();

	array->compute_ready = array->ready;
	array->compute_vready = array->vready;

	/* do some work on the current array */
	(k->called_func)(&array->list[0]);

	array->compute_done = gethrtime();
	array->compute_vdone = gethrvtime();

#ifdef SOLARIS
	sema_post(&global_sema_lock);
#endif
#ifdef POSIX
	sem_post(&global_sema_lock);
#endif

	/* make another call to preclude tail-call optimization on the unlock */
	(void) gethrtime();
}
Exemplo n.º 6
0
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
{
    u32_t time_needed = 0;
    unsigned int idx;

    LWIP_ASSERT("invalid mbox", sys_mbox_valid(mbox));
    mutex_lock(&mbox->mutex);
    while (cib_avail(&mbox->cib) == 0) {
        sys_sem_t *not_empty = (sys_sem_t *)(&mbox->not_empty);
        mutex_unlock(&mbox->mutex);
        if (timeout != 0) {
            time_needed = sys_arch_sem_wait(not_empty, timeout);
            if (time_needed == SYS_ARCH_TIMEOUT) {
                return SYS_ARCH_TIMEOUT;
            }
        }
        else {
            sys_arch_sem_wait(not_empty, 0);
        }
        mutex_lock(&mbox->mutex);
    }
    idx = cib_get(&mbox->cib);
    if (msg != NULL) {
        *msg = mbox->msgs[idx];
    }
    if (mbox->waiting) {
        sema_post(&mbox->not_full);
    }
    mutex_unlock(&mbox->mutex);
    return time_needed;
}
Exemplo n.º 7
0
hot_err_t hot_sema_Inc(hot_sema_t sema) {
  assert(sema) ;
  
  if (sema_post(&sema->sema))
    return hot_err_Create(0, "hot_sema_Inc: sema_post");
  
  return HOT_OK;	
}
Exemplo n.º 8
0
/*
 * Net VSC on send completion
 */
static void
hv_nv_on_send_completion(netvsc_dev *net_dev, struct vmbus_channel *chan,
    const struct vmbus_chanpkt_hdr *pkt)
{
	const nvsp_msg *nvsp_msg_pkt;
	netvsc_packet *net_vsc_pkt;

	nvsp_msg_pkt = VMBUS_CHANPKT_CONST_DATA(pkt);

	if (nvsp_msg_pkt->hdr.msg_type == nvsp_msg_type_init_complete
		|| nvsp_msg_pkt->hdr.msg_type
			== nvsp_msg_1_type_send_rx_buf_complete
		|| nvsp_msg_pkt->hdr.msg_type
			== nvsp_msg_1_type_send_send_buf_complete
		|| nvsp_msg_pkt->hdr.msg_type
			== nvsp_msg5_type_subchannel) {
		/* Copy the response back */
		memcpy(&net_dev->channel_init_packet, nvsp_msg_pkt,
		    sizeof(nvsp_msg));
		sema_post(&net_dev->channel_init_sema);
	} else if (nvsp_msg_pkt->hdr.msg_type ==
		    nvsp_msg_1_type_send_rndis_pkt_complete) {
		/* Get the send context */
		net_vsc_pkt =
		    (netvsc_packet *)(unsigned long)pkt->cph_xactid;
		if (NULL != net_vsc_pkt) {
			if (net_vsc_pkt->send_buf_section_idx !=
			    NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX) {
				u_long mask;
				int idx;

				idx = net_vsc_pkt->send_buf_section_idx /
				    BITS_PER_LONG;
				KASSERT(idx < net_dev->bitsmap_words,
				    ("invalid section index %u",
				     net_vsc_pkt->send_buf_section_idx));
				mask = 1UL <<
				    (net_vsc_pkt->send_buf_section_idx %
				     BITS_PER_LONG);

				KASSERT(net_dev->send_section_bitsmap[idx] &
				    mask,
				    ("index bitmap 0x%lx, section index %u, "
				     "bitmap idx %d, bitmask 0x%lx",
				     net_dev->send_section_bitsmap[idx],
				     net_vsc_pkt->send_buf_section_idx,
				     idx, mask));
				atomic_clear_long(
				    &net_dev->send_section_bitsmap[idx], mask);
			}
			
			/* Notify the layer above us */
			net_vsc_pkt->compl.send.on_send_completion(chan,
			    net_vsc_pkt->compl.send.send_completion_context);

		}
	}
}
Exemplo n.º 9
0
void FLMAPI f_semSignal(
	F_SEM			hSem)
{
#if defined( FLM_SOLARIS)
	sema_post( (sema_t *)hSem);
#else
	sema_signal( (sema_t *)hSem);
#endif
}
Exemplo n.º 10
0
/*
 * This is the main kvp kernel process that interacts with both user daemon
 * and the host
 */
static void
hv_kvp_send_msg_to_daemon(void)
{
	/* Prepare kvp_msg to be sent to user */
	hv_kvp_convert_hostmsg_to_usermsg();

	/* Send the msg to user via function deamon_read - setting sema */
	sema_post(&kvp_globals.dev_sema);
}
Exemplo n.º 11
0
int
sem_post(sem_t *sem)
{
	int	error;

	if (sem_invalid(sem))
		return (-1);
	if ((error = sema_post((sema_t *)sem)) != 0) {
		errno = error;
		return (-1);
	}
	return (0);
}
Exemplo n.º 12
0
int
release_clearance(int callnumber)
{
	int	which;
	sema_t	*table_sema = NULL;

	(void) thr_getspecific(lookup_state_key, (void**)&which);
	if (which == 0) /* from common pool */ {
		(void) sema_post(&common_sema);
		return (0);
	}

	switch (callnumber) {
		case GETLDAPCONFIG:
			table_sema = &ldap_sema;
			break;
		default:
			logit("Internal Error: release_clearance\n");
			break;
	}
	(void) sema_post(table_sema);

	return (0);
}
Exemplo n.º 13
0
/*
 * This is the main kvp kernel process that interacts with both user daemon
 * and the host
 */
static void
hv_kvp_send_msg_to_daemon(hv_kvp_sc *sc)
{
	struct hv_kvp_msg *hmsg = sc->host_kvp_msg;
	struct hv_kvp_msg *umsg = &sc->daemon_kvp_msg;

	/* Prepare kvp_msg to be sent to user */
	hv_kvp_convert_hostmsg_to_usermsg(hmsg, umsg);

	/* Send the msg to user via function deamon_read - setting sema */
	sema_post(&sc->dev_sema);

	/* We should wake up the daemon, in case it's doing poll() */
	selwakeup(&sc->hv_kvp_selinfo);
}
Exemplo n.º 14
0
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
{
    int idx;

    LWIP_ASSERT("invalid mbox", sys_mbox_valid(mbox));
    mutex_lock(&mbox->mutex);
    if ((idx = cib_put(&mbox->cib)) < 0) {
        mutex_unlock(&mbox->mutex);
        return ERR_MEM;
    }
    mbox->msgs[idx] = msg;
    if (cib_avail(&mbox->cib) == 1) {
        sema_post(&mbox->not_empty);
    }
    mutex_unlock(&mbox->mutex);
    return ERR_OK;
}
Exemplo n.º 15
0
void sys_mbox_post(sys_mbox_t *mbox, void *msg)
{
    int idx;

    LWIP_ASSERT("invalid mbox", sys_mbox_valid(mbox));
    mutex_lock(&mbox->mutex);
    while ((idx = cib_put(&mbox->cib)) < 0) {
        mbox->waiting++;
        mutex_unlock(&mbox->mutex);
        sema_wait_timed(&mbox->not_full, 0);
        mutex_lock(&mbox->mutex);
        mbox->waiting--;
    }
    mbox->msgs[idx] = msg;
    if (cib_avail(&mbox->cib) == 1) {
        sema_post(&mbox->not_empty);
    }
    mutex_unlock(&mbox->mutex);
}
Exemplo n.º 16
0
/*
 * RNDIS filter receive response
 */
static void 
hv_rf_receive_response(rndis_device *device, rndis_msg *response)
{
	rndis_request *request = NULL;
	rndis_request *next_request;
	boolean_t found = FALSE;

	mtx_lock_spin(&device->req_lock);
	request = STAILQ_FIRST(&device->myrequest_list);
	while (request != NULL) {
		/*
		 * All request/response message contains request_id as the
		 * first field
		 */
		if (request->request_msg.msg.init_request.request_id ==
				      response->msg.init_complete.request_id) {
			found = TRUE;
			break;
		}
		next_request = STAILQ_NEXT(request, mylist_entry);
		request = next_request;
	}
	mtx_unlock_spin(&device->req_lock);

	if (found) {
		if (response->msg_len <= sizeof(rndis_msg)) {
			memcpy(&request->response_msg, response,
			    response->msg_len);
		} else {
			if (response->ndis_msg_type == REMOTE_NDIS_RESET_CMPLT) {
				/* Does not have a request id field */
				request->response_msg.msg.reset_complete.status =
				    STATUS_BUFFER_OVERFLOW;
			} else {
				request->response_msg.msg.init_complete.status =
				    STATUS_BUFFER_OVERFLOW;
			}
		}

		sema_post(&request->wait_sema);
	}
}
Exemplo n.º 17
0
void _rtw_up_sema(_sema	*sema)
{

#ifdef PLATFORM_LINUX

	up(sema);

#endif	
#ifdef PLATFORM_FREEBSD
	sema_post(sema);
#endif
#ifdef PLATFORM_OS_XP

	KeReleaseSemaphore(sema, IO_NETWORK_INCREMENT, 1,  FALSE );

#endif

#ifdef PLATFORM_OS_CE
	ReleaseSemaphore(*sema,  1,  NULL );
#endif
}
Exemplo n.º 18
0
int my_sema_post(void *semptr) {
  if (semptr != NULL)
    return (sema_post((sema_t *)semptr));
  else
    return (-1);
}
Exemplo n.º 19
0
void sys_sem_signal(sys_sem_t *sem)
{
    LWIP_ASSERT("invalid semaphor", sys_sem_valid(sem));
    sema_post((sema_t *)sem);
}
/*
 * This is an interrupt callback.  It is called from
 * interrupt context when the adapter has completed the
 * command.  This very generic callback simply stores
 * the command's return value in command->arg and wake's
 * up anyone waiting on the command. 
 */
static void ips_wakeup_callback(ips_command_t *command)
{
	bus_dmamap_sync(command->sc->command_dmatag, command->command_dmamap, 
			BUS_DMASYNC_POSTWRITE);
	sema_post(&command->sc->cmd_sema);
}