Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • 22:41
    straight-shoota milestoned #12167
  • 22:36
    beta-ziliani labeled #12180
  • 22:35
    beta-ziliani milestoned #12182
  • 22:32
    beta-ziliani milestoned #12169
  • 22:11
    beta-ziliani milestoned #12179
  • 18:44
    Blacksmoke16 labeled #12182
  • 18:44
    Blacksmoke16 labeled #12182
  • 18:44
    Blacksmoke16 labeled #12180
  • 18:44
    Blacksmoke16 labeled #12180
  • 18:41
    asterite opened #12182
  • 18:39
    ThatsJustCheesy labeled #12181
  • 18:39
    ThatsJustCheesy opened #12181
  • 18:10
    asterite ready_for_review #12169
  • 18:09
    asterite edited #12180
  • 18:08
    asterite opened #12180
  • 18:04
    asterite synchronize #12169
  • 17:57
    asterite ready_for_review #12174
  • 13:36
    asterite synchronize #12179
  • 13:36
    asterite synchronize #12179
  • 13:34
    asterite labeled #12179
Ali Naqvi
@naqvis
@didactic-drunk Pointer(UInt8) with signed value? how can that happen?
From IRC (bridge bot)
@FromIRC
<yxhuvud> @naqvis: -1 would be the error code of mmap.
Ali Naqvi
@naqvis
point i'm making is unsigned int can't have signed values, so pointer type he is using is wrong
From IRC (bridge bot)
@FromIRC
<yxhuvud> I mean, it is pointing to an uint8. But the address ffffffffffffffff is clearly not a pointer as it isn't a valid address.
Ali Naqvi
@naqvis
in that case shouldn't the Pointer#null? be used to validate the pointer?
From IRC (bridge bot)
@FromIRC
<yxhuvud> but it isn't a null pointer.
<yxhuvud> (unless the machine is very weird and happen to define ffffffffffffffff to be null)
Ali Naqvi
@naqvis
true but 0xffffffffffffffff is normally segfault
so either that is a dangling pointer or some other issues
Quinton Miller
@HertzDevil
c libraries have this weird habit of casting special values to void* directly
From IRC (bridge bot)
@FromIRC
<yxhuvud> No, it is the return code from a syscall. It is very common to let negative result values indicate error status and positive be some other type.
Quinton Miller
@HertzDevil
including posix's c libraries
or should i say api
From IRC (bridge bot)
@FromIRC
<yxhuvud> Yes. And io_uring and a bunch of others.
Quinton Miller
@HertzDevil
so @naqvis it is not so much an "issue" as it is part of c's tradition
Ali Naqvi
@naqvis
:P , yeah and C do that for reference types
i mean for FFI where you know C is returning a reference then isn't out a better choice?
From IRC (bridge bot)
@FromIRC
<yxhuvud> Not really an option for mmap.
Ali Naqvi
@naqvis
just looked into mmap manpage :P
@didactic-drunk you can do a comparison against Pointer(Void).new(-1)
Quinton Miller
@HertzDevil
for the record, that constructor calls -1.to_u64!
Ali Naqvi
@naqvis
Quinton Miller
@HertzDevil
well since crystal always maps Void to Nil you can "dereference" any Pointer(Void) and it'll be nil
0xffff_ffff_ffff_ffff is definitely -1.to_u64!
Ali Naqvi
@naqvis
but isn't Pointer(Void).new(-1) equivalent to C (void *) -1?
Quinton Miller
@HertzDevil
iso c says nothing about the size of a void*
crystal more or less defines the pointer size to always be 8 bytes
From IRC (bridge bot)
@FromIRC
<yxhuvud> hertzdevil: not only that, iso c doesn't even define what the value of a null pointer actually is.
Quinton Miller
@HertzDevil
0 is definitely not a null pointer on cc65 targetting the nes
Ali Naqvi
@naqvis

test.c

void* test() {
  return ((void *) -1);
}

test.cr

@[Link(ldflags: "-L#{__DIR__}/ -ltest.o ")]
lib Test
  fun test : Void*
end

p! Test.test == Pointer(Void).new(-1) # => true
Quinton Miller
@HertzDevil
that's due to the abi, not the c standard
Ali Naqvi
@naqvis
yeah true, but this does answer the original question on how to find out if mmap failed
Quinton Miller
@HertzDevil
it will break silently if c's void* is smaller than crystal's Pointer(Void) and zero extension is performed instead of sign extension
Ali Naqvi
@naqvis

https://man7.org/linux/man-pages/man2/mmap.2.html

On error, the value MAP_FAILED (that is, (void *) -1) is returned, and errno is set to indicate the error.

Quinton Miller
@HertzDevil
what's doable is still doing that and then comparing your pointer to the return value of test instead
and not to a Pointer(Void) created in crystal
for portability
Ali Naqvi
@naqvis
but invoking FFI, crystal is yielding the same result as it do for Pointer(Void)
p! Test.test # => Pointer(Void)@0xffffffffffffffff
is crystal doing some conversions behind the scenes?
didactic-drunk
@didactic-drunk
I think 0x0 is a valid mapping/success return value for mmap so -1 is used.
Ali Naqvi
@naqvis
yeah, make sense
didactic-drunk
@didactic-drunk
Will Pointer(UInt8).new(-1) end up optimized to a constant single value or should I store a copy for comparison?
Ali Naqvi
@naqvis
should be same for each invocation
as we are giving the same address
but for easy maintenance, better to have constant defined like MMAP_FAILED
Thore Bödecker
@foxxx0
Hi, I'm trying to spawn a long-running process in the background that occasionally prints something on stdout. i want to have that Fiber blocking until the next line on stdout, which works fine using #gets on the stdout pipe. however, as soon as this fiber is part of my multi-fiber application, the other fibers seem to be blocked too
source code with the problematic fiber highlighted: https://paste.foxxx0.de/ngH/crystal#n101
didactic-drunk
@didactic-drunk
Is it possible to have multiple flags type params filled using symbols? https://carc.in/#/r/bbk7
George Dietrich
@Blacksmoke16
@didactic-drunk https://carc.in/#/r/bbkt