aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine Villeret <avilleret@users.sourceforge.net>2013-09-03 07:53:52 +0000
committerAntoine Villeret <avilleret@users.sourceforge.net>2013-09-03 07:53:52 +0000
commit66339d10c0702db7d008d1249c6fb57a1992b65d (patch)
tree27ac2477f9f366590f66302dc8a06e5883ead3e1
parent37a835ccc37929ba46fe1ce2a19bc9dfcbbc81df (diff)
fix allocate fn on linux
fix size issue on windows svn path=/trunk/externals/share_mem/; revision=17201
-rw-r--r--shmem-help.pd235
-rw-r--r--shmem.c140
2 files changed, 190 insertions, 185 deletions
diff --git a/shmem-help.pd b/shmem-help.pd
index 64c3b8f..aedc4b1 100644
--- a/shmem-help.pd
+++ b/shmem-help.pd
@@ -1,124 +1,111 @@
-#N canvas 357 58 1176 549 10;
-#N canvas 1 89 450 300 (subpatch) 0;
-#X array array2 100 float 3;
-#A 0 -0.37143 -0.366668 -0.361906 -0.357144 -0.345716 -0.334287 -0.322858
--0.31143 -0.300001 -0.285715 -0.27143 -0.257144 -0.242858 -0.228572
--0.223377 -0.218183 -0.212988 -0.207793 -0.202598 -0.197403 -0.192208
--0.187014 -0.181819 -0.176624 -0.171429 -0.157143 -0.142858 -0.138776
--0.134694 -0.130613 -0.126531 -0.122449 -0.118368 -0.114286 -0.104082
--0.0938779 -0.0836738 -0.0734697 -0.0632655 -0.0530614 -0.0428573 -0.0428573
--0.0428573 -0.0428573 -0.0428573 -0.0428573 -0.0428573 -0.0428573 -0.0428573
--0.0428573 -0.0396827 -0.0365081 -0.0333335 -0.0301588 -0.0269842 -0.0238096
--0.020635 -0.0174604 -0.0142858 -0.0142858 -0.0142858 -0.0142858 -0.0142858
--0.0142858 -0.0142858 -0.0142858 -0.0142858 -0.0142858 -0.0142858 -0.0142858
--0.0142858 -0.0142858 -0.0142858 -0.0142858 -0.0142858 -0.0142858 -0.0142858
--0.0142858 -0.0142858 -0.0142858 -0.0107143 -0.00714288 -0.00357144
-0 0.00357144 0.00714288 0.0107143 0.0142858 0.0178572 0.0214286 0.0250001
-0.0285715 0.032143 0.0357144 0.0392859 0.0428573 0.0535716 0.0642859
-0.0750003 0.27143;
-#X coords 0 1 99 -1 200 140 1;
-#X restore 680 26 graph;
-#X msg 83 418 memset 0 1 1 1 1 1;
-#X text 215 414 write a list (or a float) to the shared memory : 1st
-value is index \, other are data to store;
-#X msg 52 343 memset 0 array1;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array array1 100 float 3;
-#A 0 0.714288 0.697405 0.680522 0.663639 0.646756 0.629872 0.612989
-0.596106 0.579223 0.56234 0.545456 0.528573 0.525398 0.522224 0.519049
-0.515875 0.5127 0.509525 0.506351 0.503176 0.500002 0.500002 0.500002
-0.500002 0.500002 0.500002 0.500002 0.492859 0.485716 0.478573 0.47143
-0.464287 0.457144 0.44762 0.438097 0.428573 0.422858 0.417144 0.41143
-0.405716 0.400001 0.400001 0.400001 0.400001 0.400001 0.400001 0.400001
-0.385715 0.37143 0.328572 0.300001 0.271429 0.257144 0.242858 0.2 0.171429
-0.15 0.128572 0.0714286 0.042857 0.0142855 -0.014286 -0.0571433 -0.100001
--0.142858 -0.178572 -0.214287 -0.250001 -0.285716 -0.333335 -0.380954
--0.428573 -0.471431 -0.514288 -0.557145 -0.64286 -0.728574 -0.814289
--0.871432 -0.900003 -0.907146 -0.914289 -0.928575 -0.942861 -0.950004
--0.957146 0.0107143 0.0142858 0.0178572 0.0214286 0.0250001 0.0285715
-0.032143 0.0357144 0.0392859 0.0428573 0.0535716 0.0642859 0.0750003
-0.27143;
-#X coords 0 1 99 -1 200 140 1;
-#X restore 475 26 graph;
-#X text 166 343 set shared memory from index 0 with array1;
-#X msg 68 365 memset 0 array1 50;
-#X text 196 365 set shared memory from index 0 with array1 from index
-50;
-#X text 162 505 1st argument : Identifiant of the memory segment;
-#X text 21 15 shmem - shared memory manipulation;
-#X text 22 37 The shmem object allow to use shared memory in Pd. It
-is useful for example to exchange array between two instances of Pd.
-Every shmem object can read and write to a shared memory segment that
-is identified by its Id.;
-#X text 21 95 When you create a shmem object \, it checks its Id. If
-the id is not used \, it allows a new segment \, otherwise it address
-the exisiting segment.;
-#X floatatom 614 418 5 0 0 0 - - -;
-#X text 685 443 read one float of the table send value to the outlet
-;
-#X msg 598 352 memdump 0 array2;
-#X text 567 274 READING MEMORY;
-#X floatatom 598 495 5 0 0 0 - - -;
-#X text 718 352 dump shared memory from index 0 to array2;
-#X text 162 521 2nd argument : size of the segment (number of float)
-;
-#X msg 614 443 memread \$1;
-#X msg 106 475 memclear;
-#X text 169 477 reset memory to 0;
-#X text 475 168 array1 and array 2 are size 100;
-#X msg 99 448 memset 50 5 5 5 1 1 0.1 0.2 0.3 0.4 0.5 0.6 0.7;
-#X text 21 272 WRITING INTO MEMORY;
-#X msg 608 374 memdump 0 array2 50;
-#X text 728 374 dump shared memory from index 0 to array2 from index
-50;
-#X text 768 394 dump shared memory from index 0 to array2 from index
-50 to index 60 (50 + 10);
-#X msg 46 321 memset array1 array1 array1;
-#X text 149 300 set array in to shared memory;
-#X text 223 321 set diferent array in to shared memory;
-#X msg 584 322 memdump array2 array2 array2;
-#X text 698 298 dump shared memory in an array;
-#X text 769 322 dump shared memory in many array;
-#X msg 78 391 memset 50 array1 0 25;
-#X text 219 388 set shared memory from index 50 with array1 from index
-0 to 25;
-#X msg 53 147 memset array_name [array_name];
-#X msg 71 187 memset src_offset list_of_float;
-#X msg 571 198 memdump array_name [array_name];
-#X msg 61 167 memset src_offset src_array_name [dest_offset [size]]
-;
-#X msg 583 221 memdump src_offset dest_array_name [dest_offset [size]]
-;
-#X msg 618 394 memdump 50 array2 0 10;
-#X obj 35 505 shmem 1214 250;
-#X obj 598 471 shmem 1214 250;
-#X obj 679 515 print status;
-#X text 763 512 send out the id of shared memory if allocation succeed
-\, -1 otherwise;
-#X text 18 213 CHANGE ID AND SIZE;
-#X msg 34 234 allocate 1234 1024;
-#X msg 158 235 allocate 0 12;
-#X obj 16 255 t a a;
-#X msg 568 301 memdump array2;
-#X msg 37 300 memset array1;
-#X connect 1 0 42 0;
-#X connect 3 0 42 0;
-#X connect 6 0 42 0;
-#X connect 12 0 19 0;
-#X connect 14 0 43 0;
-#X connect 19 0 43 0;
-#X connect 20 0 42 0;
-#X connect 23 0 42 0;
-#X connect 25 0 43 0;
-#X connect 28 0 42 0;
-#X connect 31 0 43 0;
-#X connect 34 0 42 0;
-#X connect 41 0 43 0;
-#X connect 43 0 16 0;
-#X connect 43 1 44 0;
-#X connect 47 0 49 0;
-#X connect 48 0 49 0;
-#X connect 49 0 42 0;
-#X connect 49 1 43 0;
-#X connect 50 0 43 0;
-#X connect 51 0 42 0;
+#N canvas 641 405 1176 549 10;
+#N canvas 1 89 450 300 (subpatch) 0;
+#X array array2 100 float 2;
+#X coords 0 1 99 -1 200 140 1 0 0;
+#X restore 680 26 graph;
+#X msg 83 418 memset 0 1 1 1 1 1;
+#X text 215 414 write a list (or a float) to the shared memory : 1st
+value is index \, other are data to store;
+#X msg 52 343 memset 0 array1;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array array1 100 float 3;
+#A 0 -0.457144 -0.485716 -0.514287 -0.52143 -0.528573 -0.538097 -0.54762
+-0.557144 -0.57143 -0.585716 -0.614287 -0.642858 -0.650001 -0.657144
+-0.67143 -0.685715 -0.700001 -0.714287 -0.728572 -0.757144 -0.757144
+-0.764287 -0.771429 -0.778572 -0.785715 -0.792858 -0.800001 -0.807144
+-0.814287 -0.819049 -0.82381 -0.828572 -0.833334 -0.838096 -0.842858
+-0.848572 -0.854286 -0.860001 -0.865715 -0.871429 -0.871429 -0.871429
+-0.871429 -0.871429 -0.871429 -0.877143 -0.882858 -0.888572 -0.894286
+-0.900001 -0.900001 -0.900001 -0.900001 -0.900001 -0.885715 -0.878572
+-0.871429 -0.864286 -0.857144 -0.857144 -0.857144 -0.857144 -0.857144
+-0.857144 -0.857144 -0.857144 -0.857144 -0.842858 -0.842858 -0.842858
+-0.842858 -0.842858 -0.842858 -0.828572 -0.814287 -0.814287 -0.814287
+-0.814287 -0.807144 -0.800001 -0.792858 -0.785715 -0.785715 -0.780953
+-0.776191 -0.771429 -0.764287 -0.757144 -0.742858 -0.742858 -0.742858
+-0.728572 -0.72143 -0.714287 -0.714287 -0.714287 -0.728572 -0.728572
+-0.728572 -0.771429;
+#X coords 0 1 99 -1 200 140 1;
+#X restore 475 26 graph;
+#X text 166 343 set shared memory from index 0 with array1;
+#X msg 68 365 memset 0 array1 50;
+#X text 196 365 set shared memory from index 0 with array1 from index
+50;
+#X text 162 505 1st argument : Identifiant of the memory segment;
+#X text 21 15 shmem - shared memory manipulation;
+#X text 22 37 The shmem object allow to use shared memory in Pd. It
+is useful for example to exchange array between two instances of Pd.
+Every shmem object can read and write to a shared memory segment that
+is identified by its Id.;
+#X text 21 95 When you create a shmem object \, it checks its Id. If
+the id is not used \, it allows a new segment \, otherwise it address
+the exisiting segment.;
+#X floatatom 614 418 5 0 0 0 - - -;
+#X text 685 443 read one float of the table send value to the outlet
+;
+#X msg 598 352 memdump 0 array2;
+#X text 567 274 READING MEMORY;
+#X floatatom 598 495 5 0 0 0 - - -;
+#X text 718 352 dump shared memory from index 0 to array2;
+#X text 162 521 2nd argument : size of the segment (number of float)
+;
+#X msg 614 443 memread \$1;
+#X msg 106 475 memclear;
+#X text 169 477 reset memory to 0;
+#X text 475 168 array1 and array 2 are size 100;
+#X msg 99 448 memset 50 5 5 5 1 1 0.1 0.2 0.3 0.4 0.5 0.6 0.7;
+#X text 21 272 WRITING INTO MEMORY;
+#X msg 608 374 memdump 0 array2 50;
+#X text 728 374 dump shared memory from index 0 to array2 from index
+50;
+#X text 768 394 dump shared memory from index 0 to array2 from index
+50 to index 60 (50 + 10);
+#X msg 46 321 memset array1 array1 array1;
+#X text 149 300 set array in to shared memory;
+#X text 223 321 set diferent array in to shared memory;
+#X msg 584 322 memdump array2 array2 array2;
+#X text 698 298 dump shared memory in an array;
+#X text 769 322 dump shared memory in many array;
+#X msg 78 391 memset 50 array1 0 25;
+#X text 219 388 set shared memory from index 50 with array1 from index
+0 to 25;
+#X msg 53 147 memset array_name [array_name];
+#X msg 71 187 memset src_offset list_of_float;
+#X msg 571 198 memdump array_name [array_name];
+#X msg 61 167 memset src_offset src_array_name [dest_offset [size]]
+;
+#X msg 583 221 memdump src_offset dest_array_name [dest_offset [size]]
+;
+#X msg 618 394 memdump 50 array2 0 10;
+#X obj 679 515 print status;
+#X text 763 512 send out the id of shared memory if allocation succeed
+\, -1 otherwise;
+#X text 18 213 CHANGE ID AND SIZE;
+#X msg 34 234 allocate 1234 1024;
+#X obj 16 255 t a a;
+#X msg 568 301 memdump array2;
+#X msg 37 300 memset array1;
+#X text 249 236 allocate <id> <size>;
+#X msg 158 235 allocate 1 100;
+#X obj 35 505 shmem 12234 250;
+#X obj 598 471 shmem 12234 250;
+#X connect 1 0 51 0;
+#X connect 3 0 51 0;
+#X connect 6 0 51 0;
+#X connect 12 0 19 0;
+#X connect 14 0 52 0;
+#X connect 19 0 52 0;
+#X connect 20 0 51 0;
+#X connect 23 0 51 0;
+#X connect 25 0 52 0;
+#X connect 28 0 51 0;
+#X connect 31 0 52 0;
+#X connect 34 0 51 0;
+#X connect 41 0 52 0;
+#X connect 45 0 46 0;
+#X connect 46 0 51 0;
+#X connect 46 1 52 0;
+#X connect 47 0 52 0;
+#X connect 48 0 51 0;
+#X connect 50 0 46 0;
+#X connect 52 0 16 0;
+#X connect 52 1 42 0;
diff --git a/shmem.c b/shmem.c
index d609360..f84cb60 100644
--- a/shmem.c
+++ b/shmem.c
@@ -203,68 +203,83 @@ void shmem_read(t_shmem *x, t_float index)
void shmem_allocate(t_shmem *x, t_float fId, t_float fSize)
{
- int id = (int) fId;
- x->segment_size = (int) fSize;
+ int id = (int) fId;
+ if ( id < 1 ){
+ error("id should be > 0"); // shmid 0 doesn't seem to work
+ return;
+ }
+
+ x->segment_size = (int) fSize;
#ifdef _WIN32
- if ( x->share_memory ) UnmapViewOfFile( x->share_memory );
- if ( x->m_MapFile ) CloseHandle( x->m_MapFile );
+ if ( x->share_memory ) UnmapViewOfFile( x->share_memory );
+ if ( x->m_MapFile ) CloseHandle( x->m_MapFile );
- sprintf(x->m_fileMappingName, "puredata-FileMappingObject_%d", id);
+ sprintf(x->m_fileMappingName, "puredata-FileMappingObject_%d", id);
- x->m_MapFile = CreateFileMapping(
- INVALID_HANDLE_VALUE, // use paging file
- NULL, // default security
- PAGE_READWRITE, // read/write access
- (x->segment_size & 0xFFFFFFFF00000000) >> 32, // maximum object size (high-order DWORD)
- x->segment_size & 0xFFFFFFFF, // maximum object size (low-order DWORD)
- x->m_fileMappingName); // name of mapping object
+ x->m_MapFile = CreateFileMapping(
+ INVALID_HANDLE_VALUE, // use paging file
+ NULL, // default security
+ PAGE_READWRITE, // read/write access
+ (x->segment_size & 0xFFFFFFFF00000000) >> 32, // maximum object size (high-order DWORD)
+ x->segment_size & 0xFFFFFFFF, // maximum object size (low-order DWORD)
+ x->m_fileMappingName); // name of mapping object
- if (x->m_MapFile == NULL)
- {
- error("Could not create file mapping object %s - error %ld.",x->m_fileMappingName, GetLastError());
- outlet_float(x->m_info_out, -1);
- return;
- }
+ if (x->m_MapFile == NULL)
+ {
+ error("Could not create file mapping object %s - error %ld.",x->m_fileMappingName, GetLastError());
+ outlet_float(x->m_info_out, -1);
+ return;
+ }
- x->share_memory = (t_float*) MapViewOfFile(x->m_MapFile, // handle to map object
- FILE_MAP_ALL_ACCESS, // read/write permission
- 0,
- 0,
- x->segment_size);
+ x->share_memory = (t_float*) MapViewOfFile(x->m_MapFile, // handle to map object
+ FILE_MAP_ALL_ACCESS, // read/write permission
+ 0,
+ 0,
+ sizeof(t_float)*x->segment_size);
- if ( !x->share_memory ){
- error("Could not get a view of file %s - error %ld",x->m_fileMappingName, GetLastError());
- outlet_float(x->m_info_out, -1);
- return;
- } else {
- verbose(0,"File mapping object %s successfully created.",x->m_fileMappingName);
- }
+ if ( !x->share_memory ){
+ error("Could not get a view of file %s - error %ld",x->m_fileMappingName, GetLastError());
+ outlet_float(x->m_info_out, -1);
+ return;
+ } else {
+ verbose(0,"File mapping object %s successfully created.",x->m_fileMappingName);
+ }
-#else
+#else // for LINUX / UNIX
- struct shmid_ds shmbuffer;
+ struct shmid_ds shmbuffer;
+ if (x->share_memory) {
+ shmdt (x->share_memory);
+ x->share_memory=NULL;
+ }
+ if (x->segment_id != -1) {
+ shmctl (x->segment_id, IPC_RMID, 0);
+ x->segment_id = -1;
+ }
- x->segment_id = shmget (id, sizeof(t_float)*x->segment_size,
- IPC_CREAT | S_IRUSR | S_IWUSR | S_IROTH | S_IWOTH);
- if(x->segment_id>0) {
- x->share_memory = (t_float*) shmat (x->segment_id, 0, 0);
- // post("shmem memory attached at address %p\n", x->share_memory);
+ x->segment_id = shmget (id, sizeof(t_float)*x->segment_size,
+ IPC_CREAT | S_IRUSR | S_IWUSR | S_IROTH | S_IWOTH); // AV it should safer to use ftok() to generate an id
+
+ if(x->segment_id != -1) { // 0 could be a valid value, -1 means error
+ x->share_memory = (t_float*) shmat (x->segment_id, 0, 0);
+ // post("shmem memory attached at address %p\n", x->share_memory);
- shmctl (x->segment_id, IPC_STAT, &shmbuffer);
- // post ("segment size: %d\n", shmbuffer.shm_segsz);
+ shmctl (x->segment_id, IPC_STAT, &shmbuffer);
+ // post ("segment size: %d\n", shmbuffer.shm_segsz);
- if ((int)shmbuffer.shm_segsz < (int)sizeof(t_float)*x->segment_size) {
- // there was a problem, set object meme size to 0
- error("could not allocate shmem memory Id : %d, size %d", (int)id, x->segment_size );
- x->segment_size = 0;
- outlet_float(x->m_info_out, -1);
- }
- }
- else {
- error("could not allocate shmem memory Id : %d, size %d", (int)id, x->segment_size );
- x->segment_size = 0;
- outlet_float(x->m_info_out, -1);
- }
+ if ((int)shmbuffer.shm_segsz < (int)sizeof(t_float)*x->segment_size) {
+ // there was a problem, set object meme size to 0
+ error("could not allocate shmem memory Id : %d, size %d", (int)id, x->segment_size );
+ x->segment_size = 0;
+ x->share_memory=NULL;
+ outlet_float(x->m_info_out, -1);
+ }
+ }
+ else {
+ error("could not allocate shmem memory Id : %d, size %d", (int)id, x->segment_size );
+ x->segment_size = 0;
+ outlet_float(x->m_info_out, -1);
+ }
#endif // _WIN32
outlet_float(x->m_info_out, id);
}
@@ -281,22 +296,25 @@ t_class *shmem_class;
*/
void *shmem_new( t_floatarg id, t_floatarg size)
{
- // post ("id, size: %f, %f", id, size);
- t_shmem *x = (t_shmem *)pd_new(shmem_class);
-
- x->share_memory = NULL;
+ // post ("id, size: %f, %f", id, size);
+ t_shmem *x = (t_shmem *)pd_new(shmem_class);
+
+#ifndef _WIN32
+ x->segment_id=-1;
+#endif
+ x->share_memory = NULL;
- outlet_new(&x->x_obj, 0);
- x->m_info_out = outlet_new(&x->x_obj, 0);
- shmem_allocate(x, id, size);
- return (void *)x;
+ outlet_new(&x->x_obj, 0);
+ x->m_info_out = outlet_new(&x->x_obj, 0);
+ shmem_allocate(x, id, size);
+ return (void *)x;
}
void shmem_free(t_shmem *x)
{
#ifdef _WIN32
- if ( x->share_memory ) UnmapViewOfFile( x->share_memory );
- if ( x->m_MapFile ) CloseHandle( x->m_MapFile );
+ if ( x->share_memory ) UnmapViewOfFile( x->share_memory );
+ if ( x->m_MapFile ) CloseHandle( x->m_MapFile );
#else
shmdt (x->share_memory);
shmctl (x->segment_id, IPC_RMID, 0);