/* $Id$ 
 * 
 * Licensed to the Apache Software Foundation (ASF) under one or more 
 * contributor license agreements. See the NOTICE file distributed with  
 * this work for additional information regarding copyright ownership. 
 * The ASF licenses this file to you under the Apache License, Version  
 * 2.0 (the "License"); you may not use this file except in compliance  
 * with the License. You may obtain a copy of the License at 
 * 
 * http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and 
 * limitations under the License. 
 */ 

/*
 * etch_syncobj.h
 * constructors for synchronized objects
 * we separate construction of objects which instantiate mutexes
 * in order to avoid circular header references in collections ,
 */

#ifndef ETCHSYNCOBJ_H
#define ETCHSYNCOBJ_H

#include "etchhash.h"
#include "etch_arrayval.h"

struct etch_hashtable* new_synchronized_hashtable(const int isize);

struct etch_arraylist* new_synchronized_arraylist(const int isize, const int dsize);

struct etch_arraylist* new_synchronized_arraylist_from(etch_arraylist*);


#endif /* #ifndef ETCHSYNCOBJ_H */