Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 8 Mar 2010 19:00:17 GMT
From:      Sam Robb <samrobb@averesystems.com>
To:        freebsd-threads@FreeBSD.org
Subject:   Re: threads/144558: Repeated calls to __rpc_createerr allocates multiple thread-specific data slots
Message-ID:  <201003081900.o28J0H6n081057@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR threads/144558; it has been noted by GNATS.

From: Sam Robb <samrobb@averesystems.com>
To: bug-followup@FreeBSD.org,
 Sam Robb <samrobb@averesystems.com>
Cc:  
Subject: Re: threads/144558: Repeated calls to __rpc_createerr allocates multiple thread-specific data slots
Date: Mon, 8 Mar 2010 13:36:16 -0500

 Example program that shows repeated allocation of thread-specific data =
 slots caused by calling clnt_pcreateerror() from a thread.
 
 #include <netinet/in.h>
 #include <rpc/rpc.h>
 #include <rpc/clnt.h>
 #include <rpcsvc/rex.h>
 #include <stdio.h>
 #include <assert.h>
 #include <stdlib.h>
 
 void *
 rce_test(void * arg)
 {
 	struct sockaddr_in addr;
 	int i =3D 0;
 	pthread_key_t thr_key_start =3D -1;
 	pthread_key_t thr_key_end =3D -1;
 	int * pdata =3D malloc(sizeof(int));
 
 	pthread_key_create(&thr_key_start, pdata);
 	printf("thr_key_start =3D %d\n", thr_key_start);
 
 	for (i =3D 0; i <=3D 25 ; i++) {
 		CLIENT * client =3D NULL;
 		char buf[256];
 		pthread_key_t thr_key_intermediate =3D -1;
 
 		sprintf(buf, "Call #%d", i);
 		client =3D clnt_create("127.0.0.2", REXPROG, REXVERS, =
 "udp");
 		clnt_pcreateerror(buf);
 
 		pthread_key_create(&thr_key_intermediate, pdata);
 		printf("thr_key_intermediate =3D %d\n", =
 thr_key_intermediate);
 
 		if (client) {
 			clnt_destroy(client);
 		}
 	}
 
 	pthread_key_create(&thr_key_end, pdata);
 	printf("thr_key_end =3D %d\n", thr_key_end);
 
 	return pdata;
 }
 
 int main(int argc, char** argv)
 {
         pthread_t       thread;
         void            *result;
         pthread_attr_t  attr =3D 0;
         int             res =3D 0;
 
         res =3D pthread_create(&thread, &attr, rce_test, NULL);
         assert(res =3D=3D 0);
 
         res =3D pthread_join(thread, &result);
         assert(res =3D=3D 0);
 
 	return 0;
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003081900.o28J0H6n081057>