allocate and obtain shared memory

This commit is contained in:
pigeatgarlic 2024-04-04 13:36:30 -07:00
parent 9af6e42949
commit 43cc8acf12
8 changed files with 81 additions and 43 deletions

View File

@ -87,9 +87,35 @@ deinit_shared_memory() {
shared_memory_object::remove(random.c_str());
}
EXPORTS(SharedMemory*)
obtain_shared_memory(char* rand){
std::vector<std::string> strings;
std::istringstream f(rand);
std::string s;
while (getline(f, s, ';')) {
strings.push_back(s);
}
if(strings.size() != 2)
return NULL;
std::stringstream h;
std::stringstream k;
long long handle; h << strings.at(1); h >> handle;
std::string key; k << strings.at(0); k >> key;
//Open managed segment
static managed_shared_memory segment(open_only, key.c_str());
//Get buffer local address from handle
SharedMemory* memory = (SharedMemory*)segment.get_address_from_handle(handle);
return memory;
}
EXPORTS(SharedMemory*)
allocate_shared_memory(char* rand,long long* handle) {
allocate_shared_memory(char* rand) {
//Allocate a portion of the segment (raw memory)
std::size_t free_memory = segment.get_free_memory();
SharedMemory* memory = (SharedMemory*)segment.allocate(sizeof(SharedMemory));
@ -102,9 +128,10 @@ allocate_shared_memory(char* rand,long long* handle) {
//An handle from the base address can identify any byte of the shared
//memory segment even if it is mapped in different base addresses
managed_shared_memory::handle_t hnd = segment.get_handle_from_address((void*)memory);
*handle = hnd;
memcpy(rand,random.c_str(),random.size());
std::stringstream s; s << random << ";" << hnd;
std::string c; s >> c;
memcpy(rand,c.c_str(),c.size());
return memory;
}

View File

@ -61,7 +61,8 @@ typedef struct {
}SharedMemory;
EXPORT(SharedMemory*) allocate_shared_memory(char* rand,long long* handle) ;
EXPORT(SharedMemory*) allocate_shared_memory(char* rand) ;
EXPORT(SharedMemory*) obtain_shared_memory(char* rand) ;
EXPORT(void) lock_shared_memory(SharedMemory* memory);
EXPORT(void) unlock_shared_memory(SharedMemory* memory);
EXPORT(void) free_shared_memory(SharedMemory* buffer);

View File

@ -122,7 +122,7 @@ func copyAndCapture(r io.Reader) {
}
}
func Start() {
func main() {
mod, err := syscall.LoadDLL("libparent.dll")
if err != nil {
panic(err)
@ -133,6 +133,10 @@ func Start() {
}
defer deinit.Call()
obtain, err := mod.FindProc("obtain_shared_memory")
if err != nil {
panic(err)
}
proc, err := mod.FindProc("allocate_shared_memory")
if err != nil {
panic(err)
@ -147,18 +151,24 @@ func Start() {
}
buffer := make([]byte, 128)
handle := C.longlong(0)
ptr, _, err := proc.Call(
_, _, err = proc.Call(
uintptr(unsafe.Pointer(&buffer[0])),
uintptr(unsafe.Pointer(&handle)))
)
if !errors.Is(err, windows.ERROR_SUCCESS) {
panic(err)
}
memory := (*C.SharedMemory)(unsafe.Pointer(ptr))
pointer,_,err := obtain.Call(
uintptr(unsafe.Pointer(&buffer[0])),
)
if !errors.Is(err, windows.ERROR_SUCCESS) {
panic(err)
}
memory := (*C.SharedMemory)(unsafe.Pointer(pointer))
handle_video := func() {
lock.Call(ptr)
defer unlock.Call(ptr)
lock.Call(pointer)
defer unlock.Call(pointer)
block := memory.video[memory.video_order[0]]
fmt.Printf("video buffer %d\n", block.size)
@ -171,8 +181,8 @@ func Start() {
}
handle_audio := func() {
lock.Call(ptr)
defer unlock.Call(ptr)
lock.Call(pointer)
defer unlock.Call(pointer)
block := memory.audio[memory.audio_order[0]]
fmt.Printf("audio buffer %d\n", block.size)
@ -197,9 +207,9 @@ func Start() {
}
}()
arg1 := fmt.Sprintf("%d", handle)
arg2 := byteSliceToString(buffer)
cmd := exec.Command("E:\\thinkmay\\worker\\sunshine\\sunshine.exe", arg1, arg2)
cmd := exec.Command("E:\\thinkmay\\worker\\sunshine\\build\\sunshine.exe",
byteSliceToString(buffer),
)
stdoutIn, _ := cmd.StdoutPipe()
stderrIn, _ := cmd.StderrPipe()

View File

@ -1,7 +0,0 @@
package main
import "testing"
func TestStart(t *testing.T) {
Start()
}

View File

@ -9,6 +9,7 @@
#include <iostream>
#include <boost/interprocess/sync/scoped_lock.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
using namespace boost::interprocess;
using namespace std::literals;
@ -16,17 +17,31 @@ using namespace std::literals;
void
init_shared_memory(SharedMemory* memory){
for (int i = 0; i < QUEUE_SIZE; i++) {
memory->audio_order[i] = -1;
memory->video_order[i] = -1;
SharedMemory* obtain_shared_memory(char* rand) {
std::vector<std::string> strings;
std::istringstream f(rand);
std::string s;
while (getline(f, s, ';')) {
strings.push_back(s);
}
for (int i = 0; i < EventType::EVENT_TYPE_MAX; i++)
memory->events[i].read = 1;
}
if(strings.size() != 2)
return NULL;
std::stringstream h;
std::stringstream k;
long long handle; h << strings.at(1); h >> handle;
std::string key; k << strings.at(0); k >> key;
//Open managed segment
static managed_shared_memory segment(open_only, key.c_str());
//Get buffer local address from handle
SharedMemory* memory = (SharedMemory*)segment.get_address_from_handle(handle);
return memory;
}
int queue_size(int* queue) {
int i = 0;

View File

@ -64,8 +64,8 @@ typedef struct {
interprocess_mutex lock;
}SharedMemory;
void
init_shared_memory(SharedMemory* memory);
SharedMemory*
obtain_shared_memory(char* key);
void
push_audio_packet(SharedMemory* memory, void* data, int size);

View File

@ -145,16 +145,8 @@ main(int argc, char *argv[]) {
BOOST_LOG(error) << "Video failed to find working encoder"sv;
}
managed_shared_memory::handle_t handle = 0;
std::stringstream s; s << argv[1]; s >> handle;
//Open managed segment
managed_shared_memory segment(open_only, argv[2]);
//Get buffer local address from handle
SharedMemory* memory = (SharedMemory*)segment.get_address_from_handle(handle);
SharedMemory* memory = obtain_shared_memory(argv[1]);
auto video_capture = std::thread{[&](){
video::capture(mail::man,video::config_t{

View File

@ -243,7 +243,7 @@ namespace platf::dxgi {
return true;
}
std::string cmd = "tools\\ddprobe.exe";
std::string cmd = "ddprobe.exe";
// We start at 1 because 0 is automatic selection which can be overridden by
// the GPU driver control panel options. Since ddprobe.exe can have different