Hello osicat-devel
Whilst getting help from John Fremlin for manardb, an issue with osicat arose. Apparently osicat-posix assumes that the return value from mmap is an int when it is a pointer. He noted that mremap is broken too.
a backtrace containing the result:
CL-USER> (manardb:use-mmap-dir "/tmp/manardb/" :if-does-not-exist :create)
The value -134270976 is not of type (UNSIGNED-BYTE 64).
[Condition of type TYPE-ERROR]
Restarts:
0: [ABORT] Return to SLIME's top level.
1: [TERMINATE-THREAD] Terminate this thread (#<THREAD "repl-thread" RUNNING {1003249DB1}>)
Backtrace:
0: (OSICAT-POSIX:MMAP #.(SB-SYS:INT-SAP #X00000000) 4096 3 1 4 0)
1: (MANARDB::MTAGMAP-OPEN #<MANARDB::MTAGMAP >)[:EXTERNAL]
2: (MANARDB:OPEN-ALL-MMAPS)
John Fremlin made me fix the bug by evaluating the following code in osicat-posix:
(DEFCFUN ("mmap_cffi_wrap" MMAP :CONVENTION :CDECL :LIBRARY :DEFAULT)
(ERRNO-WRAPPER :UNSIGNED-LONG :ERROR-PREDICATE (LAMBDA (P) (= P MAP-FAILED)) :RETURN-FILTER MAKE-POINTER)
(START :POINTER)
(LENGTH SIZE)
(PROT :INT)
(FLAGS :INT)
(FD FILE-DESCRIPTOR-DESIGNATOR)
(OFFSET OFF))
cheers,
the madnificent