packages feed

interprocess-0.1.0.0: include/SharedPtr.h

#ifndef __HSSHAREDPTR_H__
#define __HSSHAREDPTR_H__

#include <stddef.h>
#include "HsFFI.h"
#include "MachDeps.h"
#include "SharedObjectName.h"

#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) || defined(mingw32_HOST_OS)
#include <windows.h>
typedef struct SharedMutex {
  SharedObjectName mutexName;
} SharedMutex;
#else
#include <pthread.h>
typedef struct SharedMutex {
  pthread_mutex_t     mutVal;
  pthread_mutexattr_t mutAttr;
} SharedMutex;
#endif

typedef struct SharedAllocator SharedAllocator;
// Internal pointer representation is a single word;
typedef HsWord SharedPtr;

// Create a new memory allocator
//   Returns NULL on failure
SharedAllocator *shared_createAllocator();
// Create a new memory allocator for an existing memory pool
//   Returns NULL on failure
SharedAllocator *shared_lookupAllocator(const char *storeName);
// Destroy a memory allocator.
// The allocator keeps a number of its instances;
// If you create+lookup an allocator N times, you need to destroy it N times.
// Actual desctuction of shared data happens only on the last usage.
void  shared_destroyAllocator(SharedAllocator *aptr);
// Get shared store name, to pass it to another process and lookup an allocator.
char *shared_getStoreName(SharedAllocator *aptr);
// Convert a pointer to a tagged portable shared pointer.
// The result pointer cannot be used directly, but can be transfered between
// different memory spaces.
SharedPtr shared_ptrToShPtr(SharedAllocator *aptr, void     *ptr);
// May return NULL on failure.
void     *shared_shPtrToPtr(SharedAllocator *aptr, SharedPtr ptr);

// Allocate memory.
//  Memory is aligned to page size or closest bigger power of two to the allocation size.
//  Returns NULL on failure.
void *shared_malloc(SharedAllocator *aptr, size_t size);
void *shared_realloc(SharedAllocator *aptr, void *ptr, size_t size);
void  shared_free(SharedAllocator *aptr, void *ptr);




void _SharedMutex_init(SharedMutex *mptr, void **privateMutexHandle, const int createNew);
void _SharedMutex_destroy(SharedMutex *mptr, void **privateMutexHandle);
int _SharedMutex_lock(SharedMutex *mptr, void **privateMutexHandle);
int _SharedMutex_unlock(SharedMutex *mptr, void **privateMutexHandle);
HsPtr _store_alloc(const char *memBlockName, void **privateStoreHandle, size_t size);
void _store_free(const char *memBlockName, void **privateStoreHandle, HsPtr addr, size_t size, _Bool unlinkToo);


#endif /* __HSSHAREDPTR_H__ */