If the headers are supposed to be parsed and then readonly, then the class
can be made immutable? Don't know how much work that would entail.

To minimize synch overhead, I think you can assign the array and nkeys to
locals inside a synch region and then do the copying outside of it.

Sent from my phone
On May 13, 2013 10:43 AM, "Michael McMahon" <michael.x.mcma...@oracle.com>
wrote:

>  Okay, adding or removing elements would do that (though it won't happen
> in practice)
> as opposed to reset(). So, I guess it's better practice to make it
> synchronized.
>
> Thanks
> Michael.
>
> On 13/05/13 15:19, Vitaly Davidovich wrote:
>
> If the array or nkeys is modified while getHeaders is running, you can get
> NPE or ArrayIndexOutOfBoundsException.  If you synchronize, the method
> returns some list of headers, and it's true that as soon as it returns some
> other thread can mutate the headers and thus the returned list isn't
> "in-sync" with current headers, but there's no exception.
>
> Sent from my phone
> On May 13, 2013 9:45 AM, "Michael McMahon" <michael.x.mcma...@oracle.com>
> wrote:
>
>>  On 13/05/13 14:12, Vitaly Davidovich wrote:
>>
>> I get what you're saying about before/after, but the difference would be
>> that if it's called during then you get an exception purely due to missing
>> synchronization; in the before/after case, caller may observe "stale"
>> entries but that's fine, as you say.
>>
>>
>> How would that be? The only effect of synchronization is to ensure that
>> the other call
>> occurs before or after (so to speak).
>>
>>  Maybe headers aren't reset in practice, but this code looks suspect to
>> someone reading it. :)
>>
>>
>> Right, we shouldn't be depending on caller behavior, but I still don't
>> see a problem to be fixed.
>>
>> Michael
>>
>>  Sent from my phone
>> On May 13, 2013 9:05 AM, "Michael McMahon" <michael.x.mcma...@oracle.com>
>> wrote:
>>
>>>  Hi Vitali,
>>>
>>> I was going to switch to use Arrays.asList() as you and Alan suggested.
>>> So getHeaderNames() would look like:
>>>
>>>     public List<String> getHeaderNames() {
>>>         return Arrays.asList(keys);
>>>     }
>>>
>>> So, it turns out synchronizing  nkeys and keys is no longer necessary.
>>> It's true that reset() could be called during the call. But, it could
>>> (in theory) be called
>>> before or after either. In practice that won't happen, since the request
>>> headers
>>> aren't ever reset.
>>>
>>> Michael
>>>
>>>
>>>
>>> On 13/05/13 13:36, Vitaly Davidovich wrote:
>>>
>>> Actually, local may not work since getHeaders uses nkeys as well - can
>>> run into AIOBE.  Probably best to just synchronize given current
>>> implementation.
>>>
>>> Sent from my phone
>>> On May 13, 2013 8:30 AM, "Vitaly Davidovich" <vita...@gmail.com> wrote:
>>>
>>>> Hi Michael,
>>>>
>>>> On the synchronized issue, I think you do need it; if someone, e.g.,
>>>> calls reset() while this method is running, you'll get NPE.  Maybe pull the
>>>> keys array into a local then and iterate over the local instead?
>>>>
>>>> Also, why LinkedList instead of ArrayList(or Arrays.asList, as Alan
>>>> mentioned, although maybe caller is expected to modify the returned list)?
>>>>
>>>> Thanks
>>>>
>>>> Sent from my phone
>>>> On May 13, 2013 6:42 AM, "Michael McMahon" <
>>>> michael.x.mcma...@oracle.com> wrote:
>>>>
>>>>> Thanks for the review. On the javadoc comments, there are a couple
>>>>> of small spec changes that will probably happen after feature freeze
>>>>> anyway.
>>>>> So, that might be the best time to address the other javadoc issues.
>>>>>
>>>>> I agree with your other comments. On the synchronized method in
>>>>> MessageHeader,
>>>>> I don't believe it needs to be synchronized since the method is not
>>>>> relying on
>>>>> consistency between object fields, and the returned object can be
>>>>> modified before, during or after the method is called anyway.
>>>>>
>>>>> Michael
>>>>>
>>>>> On 12/05/13 08:13, Alan Bateman wrote:
>>>>>
>>>>>> On 10/05/2013 12:34, Michael McMahon wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> This is the webrev for the HttpURLPermission addition.
>>>>>>> As well as the new permission class, the change
>>>>>>> includes the use of the permission in java.net.HttpURLConnection.
>>>>>>>
>>>>>>> The code basically checks for a HttpURLPermission in plainConnect(),
>>>>>>> getInputStream() and getOutputStream() for the request and if
>>>>>>> the caller has permission the request is executed in a doPrivileged()
>>>>>>> block. When the limited doPrivileged feature is integrated, I will
>>>>>>> change the doPrivileged() call to limit the privilege elevation to a
>>>>>>> single
>>>>>>> SocketPermission (as shown in the code comments).
>>>>>>>
>>>>>>> The webrev is at
>>>>>>> http://cr.openjdk.java.net/~michaelm/8010464/webrev.1/
>>>>>>>
>>>>>> A partial review, focusing mostly on the spec as we've been through a
>>>>>> few rounds on that part already. Overall I think the javadoc looks quite
>>>>>> good. I realize someone suggested using lowercase "url" in the javadoc 
>>>>>> but
>>>>>> as the usage is as an acronym then it might be clearer if it were in
>>>>>> uppercase, maybe "URL string" to avoid any confusion with java.net.URL.
>>>>>>
>>>>>> I assume you'll add a copyright header to HttpURLPermission before
>>>>>> pushing this.
>>>>>>
>>>>>> A minor comment on the javadoc tags is that you probably should use
>>>>>> @throws instead of @exception.
>>>>>>
>>>>>> At a high-level it would be nice if the fields were final but I guess
>>>>>> the parsing of actions and being serialized complicates this.
>>>>>>
>>>>>> setURI - this parses the URI rather than "sets" it so maybe it should
>>>>>> be renamed. If you use URI.create then it would avoid needing to catch 
>>>>>> the
>>>>>> URISyntaxException.
>>>>>>
>>>>>> normalizeMethods/normalizeHeaders- I assume these could use an
>>>>>> ArrayList.
>>>>>>
>>>>>> HttpURLConnection - "if a security manager is installed", should this
>>>>>> be "set"?
>>>>>>
>>>>>> MessageHeader - some of the methods are synchronized, some are not. I
>>>>>> can't quite tell if getHeaderNames needs to be synchronized. Also is 
>>>>>> there
>>>>>> any reason why this can't use Arrays.asList?
>>>>>>
>>>>>> HttpURLConnection.setRequestMethod - "connection being open" ->
>>>>>> "connect in progress"?
>>>>>>
>>>>>> That's all I have for now but I think there is further review work
>>>>>> required on HttpURLConnection as some of that is tricky.
>>>>>>
>>>>>> -Alan.
>>>>>>
>>>>>
>>>>>
>>>
>>
>

Reply via email to