diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2001-08-28 14:47:48 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 2001-08-28 14:47:48 +0000 |
commit | ddd99c7e5d2f0f8e7364e8521fa7e8308999344e (patch) | |
tree | 3c0158d035a52c0cf185c08c3288c3c76d6718d0 /otherlibs/bigarray | |
parent | c345611817d76ccc3bbd02db1f942774220739f9 (diff) | |
download | ocaml-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/Makefile | 17 | ||||
-rw-r--r-- | otherlibs/bigarray/Makefile.nt | 33 | ||||
-rw-r--r-- | otherlibs/bigarray/bigarray_stubs.c | 46 | ||||
-rw-r--r-- | otherlibs/bigarray/mmap_unix.c | 4 | ||||
-rw-r--r-- | otherlibs/bigarray/mmap_win32.c | 36 |
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)); +} |