Print

Print


I have found a number of 'small' memory leaks in XrdClient that are 
coming from 'pthread_mutexattr_init'.  The problem is once the mutex 
attributes has been used, 'pthread_mutexattr_destroy' is not being 
called.  I'd suggest wrapping the two in a small class


	class XrdClientMutexAttr {
		pthread_mutexattr_t fAttr;
		bool fOK;
	public:
		enum  Type {RECURSIVE, NONRECURSIVE};
		XrdClientMutexAttr(Type iType = NONRECURSIVE) : fOK(true) {
			int rc = pthread_mutexattr_init(&fAttr);
			if( rc ) {
				fOK = false;
			}
			if(RECURSIVE == iType  ) {
				rc = pthread_mutexattr_settype(&fAttr, PTHREAD_MUTEX_RECURSIVE);
			}
			if( rc ) {
				fOK = false;
				pthread_mutexattr_destroy(&fAttr);
			}
		}
		~XrdClientMutexAttr() {
			if (fOK)  { pthread_mutexattr_destroy(&fAttr); }
		}
		pthread_mutexattr_t* get() { return fOK ? &fAttr : 
((pthread_mutexattr_t*)0) ; }

		bool initialize(pthread_mutex_t* iMutex) {
			if( fOK && (0 == pthread_mutex_init(iMutex, get() ) ) ) {
				return true;
			}
			return false;
		}
	};


It would be nicer to user exceptions rather than 'fOK'.


This would allow the code to be reduced to

    // Initialization of lock mutex
    XrdClientMutexAttr attr(XrdClientMutexAttr::RECURSIVE);
    if( attr.initialize( &fMutex ) ) {
       Error("InputBuffer",
             "Can't create mutex: out of system resources.");
       abort();
    }
		
	Chris