On Sat, 2009-07-11 at 13:35 +0200, David Eriksson wrote:
> [Sorry for dupes of this.]
> 
> Hi,
> 
> First of all, it's wonderful to hear that you make good use of SynCE. I
> would really appreciate if you are able share some more about the
> context you use SynCE in, either to the list or privately. (It's great
> to see one's kids grow up
> 
> I think that you should model the new RAPI interface after the Microsoft
> RAPI2 Interface (IRAPIDevice, IRAPISession, etc):
> 
> http://msdn.microsoft.com/en-us/library/aa922133.aspx
> 
> MS buils these interfaces on top of the Component Object Model (COM) so
> C++ would be a natural fit, but if you implement it in C for easier Ruby
> bindings that's fine. Just add "this" (or "self" :-) as first parameter.
> (I would have implemented the original librapi2 in C++ 

I'm glad you didn't, I probably wouldn't have bothered fiddling with
it :)

> if it wasn't
> because I hoped that language bindings would be easier with a C
> interface.)
> 
> In the C interface I suggest that you do like this, or something close
> that makes it easy for the Ruby bindings:
> 
> HRESULT RAPIDevice_CreateSession(
>   RAPIDevice* self;
>   RAPISession** ppISession
> ); 
> 
> BOOL RAPISession_CeCopyFile(
>   RAPISession* self,
>   LPCWSTR lpExistingFileName, 
>   LPCWSTR lpNewFileName, 
>   BOOL bFailIfExists 
> );
> 

David, this is a magnificent idea ! And it's relatively easy to
implement I think.

David (Richardson), if this sounds of interest, here's how I would see
this working.

Currently all rapi calls start in rapi_indirection.c, where the current
context is fetched, and used to call the appropriate function, in rapi/
or rapi2 subdirs, through the rapi_ops struct. Initially we change the
"real" functions in these subdirs to accept the context as the first
parameter, which we pass through from the call in rapi_indirection.c. At
this point the original API is intact, but we have a working body of
functions that accept any context we pass.

Now it should be possible to implement a new public API in the manner
David shows, that can call these functions using the context from the
RapiSession pointer we pass. Does that make sense ?

I think I'm going to give this a go, though I want to do another release
first, so it won't be straight away.

> Locking (per session)  should really be done inside the RAPI calls, not
> outside.
> 

Yes, I think each context needs internal locking, but I'm not sure how
this should be done. Can we just use pthread mutexes ?

> Reference counting could be implemented just like AddRef and Release
> from IUnknown in COM... :-)
> 
> 
> 
> Best regards,
> 
> David Eriksson, http://www.divideandconquer.se/
> 
> 
> On Fri, 2009-07-10 at 17:06 -0700, David Richardson wrote:
> > I'm using librapi for some really cool testing framework stuff at
> > Flexilis.  I'm really trying to push the limits of the library.  I've
> > wrapped librapi in ruby using Ruby::DL but currently I have to mutex
> > on any RAPI call.  I'd really like to only have to mutex per-device.
> > Ruby only uses green threads so the existing thread safe stuff isn't
> > going to help me, I believe.  I want to run tests on hundreds of
> > devices in parallel.
> > 
> > What I want to do is create alternative wrappers for each RAPI
> > function where I pass the context in as the last parameter, rather
> > than specifying it ahead of time with .  I tried some initial
> > experimentation with this yesterday, but didn't have much luck.
> > Before I dive too deep into it, I wanted to make my proposal and hear
> > any comments you have.  Specifically I'm concerned about how the
> > contexts work and when/how they become invalidated.
> > 
> > Serially I will create each connection (rapi_connection_from_name),
> > select it (rapi_connection_select), initialize it (CeRapiInit) and
> > store the current context (get_current_context).  Then in parallel I
> > will call modified RAPI functions on hundreds of devices that take the
> > context in as a paramater.  
> > 
> > I notice that the act of selecting a connection unref's the previously
> > selected connection and destroys it (since this was the only
> > reference).  Is it sufficient for me to just store a reference to each
> > context and call rapi_context_ref (and unref when I'm done)?  Is there
> > anything else that would invalidate the previous context?
> > 
> > I'll hopefully be experimenting with this sometime next week.  Is this
> > a change that others would be interested in contributing toward
> > librapi's trunk?   Do you have a suggestion of a better way to go
> > about this?  Is there maybe some existing functionality that I'm
> > missing that already allows this?
> > 
> > Thanks!
> > -David Richardson
> > Flexilis Mobile Security
> 
> 
> 
> 
> ------------------------------------------------------------------------------
> Enter the BlackBerry Developer Challenge  
> This is your chance to win up to $100,000 in prizes! For a limited time, 
> vendors submitting new applications to BlackBerry App World(TM) will have
> the opportunity to enter the BlackBerry Developer Challenge. See full prize  
> details at: http://p.sf.net/sfu/Challenge
> _______________________________________________
> SynCE-Devel mailing list
> SynCE-Devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/synce-devel

Attachment: signature.asc
Description: This is a digitally signed message part

------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
SynCE-Devel mailing list
SynCE-Devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synce-devel

Reply via email to