Net-Curl

 view release on metacpan or  search on metacpan

Curl_Share.xsh  view on Meta::CPAN

perl_curl_share_delete( pTHX_ perl_curl_share_t *share )
{
#ifdef USE_ITHREADS
	long i;

	MUTEX_LOCK( &share->mutex_threads );
	i = --share->threads;
	MUTEX_UNLOCK( &share->mutex_threads );

	/* some other thread is using it */
	if ( i )
		return;
#endif

	/* this may trigger some callbacks */
	curl_share_cleanup( share->handle );

#ifdef USE_ITHREADS
	for ( i = CURL_LOCK_DATA_NONE; i < CURL_LOCK_DATA_LAST; i++ )
		MUTEX_DESTROY( &(share->mutex[ i ]) );
	MUTEX_DESTROY( &share->mutex_threads );
#endif

	Safefree( share );
}

static int
perl_curl_share_magic_free( pTHX_ SV *sv, MAGIC *mg )
{
	perl_curl_share_t *share = (perl_curl_share_t *) mg->mg_ptr;
	if ( share ) {
		perl_curl_share_delete( aTHX_ share );
	}
	return 0;
}

static MGVTBL perl_curl_share_vtbl = {
	NULL, NULL, NULL, NULL
	,perl_curl_share_magic_free
	,NULL
	,perl_curl_share_magic_dup
#ifdef MGf_LOCAL
	,NULL
#endif
};


MODULE = Net::Curl	PACKAGE = Net::Curl::Share

INCLUDE: const-share-xs.inc

PROTOTYPES: ENABLE

void
new( sclass="Net::Curl::Share", base=HASHREF_BY_DEFAULT )
	const char *sclass
	SV *base
	PREINIT:
		perl_curl_share_t *share;
		HV *stash;
	PPCODE:
		if ( ! SvOK( base ) || ! SvROK( base ) )
			croak( "object base must be a valid reference\n" );

		share = perl_curl_share_new( aTHX );
		perl_curl_setptr( aTHX_ base, &perl_curl_share_vtbl, share );

		stash = gv_stashpv( sclass, 0 );
		ST(0) = sv_bless( base, stash );

		share->perl_self = NULL;

		XSRETURN(1);


void
setopt( share, option, value )
	Net::Curl::Share share
	int option
	SV * value
	PREINIT:
		CURLSHcode ret1 = CURLSHE_OK, ret2 = CURLSHE_OK;
	CODE:
		switch ( option ) {
			case CURLSHOPT_LOCKFUNC:
			case CURLSHOPT_UNLOCKFUNC:
			case CURLSHOPT_USERDATA:
				croak( "Lockling is implemented internally" );
				break;
			case CURLSHOPT_SHARE:
			case CURLSHOPT_UNSHARE:
				ret1 = curl_share_setopt( share->handle,
					option, (long) SvIV( value ) );
				break;
			default:
				ret1 = CURLSHE_BAD_OPTION;
				break;
		};
		if ( ret1 != CURLSHE_OK || ( ret1 = ret2 ) != CURLSHE_OK )
			die_code( "Share", ret1 );


SV *
strerror( ... )
	PROTOTYPE: $;$
	PREINIT:
		const char *errstr;
	CODE:
		if ( items < 1 || items > 2 )
			croak( "Usage: Net::Curl::Share::strerror( [share], errnum )" );
		errstr = curl_share_strerror( SvIV( ST( items - 1 ) ) );
		RETVAL = newSVpv( errstr, 0 );
	OUTPUT:
		RETVAL



( run in 0.778 second using v1.01-cache-2.11-cpan-5511b514fd6 )