diff --git a/zig-impl/crystal/some-crystal-app/makefile b/zig-impl/crystal/some-crystal-app/makefile index 68601f2..f62e8a0 100644 --- a/zig-impl/crystal/some-crystal-app/makefile +++ b/zig-impl/crystal/some-crystal-app/makefile @@ -5,5 +5,11 @@ VG_OPTS = --leak-check=full -v VG_OPTS += --suppressions=valgrind.suppressions VG_OPTS += --gen-suppressions=all +build: + CRYSTAL_LIBRARY_PATH=$(LDPATH) shards build + valgrind: LD_LIBRARY_PATH=$(LDPATH) valgrind $(VG_OPTS) $(SRC) + +run: + LD_LIBRARY_PATH=$(LDPATH) $(SRC) diff --git a/zig-impl/crystal/some-crystal-app/src/some-crystal-app.cr b/zig-impl/crystal/some-crystal-app/src/some-crystal-app.cr index 68b8e72..f3af131 100644 --- a/zig-impl/crystal/some-crystal-app/src/some-crystal-app.cr +++ b/zig-impl/crystal/some-crystal-app/src/some-crystal-app.cr @@ -12,34 +12,27 @@ lib LibIPC # SwitchTx # Switch subsystem: message send. # end - fun init = ipc_context_init (Pointer(Pointer(Void))) : LibC::Int - fun deinit = ipc_context_deinit (Pointer(Void)) : Void + fun init = ipc_context_init (Void**) : LibC::Int + fun deinit = ipc_context_deinit (Void*) : Void + + # Connection functions. + # Context is allocated, ipcd is requested and the connection/initialisation is performed. + fun service_init = ipc_service_init (Void*, LibC::Int*, LibC::Char*, LibC::UInt16T) : LibC::Int + fun connect_service = ipc_connect_service(Void*, LibC::Int*, LibC::Char*, LibC::UInt16T) : LibC::Int + + fun wait = ipc_wait_event(Void*, Char*, LibC::UInt64T*, LibC::Int*, Char*, LibC::UInt64T*) : LibC::Int + + # Sending a message NOW. + # WARNING: unbuffered send do not wait the fd to become available. + fun write = ipc_write(Void*, LibC::Int, UInt8*, LibC::UInt64T) : LibC::Int + # Sending a message (will wait the fd to become available for IO operations). + fun schedule = ipc_schedule(Void*, LibC::Int, UInt8*, LibC::UInt64T) : LibC::Int + + fun read = ipc_read_fd (Void*, LibC::Int, UInt8*, LibC::UInt64T*); -# # Connection functions. -# # Context is allocated, ipcd is requested and the connection/initialisation is performed. -# fun service_init = ipc_service_init (Pointer(Void), LibC::Int*, LibC::Char*, LibC::UInt16) : LibC::Int -# fun connect_service = ipc_connect_service(Pointer(Void), LibC::Int*, LibC::Char*, LibC::UInt16) : LibC::Int -# # # Closing connections. # fun ipc_close(Pointer(Void), index : LibC::UInt64T) : LibC::Int # fun ipc_close_all(Pointer(Void)) : LibC::Int -# -# # Loop function. -# fun ipc_wait_event(Ctx*, Event*, LibC::Int*) : LibC::Int -# -# # Adding and removing file discriptors to read. -# fun ipc_add(Ctx*, Connection*, Pollfd*) : LibC::Int -# fun ipc_del(Ctx*, LibC::UInt) : LibC::Int -# fun ipc_add_fd(Ctx*, LibC::Int) : LibC::Int -# fun ipc_del_fd(Ctx*, LibC::Int) : LibC::Int -# -# # Sending a message (will wait the fd to become available for IO operations). -# fun ipc_write(Ctx*, Message*) : LibC::Int -# fun ipc_schedule(Pointer(Void), ) : LibC::Int -# -# # Sending a message NOW. -# # WARNING: unbuffered send do not wait the fd to become available. -# fun ipc_write_fd(Int32, Message*) : LibC::Int end # TODO: Write documentation for `Some::Crystal::App` @@ -49,5 +42,44 @@ module Some::Crystal::App # TODO: Put your code here ctx : Pointer(Void) = Pointer(Void).null LibIPC.init (pointerof(ctx)) + fd : Int32 = 0 + LibIPC.connect_service(ctx, pointerof(fd), "pong", 4) + pp! fd + LibIPC.write(ctx, fd, "Hello", 5) + + buflen : LibC::UInt64T = 10 + #buffer = uninitialized UInt8[10] + buffer = Array(UInt8).new(10, 88) + #buffer[0] = 'a' + #buffer[1] = 'b' + #buffer[2] = 'c' + #buffer[3] = 'd' + #buffer[4] = 'e' + #buffer[5] = 'f' + #pp! buffer[0] + #pp! buffer[1] + #pp! buffer[2] + #pp! buffer[3] + #pp! buffer[4] + #pp! buffer[5] + LibIPC.read(ctx, fd, buffer.to_unsafe, pointerof(buflen)) + pp! buflen + pp! buffer.size + buffer[buflen] = 0 + str = String.new(buffer.to_unsafe) + pp! str + + #received = String.build do |str| + # count = buflen + # while count > 0 + # str << buffer[buflen - count] + # count -= 1 + # end + #end + #pp! received + + #received = Slice.new(buffer.to_unsafe, buflen) + ##puts "Buffer is: [#{received}]" + LibIPC.deinit (ctx) end