summaryrefslogtreecommitdiff
path: root/otherlibs/bigarray
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2001-08-28 14:47:48 +0000
committerXavier Leroy <xavier.leroy@inria.fr>2001-08-28 14:47:48 +0000
commitddd99c7e5d2f0f8e7364e8521fa7e8308999344e (patch)
tree3c0158d035a52c0cf185c08c3288c3c76d6718d0 /otherlibs/bigarray
parentc345611817d76ccc3bbd02db1f942774220739f9 (diff)
downloadocaml-ddd99c7e5d2f0f8e7364e8521fa7e8308999344e.tar.gz
Chargement dynamique de primitives C
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@3677 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'otherlibs/bigarray')
-rw-r--r--otherlibs/bigarray/Makefile17
-rw-r--r--otherlibs/bigarray/Makefile.nt33
-rw-r--r--otherlibs/bigarray/bigarray_stubs.c46
-rw-r--r--otherlibs/bigarray/mmap_unix.c4
-rw-r--r--otherlibs/bigarray/mmap_win32.c36
5 files changed, 80 insertions, 56 deletions
diff --git a/otherlibs/bigarray/Makefile b/otherlibs/bigarray/Makefile
index 50f4ce1562..3f2e81faed 100644
--- a/otherlibs/bigarray/Makefile
+++ b/otherlibs/bigarray/Makefile
@@ -15,9 +15,10 @@
include ../../config/Makefile
CC=$(BYTECC)
-CFLAGS=-I../../byterun -g -O $(BYTECCCOMPOPTS)
+CFLAGS=-I../../byterun -g -O $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS)
CAMLC=../../boot/ocamlrun ../../ocamlc -I ../../stdlib -I ../unix
CAMLOPT=../../boot/ocamlrun ../../ocamlopt -I ../../stdlib -I ../unix
+MKLIB=../../tools/ocamlmklib
C_OBJS=bigarray_stubs.o mmap_unix.o
@@ -28,19 +29,17 @@ all: libbigarray.a bigarray.cma
allopt: libbigarray.a bigarray.cmxa
libbigarray.a: $(C_OBJS)
- rm -f libbigarray.a
- ar rc libbigarray.a $(C_OBJS)
- $(RANLIB) libbigarray.a
+ $(MKLIB) -o bigarray $(C_OBJS)
bigarray.cma: $(CAML_OBJS)
- $(CAMLC) -a -linkall -custom -o bigarray.cma \
- $(CAML_OBJS) -cclib -lbigarray
+ $(MKLIB) -ocamlc '$(CAMLC)' -linkall -o bigarray $(CAML_OBJS)
bigarray.cmxa: $(CAML_OBJS:.cmo=.cmx)
- $(CAMLOPT) -a -linkall -o bigarray.cmxa \
- $(CAML_OBJS:.cmo=.cmx) -cclib -lbigarray
+ $(MKLIB) -ocamlopt '$(CAMLOPT)' -linkall -o bigarray \
+ $(CAML_OBJS:.cmo=.cmx)
install:
+ test -f libbigarray.so && cp libbigarray.so $(LIBDIR)
cp bigarray.cmi bigarray.mli libbigarray.a bigarray.cma $(LIBDIR)
cd $(LIBDIR); $(RANLIB) libbigarray.a
cp bigarray.h $(LIBDIR)/caml/bigarray.h
@@ -53,7 +52,7 @@ partialclean:
rm -f *.cm*
clean: partialclean
- rm -f libbigarray.a *.o bigarray.a
+ rm -f libbigarray.* *.o bigarray.a
.SUFFIXES: .ml .mli .cmo .cmi .cmx
diff --git a/otherlibs/bigarray/Makefile.nt b/otherlibs/bigarray/Makefile.nt
index c3f6970f96..9525c30381 100644
--- a/otherlibs/bigarray/Makefile.nt
+++ b/otherlibs/bigarray/Makefile.nt
@@ -15,7 +15,7 @@
include ..\..\config\Makefile.nt
CC=$(BYTECC)
-CFLAGS=-I..\..\byterun -I..\win32unix $(BYTECCCOMPOPTS)
+CFLAGS=-I..\..\byterun -I..\win32unix
CAMLC=..\..\boot\ocamlrun ..\..\ocamlc -I ..\..\stdlib -I ..\win32unix
CAMLOPT=..\..\boot\ocamlrun ..\..\ocamlopt -I ..\..\stdlib -I ..\win32unix
@@ -23,24 +23,29 @@ C_OBJS=bigarray_stubs.obj mmap_win32.obj
CAML_OBJS=bigarray.cmo
-all: libbigarray.lib bigarray.cma
+all: libbigarray.dll libbigarray.lib bigarray.cma
allopt: libbigarray.lib bigarray.cmxa
-libbigarray.lib: $(C_OBJS)
- rm -f libbigarray.lib
- $(MKLIB)libbigarray.lib $(C_OBJS)
+libbigarray.dll: $(C_OBJS:.obj=.dobj)
+ link /nologo /dll /out:libbigarray.dll /implib:tmp.lib \
+ $(C_OBJS:.obj=.dobj) ..\..\byterun\ocamlrun.lib
+ rm tmp.*
+
+libbigarray.lib: $(C_OBJS:.obj=.sobj)
+ rm -f libunix.lib
+ $(MKLIB)libbigarray.lib $(C_OBJS:.obj=.sobj)
bigarray.cma: $(CAML_OBJS)
- $(CAMLC) -a -linkall -custom -o bigarray.cma \
- $(CAML_OBJS) -cclib -lbigarray
+ $(CAMLC) -a -linkall -o bigarray.cma $(CAML_OBJS) -cclib -lbigarray
bigarray.cmxa: $(CAML_OBJS:.cmo=.cmx)
$(CAMLOPT) -a -linkall -o bigarray.cmxa \
$(CAML_OBJS:.cmo=.cmx) -cclib -lbigarray
install:
- cp bigarray.cmi bigarray.mli libbigarray.lib bigarray.cma $(LIBDIR)
+ cp libbigarray.dll libbigarray.lib $(LIBDIR)
+ cp bigarray.cmi bigarray.mli bigarray.cma $(LIBDIR)
cp bigarray.h $(LIBDIR)/caml/bigarray.h
installopt:
@@ -50,9 +55,9 @@ partialclean:
rm -f *.cm*
clean: partialclean
- rm -f libbigarray.lib *.obj
+ rm -f *.dll *.lib *.dobj *.sobj
-.SUFFIXES: .ml .mli .cmo .cmi .cmx
+.SUFFIXES: .ml .mli .cmo .cmi .cmx .dobj .sobj
.mli.cmi:
$(CAMLC) -c $(COMPFLAGS) $<
@@ -63,6 +68,14 @@ clean: partialclean
.ml.cmx:
$(CAMLOPT) -c $(COMPFLAGS) $<
+.c.dobj:
+ $(BYTECC) $(DLLCCCOMPOPTS) $(CFLAGS) -c $<
+ mv $*.obj $*.dobj
+
+.c.sobj:
+ $(BYTECC) $(BYTECCCOMPOPTS) $(CFLAGS) -c $<
+ mv $*.obj $*.sobj
+
depend:
gcc -MM $(CFLAGS) *.c > .depend
..\..\boot\ocamlrun ..\..\tools\ocamldep *.mli *.ml >> .depend
diff --git a/otherlibs/bigarray/bigarray_stubs.c b/otherlibs/bigarray/bigarray_stubs.c
index 3546bad863..5d22e41d9d 100644
--- a/otherlibs/bigarray/bigarray_stubs.c
+++ b/otherlibs/bigarray/bigarray_stubs.c
@@ -126,7 +126,7 @@ value alloc_bigarray_dims(int flags, int num_dims, void * data, ...)
/* Allocate a bigarray from Caml */
-value bigarray_create(value vkind, value vlayout, value vdim)
+CAMLprim value bigarray_create(value vkind, value vlayout, value vdim)
{
long dim[MAX_NUM_DIMS];
mlsize_t num_dims;
@@ -215,19 +215,19 @@ value bigarray_get_N(value vb, value * vind, int nind)
}
}
-value bigarray_get_1(value vb, value vind1)
+CAMLprim value bigarray_get_1(value vb, value vind1)
{
return bigarray_get_N(vb, &vind1, 1);
}
-value bigarray_get_2(value vb, value vind1, value vind2)
+CAMLprim value bigarray_get_2(value vb, value vind1, value vind2)
{
value vind[2];
vind[0] = vind1; vind[1] = vind2;
return bigarray_get_N(vb, vind, 2);
}
-value bigarray_get_3(value vb, value vind1, value vind2, value vind3)
+CAMLprim value bigarray_get_3(value vb, value vind1, value vind2, value vind3)
{
value vind[3];
vind[0] = vind1; vind[1] = vind2; vind[2] = vind3;
@@ -235,7 +235,7 @@ value bigarray_get_3(value vb, value vind1, value vind2, value vind3)
}
#if 0
-value bigarray_get_4(value vb, value vind1, value vind2,
+CAMLprim value bigarray_get_4(value vb, value vind1, value vind2,
value vind3, value vind4)
{
value vind[4];
@@ -243,7 +243,7 @@ value bigarray_get_4(value vb, value vind1, value vind2,
return bigarray_get_N(vb, vind, 4);
}
-value bigarray_get_5(value vb, value vind1, value vind2,
+CAMLprim value bigarray_get_5(value vb, value vind1, value vind2,
value vind3, value vind4, value vind5)
{
value vind[5];
@@ -252,7 +252,7 @@ value bigarray_get_5(value vb, value vind1, value vind2,
return bigarray_get_N(vb, vind, 5);
}
-value bigarray_get_6(value vb, value vind1, value vind2,
+CAMLprim value bigarray_get_6(value vb, value vind1, value vind2,
value vind3, value vind4, value vind5, value vind6)
{
value vind[6];
@@ -262,7 +262,7 @@ value bigarray_get_6(value vb, value vind1, value vind2,
}
#endif
-value bigarray_get_generic(value vb, value vind)
+CAMLprim value bigarray_get_generic(value vb, value vind)
{
return bigarray_get_N(vb, &Field(vind, 0), Wosize_val(vind));
}
@@ -309,19 +309,19 @@ static value bigarray_set_aux(value vb, value * vind, long nind, value newval)
return Val_unit;
}
-value bigarray_set_1(value vb, value vind1, value newval)
+CAMLprim value bigarray_set_1(value vb, value vind1, value newval)
{
return bigarray_set_aux(vb, &vind1, 1, newval);
}
-value bigarray_set_2(value vb, value vind1, value vind2, value newval)
+CAMLprim value bigarray_set_2(value vb, value vind1, value vind2, value newval)
{
value vind[2];
vind[0] = vind1; vind[1] = vind2;
return bigarray_set_aux(vb, vind, 2, newval);
}
-value bigarray_set_3(value vb, value vind1, value vind2, value vind3,
+CAMLprim value bigarray_set_3(value vb, value vind1, value vind2, value vind3,
value newval)
{
value vind[3];
@@ -330,7 +330,7 @@ value bigarray_set_3(value vb, value vind1, value vind2, value vind3,
}
#if 0
-value bigarray_set_4(value vb, value vind1, value vind2,
+CAMLprim value bigarray_set_4(value vb, value vind1, value vind2,
value vind3, value vind4, value newval)
{
value vind[4];
@@ -338,7 +338,7 @@ value bigarray_set_4(value vb, value vind1, value vind2,
return bigarray_set_aux(vb, vind, 4, newval);
}
-value bigarray_set_5(value vb, value vind1, value vind2,
+CAMLprim value bigarray_set_5(value vb, value vind1, value vind2,
value vind3, value vind4, value vind5, value newval)
{
value vind[5];
@@ -347,7 +347,7 @@ value bigarray_set_5(value vb, value vind1, value vind2,
return bigarray_set_aux(vb, vind, 5, newval);
}
-value bigarray_set_6(value vb, value vind1, value vind2,
+CAMLprim value bigarray_set_6(value vb, value vind1, value vind2,
value vind3, value vind4, value vind5,
value vind6, value newval)
{
@@ -363,14 +363,14 @@ value bigarray_set_N(value vb, value * vind, int nargs)
}
#endif
-value bigarray_set_generic(value vb, value vind, value newval)
+CAMLprim value bigarray_set_generic(value vb, value vind, value newval)
{
return bigarray_set_aux(vb, &Field(vind, 0), Wosize_val(vind), newval);
}
/* Return the number of dimensions of a big array */
-value bigarray_num_dims(value vb)
+CAMLprim value bigarray_num_dims(value vb)
{
struct caml_bigarray * b = Bigarray_val(vb);
return Val_long(b->num_dims);
@@ -378,7 +378,7 @@ value bigarray_num_dims(value vb)
/* Return the n-th dimension of a big array */
-value bigarray_dim(value vb, value vn)
+CAMLprim value bigarray_dim(value vb, value vn)
{
struct caml_bigarray * b = Bigarray_val(vb);
long n = Long_val(vn);
@@ -700,7 +700,7 @@ static void bigarray_update_proxy(struct caml_bigarray * b1,
/* Slicing */
-value bigarray_slice(value vb, value vind)
+CAMLprim value bigarray_slice(value vb, value vind)
{
struct caml_bigarray * b = Bigarray_val(vb);
long index[MAX_NUM_DIMS];
@@ -742,7 +742,7 @@ value bigarray_slice(value vb, value vind)
/* Extracting a sub-array of same number of dimensions */
-value bigarray_sub(value vb, value vofs, value vlen)
+CAMLprim value bigarray_sub(value vb, value vofs, value vlen)
{
struct caml_bigarray * b = Bigarray_val(vb);
long ofs = Long_val(vofs);
@@ -782,7 +782,7 @@ value bigarray_sub(value vb, value vofs, value vlen)
/* Copying a big array into another one */
-value bigarray_blit(value vsrc, value vdst)
+CAMLprim value bigarray_blit(value vsrc, value vdst)
{
struct caml_bigarray * src = Bigarray_val(vsrc);
struct caml_bigarray * dst = Bigarray_val(vdst);
@@ -807,7 +807,7 @@ value bigarray_blit(value vsrc, value vdst)
/* Filling a big array with a given value */
-value bigarray_fill(value vb, value vinit)
+CAMLprim value bigarray_fill(value vb, value vinit)
{
struct caml_bigarray * b = Bigarray_val(vb);
long num_elts = bigarray_num_elts(b);
@@ -872,7 +872,7 @@ value bigarray_fill(value vb, value vinit)
/* Reshape an array: change dimensions and number of dimensions, preserving
array contents */
-value bigarray_reshape(value vb, value vdim)
+CAMLprim value bigarray_reshape(value vb, value vdim)
{
struct caml_bigarray * b = Bigarray_val(vb);
long dim[MAX_NUM_DIMS];
@@ -904,7 +904,7 @@ value bigarray_reshape(value vb, value vdim)
/* Initialization */
-value bigarray_init(value unit)
+CAMLprim value bigarray_init(value unit)
{
register_custom_operations(&bigarray_ops);
return Val_unit;
diff --git a/otherlibs/bigarray/mmap_unix.c b/otherlibs/bigarray/mmap_unix.c
index dcf032f78a..291563d78f 100644
--- a/otherlibs/bigarray/mmap_unix.c
+++ b/otherlibs/bigarray/mmap_unix.c
@@ -36,8 +36,8 @@ extern int bigarray_element_size[]; /* from bigarray_stubs.c */
#define MAP_FAILED ((void *) -1)
#endif
-value bigarray_map_file(value vfd, value vkind, value vlayout,
- value vshared, value vdim)
+CAMLprim value bigarray_map_file(value vfd, value vkind, value vlayout,
+ value vshared, value vdim)
{
int fd, flags, major_dim, shared;
long num_dims, i;
diff --git a/otherlibs/bigarray/mmap_win32.c b/otherlibs/bigarray/mmap_win32.c
index 98b10f8d0c..d3186e73a1 100644
--- a/otherlibs/bigarray/mmap_win32.c
+++ b/otherlibs/bigarray/mmap_win32.c
@@ -13,6 +13,7 @@
/* $Id$ */
#include <stddef.h>
+#include <stdio.h>
#include <string.h>
#include "bigarray.h"
#include "custom.h"
@@ -23,8 +24,10 @@
extern int bigarray_element_size[]; /* from bigarray_stubs.c */
-value bigarray_map_file(value vfd, value vkind, value vlayout,
- value vshared, value vdim)
+static void bigarray_sys_error(void);
+
+CAMLprim value bigarray_map_file(value vfd, value vkind, value vlayout,
+ value vshared, value vdim)
{
HANDLE fd, fmap;
int flags, major_dim, mode, perm;
@@ -51,9 +54,9 @@ value bigarray_map_file(value vfd, value vkind, value vlayout,
}
/* Determine file size */
currpos = SetFilePointer(fd, 0, NULL, FILE_CURRENT);
- if (currpos == -1) { _dosmaperr(GetLastError()); sys_error(NO_ARG); }
+ if (currpos == -1) bigarray_sys_error();
file_size = SetFilePointer(fd, 0, NULL, FILE_END);
- if (file_size == -1) { _dosmaperr(GetLastError()); sys_error(NO_ARG); }
+ if (file_size == -1) bigarray_sys_error();
/* Determine array size in bytes (or size of array without the major
dimension if that dimension wasn't specified) */
array_size = bigarray_element_size[flags & BIGARRAY_KIND_MASK];
@@ -78,14 +81,10 @@ value bigarray_map_file(value vfd, value vkind, value vlayout,
mode = FILE_MAP_COPY;
}
fmap = CreateFileMapping(fd, NULL, perm, 0, array_size, NULL);
- if (fmap == NULL) {
- printf("CreateFileMapping failed, err %d\n", GetLastError());
- _dosmaperr(GetLastError()); sys_error(NO_ARG); }
+ if (fmap == NULL) bigarray_sys_error();
/* Map the mapping in memory */
addr = MapViewOfFile(fmap, mode, 0, 0, array_size);
- if (addr == NULL) {
- printf("MapViewOfFile failed, err %d\n", GetLastError());
- _dosmaperr(GetLastError()); sys_error(NO_ARG); }
+ if (addr == NULL) bigarray_sys_error();
/* Close the file mapping */
CloseHandle(fmap);
/* Build and return the Caml bigarray */
@@ -97,6 +96,19 @@ void bigarray_unmap_file(void * addr, unsigned long len)
UnmapViewOfFile(addr);
}
-
-
+static void bigarray_sys_error(void)
+{
+ char buffer[512];
+ unsigned long errnum;
+ errnum = GetLastError();
+ if (!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ errnum,
+ 0,
+ buffer,
+ sizeof(buffer),
+ NULL))
+ sprintf(buffer, "Unknown error %d\n", errnum);
+ raise_sys_error(copy_string(buffer));
+}