2010-06-03 22:46:59 +00:00
|
|
|
/* this header file comes from libowfat, http://www.fefe.de/libowfat/ */
|
2009-03-12 21:32:43 +00:00
|
|
|
#ifndef IARRAY_H
|
|
|
|
#define IARRAY_H
|
|
|
|
|
2009-04-09 18:03:38 +00:00
|
|
|
#warning DO NOT USE THIS YET. It may look thread-safe but it is not!
|
|
|
|
|
2009-03-12 21:32:43 +00:00
|
|
|
#include "uint64.h"
|
|
|
|
#include <stddef.h>
|
2012-02-24 02:00:52 +00:00
|
|
|
#ifdef __MINGW32__
|
|
|
|
#include <windows.h>
|
|
|
|
#else
|
2009-03-12 21:32:43 +00:00
|
|
|
#include <pthread.h>
|
2012-02-24 02:00:52 +00:00
|
|
|
#endif
|
2009-03-12 21:32:43 +00:00
|
|
|
|
|
|
|
/* this is an indirect array; it only reallocs the indirect index, not
|
|
|
|
* the whole array. The actual data does not move. So there is no need
|
|
|
|
* to lock the array for read accesses. */
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
char** pages;
|
|
|
|
size_t elemsize,pagefence,elemperpage,bytesperpage;
|
|
|
|
/* pagefence is the number of pages + 1,
|
|
|
|
* i.e. the first out of bounds index in "pages" */
|
2012-02-24 02:00:52 +00:00
|
|
|
#ifdef __MINGW32__
|
|
|
|
CRITICAL_SECTION cs;
|
|
|
|
#else
|
2009-03-12 21:32:43 +00:00
|
|
|
pthread_mutex_t m;
|
2012-02-24 02:00:52 +00:00
|
|
|
#endif
|
2009-03-12 21:32:43 +00:00
|
|
|
} iarray;
|
|
|
|
|
|
|
|
void iarray_init(iarray* ia,size_t elemsize);
|
|
|
|
void* iarray_get(iarray* ia,size_t pos);
|
|
|
|
void* iarray_allocate(iarray* ia,size_t pos);
|
|
|
|
|
|
|
|
/* WARNING: do not use the array during or after iarray_free, make sure
|
|
|
|
* no threads are potentially doing anything with the iarray while it is
|
|
|
|
* being freed! */
|
|
|
|
void iarray_free(iarray* ia);
|
|
|
|
|
|
|
|
#endif
|